デバッグする方法、SQL Serverの例外、操作が完了する前にタイムアウト時間が経過した、またはサーバーが応答していない

sql sqlbulkcopy sql-server

質問

SqlBulkCopyを使用してSQL Server 2014に大きなファイル( SqlBulkCopy GB、4億行)をSqlBulkCopyます。

私の一括コピーサイズは10kラインであり、タイムアウトは1時間です。ファイル全体を格納するか、エラーが発生した場合にロールバックしたいので、ファイル全体が単一のトランザクション内にあります。この表には3つの索引(1つの一意のクラスター索引と他の2つは非クラスター索引)があります。

時々私はこの例外を得る:

System.Data.SqlClient.SqlException(0x80131904):タイムアウトが切れています。操作が完了する前にタイムアウト時間が経過したか、サーバーが応答していません。

System.ComponentModel.Win32Exception(0x80004005):待機操作がタイムアウトしました

System.Data.SqlClient.TdsParserStateObjectのSystem.Data.SqlClient.SqlInternalConnection.OnError(SqlException例外、Boolean breakConnection、Action 1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync() at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket() at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer() at System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte& value) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlBulkCopy.RunParser(BulkCopySimpleResultSet bulkCopyHandler) at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsyncContinuedOnSuccess(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource 1 source)の1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync() at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket() at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer() at System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte& value) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlBulkCopy.RunParser(BulkCopySimpleResultSet bulkCopyHandler) at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsyncContinuedOnSuccess(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource )。 SqlBulkCopy.CopyBatchesAsyncContinued(BulkCopySimpleResultSet internalResults、文字列updateBulkCommandText、CancellationToken CTS、TaskCompletionSource 1 source) at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsync(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource System.Data.SqlClient.SqlBulkCopyで1ソース)。 WriteToServerInternalRestContinuedAsync(BulkCopySimpleResultSet internalResults、CancellationToken cts、TaskCompletionSource 1 source) at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestAsync(CancellationToken cts, TaskCompletionSource 1 source)at Syst System.Data.SqlClient.SqlBulkCopy.WriteToServer(IDataReaderリーダー)のSystem.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerAsync(Int32 columnCount、CancellationToken ctoken)のem.Data.SqlClient.SqlBulkCopy.WriteToServerInternalAsync(CancellationToken ctoken)

例外が発生した場合は、トランザクション全体をロールバックしますが、ロールバックしようとするともう一度例外が発生します。なぜ私のコードは接続/トランザクションをどこでも閉じないので、 SqlTransactionが使用可能な状態にない理由を理解できませんでした。

System.InvalidOperationException:このSqlTransactionが完了しました。もはや使用できなくなります。

私はある程度までデバッグしましたが、SSMSではオープンなトランザクションがあることがわかります

select @@TRANCOUNT  ==> this gives "0" (I didn't understand why)

dbcc opentran ==> this gives me a open transaction

Oldest active transaction:
    SPID (server process ID): 58
    UID (user ID) : -1
    Name          : user_transaction
    LSN           : (159:2843368:1)
    Start time    : Dec 30 2014 11:20:13:903PM
    SID           : 0x0105000000000005150000005d28f57fd53ad8354354e02ae9881a00
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

次に、このSQLスクリプトを使って、私はそれが線上で立ち往生していることを理解しました

insert bulk dbo.#mytablename#

実行中の状態で、例外をスローした時刻 - 1時間(バルク・コピー・タイムアウト)と正確に一致するタイムスタンプ。しかし、私はなぜSQL Serverがここにこだまれたのか、それがなぜ時間がかかるのか理解できませんでした。これをさらにデバッグする方法はありますか?

SELECT 
   r.[session_id],
   c.[client_net_address],
   s.[host_name],
   c.[connect_time],
   [request_start_time] = s.[last_request_start_time],
   [current_time] = CURRENT_TIMESTAMP,
   r.[percent_complete],
   [estimated_finish_time] = DATEADD
       (
           MILLISECOND,
           r.[estimated_completion_time], 
           CURRENT_TIMESTAMP
       ),
   current_command = SUBSTRING
       (
           t.[text],
           r.[statement_start_offset]/2,
           COALESCE(NULLIF(r.[statement_end_offset], -1)/2, 2147483647)
       ),
   module = COALESCE(QUOTENAME(OBJECT_SCHEMA_NAME(t.[objectid], t.[dbid])) 
       + '.' + QUOTENAME(OBJECT_NAME(t.[objectid], t.[dbid])), '<ad hoc>'),
   [status] = UPPER(s.[status])
 FROM
     sys.dm_exec_connections AS c
 INNER JOIN
     sys.dm_exec_sessions AS s
     ON c.session_id = s.session_id
 LEFT OUTER JOIN
     sys.dm_exec_requests AS r
     ON r.[session_id] = s.[session_id]
 OUTER APPLY
     sys.dm_exec_sql_text(r.[sql_handle]) AS t
 WHERE
     c.session_id = 58;

人気のある回答

バルクロードが完了するまでに1時間以上かかるためタイムアウトしましたMSDNによると 、タイムアウト設定は、

操作がタイムアウトするまでに完了するまでの秒数。

25GBのファイルがデータベースに読み込まれるのに1時間以上かかる場合がありますので、完了するのに十分な時間があるようにタイムアウト値を高く設定してみてください。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ