SQL Server 2008 R2 的可重试 SQLBulkCopy

Posted

技术标签:

【中文标题】SQL Server 2008 R2 的可重试 SQLBulkCopy【英文标题】:Retryable SQLBulkCopy for SQL Server 2008 R2 【发布时间】:2017-01-05 01:03:16 【问题描述】:

我基本上来自数据库背景和 .net 的新手。如果我的问题听起来很愚蠢,请多多包涵。

我在代码中使用 SqlBulkCopy 将数据从一个 SQL Server 传输到另一个。但由于网络问题,它经常失败。为了避免这种情况,我打算做两件事

    减少批量大小(从 5000 到 1000)并增加超时(从 3 分钟到 1 分钟)

    实现重试逻辑

我的问题是

    实现重试的最佳方式是什么,即在表级别或批处理级别(如果可能的话)? 我在这里找到了一些用于弹性 SQL Azure 的框架:https://msdn.microsoft.com/en-us/library/hh680934(v=pandp.50).aspx SQL Server 2008 R2 有类似的东西吗?

我正在使用的示例代码:

  private void BulkCopyTable(string schemaName, string tableName)
    using (var reader = srcConnection.ExecuteReader($"select * from [SourceDBName].[schemaName].[tableName]"))
            
                const SqlBulkCopyOptions bulkCopyOptions = SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.FireTriggers |
                                                           SqlBulkCopyOptions.KeepNulls | 
                                                           SqlBulkCopyOptions.KeepIdentity;

                using (var bcp = new SqlBulkCopy(dstConnection.ConnectionString, bulkCopyOptions))
                
                    const int threeMinutes = 60*3;
                    bcp.BulkCopyTimeout = threeMinutes; //Timeout is for a single batch
                    bcp.BatchSize = 5000;
                    bcp.DestinationTableName = $"[DestinationDB].[schemaName].[tableName]";
                    bcp.EnableStreaming = true;
                    foreach (var col in table.Columns.Cast<Column>().Where(c => !c.Computed))
                    
                        bcp.ColumnMappings.Add(col.Name, col.Name);
                    
                    bcp.WriteToServer(reader);
                
            
        

【问题讨论】:

显示一些您正在执行 SqlBulkCopy 的 C# 代码。 @SarveshMishra,用代码更新了描述。 【参考方案1】:

一个简单的方法是:

    自行实施批次。这会导致效率低下,因为SqlBulkCopy 需要为每个WriteToServer 调用查询元数据。所以不要让批次太小。实验。 插入一个临时表(不是#temp 表,而是一个持久表,这样您就可以断开连接并继续)。 然后,执行insert...select 作为将行从临时表移动到实际表的最后一步。

这种舞蹈将工作分成可重试的批次,但就像是一个事务一样。

如果您不需要原子性,可以将其留在步骤 (1)。

【讨论】:

以上是关于SQL Server 2008 R2 的可重试 SQLBulkCopy的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008 R2 / s-s-rS 2008:服务水平报告创建

SQL Server 2008 R2 Express 的分析服务

获取每个月的第一个日期 SQL Server 2008 R2

sql server 2008安装出错,试图执行未经授权的操作。

sql server 2008安装出错,试图执行未经授权的操作。

windows server 2008 r2 如何安装 mysql 5.7.9