【问题标题】:Timeout on SqlBulkCopy in AzureAzure 中的 SqlBulkCopy 超时
【发布时间】:2014-05-09 16:40:34
【问题描述】:

Azure 中的 SqlBulkCopy 存在问题。

上下文如下:我们有一个大约有 1000 万行的表。每行大约有 15 列。

我们正在将这些数据迁移到我们的新模型中,这需要拆分数据,使 1 行 15 列变为 15 行。

它在一开始就完美运行。目标表现在包含 17 767 235 行,运行速度非常快。

此时,它开始抛出异常。

我做了一些修改以增加超时并使用批处理,但它似乎完全被阻止了。

这是原来的例外:

Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
The statement has been terminated.; TraceSource 'WaWorkerHost.exe' event Services.DataMigration.Edmi_IN_0   5/9/2014 2:44 PM    2   1508    280

      at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   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)
   at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsyncContinued(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsync(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestContinuedAsync(BulkCopySimpleResultSet internalResults, CancellationToken cts, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestAsync(CancellationToken cts, TaskCompletionSource`1 source)
   at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalAsync(CancellationToken ctoken)
   at System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerAsync(Int32 columnCount, CancellationToken ctoken)
   at System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table, DataRowState rowState)

【问题讨论】:

    标签: c# azure azure-sql-database azure-worker-roles sqlbulkcopy


    【解决方案1】:

    SQL Azure 非常擅长保护自己。这会导致节流甚至断开连接。具有大量数据的标准批量复制技术通常会失败。我强烈建议您阅读 Alexandre Brisebois 关于 Azure 大容量复制技术的博文:

    http://alexandrebrisebois.wordpress.com/2013/02/16/using-sqlbulkcopy-to-insert-massive-amounts-of-data-into-windows-azure-sql-database/

    【讨论】:

    • 实际上我现在在我所说的大表上有 121.021.968 条记录...我认为这是插入速度极慢的主要原因。
    • 是的,在数百万条记录中,我不得不调整批量大小。这在很大程度上与我使用的繁重索引有关。我还尝试写入可以在写入过程中锁定的只写表。然后我分块合并到读取表中。它允许我以两种不同的速度推送数据。
    猜你喜欢
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多