SQL Server中避免触发镜像SUSPEND的N种方法

 更新时间:2016年01月22日 15:06:33   投稿:lijiao  
这篇文章主要介绍了SQL Server中避免触发镜像SUSPEND的N种方法,需要的朋友可以参考下

背景:
我们在使用数据库的过程中,很多时候要追求性能,特别在处理大批量数据的时候更希望快速处理。那么对SQL SERVER而言,数据库实现大批量插入的优化方案,这里特别介绍通过大容量插入的一种方式。
基本原理:
简单恢复模式按最小方式记录大多数大容量操作,对于完整恢复模式下的数据库,大容量导入期间执行的所有行插入操作被完整地记录到事务日志中。如果数据导入量较大,会导致迅速填满事务日志。对于大容量导入操作,按最小方式记录比完整记录更有效,并减少了大容量导入操作填满日志空间的可能性,所以性能会得到极大的提升。
       但是,大容量导入中按最小方式记录日志的前提条件需要满足:
1. 当前没有复制表
2. 指定了表锁定:

注意:锁定是 SQL Server 数据库引擎用来对多个用户同时访问同一数据块的操作进行同步。当事务修改某个数据块时,它将持有保护所做修改的锁,直到事务结束。指定大容量导入操作的表锁定后,该表将在大容量导入操作期间采取大容量更新 (BU) 锁定。大容量更新 (BU) 锁允许多个线程将数据并发地大容量导入到同一表中,同时阻止其他不进行大容量导入数据的进程访问该表。表锁定可以通过减少表的锁争用来提高大容量导入操作的性能。
基本的理论信息还很多,这里不再累述。 

在阿里云SQL SERVER的主备架构中,使用大容量插入时,使用时需要特别留意一个特性需要明确指定,如果不指定,会触发微软尚未在SQL Server 2008 R2中未修复的BUG,会导致镜像SUSPEND,那么如何来避免各种情况呢? 下面列举了一些常见的场景:
 1、通过ado.net sqlbulkcopy 方式:
只需要将SqlBulkCopy 指定SqlBulkCopyOptions.CheckConstraints就好,数据库指定AdventureWorks2008R2的Person表。举个例子:

static void Main()
{
  string srcConnString = "Data Source=(local);Integrated Security=true;Initial Catalog=testdb";
  string desConnString = "Data Source=****.sqlserver.rds.aliyuncs.com,3433;User ID=**;Password=**;Initial Catalog=testdb";
 
  SqlConnection srcConnection = new SqlConnection();
  SqlConnection desConnection = new SqlConnection();
 
  SqlCommand sqlcmd = new SqlCommand();
  SqlDataAdapter da = new SqlDataAdapter();
  DataTable dt = new DataTable();
 
  srcConnection.ConnectionString = srcConnString;
  desConnection.ConnectionString = desConnString;
  sqlcmd.Connection = srcConnection;
 
  sqlcmd.CommandText = @"SELECT top 1000000 [PersonType],[NameStyle],[Title],[FirstName],[MiddleName],[LastName],[Suffix],[EmailPromotion]
           ,[AdditionalContactInfo],[Demographics],NULL as rowguid,[ModifiedDate] FROM [testdb].[dbo].[Person]";
  sqlcmd.CommandType = CommandType.Text;
  sqlcmd.Connection.Open();
  da.SelectCommand = sqlcmd;
  da.Fill(dt);
 
 
  using (SqlBulkCopy blkcpy = new SqlBulkCopy(desConnString, SqlBulkCopyOptions.CheckConstraints))
  //using (SqlBulkCopy blkcpy = new SqlBulkCopy(desConnString, SqlBulkCopyOptions.Default))
  {
    blkcpy.BatchSize = 2000;
    blkcpy.BulkCopyTimeout = 5000;
    blkcpy.SqlRowsCopied += new SqlRowsCopiedEventHandler(OnSqlRowsCopied);
    blkcpy.NotifyAfter = 2000;
 
    foreach (DataColumn dc in dt.Columns)
    {
      blkcpy.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
    }
 
    try
    {
      blkcpy.DestinationTableName = "Person";
      blkcpy.WriteToServer(dt);
    }
    catch (Exception ex)
    {
      Console.WriteLine(ex.Message);
    }
    finally
    {
      sqlcmd.Clone();
      srcConnection.Close();
      desConnection.Close();
 
    }
  }
 
}
 
private static void OnSqlRowsCopied(
  object sender, SqlRowsCopiedEventArgs e)
{
  Console.WriteLine("Copied {0} so far...", e.RowsCopied);
}

 2、通过jdbc  sqlbulkcopy 方式:
只需要在初始化对象时指定setCheckConstraints属性为TRUE,例如:
QLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions();
copyOptions.setCheckConstraints(true);
3、通过DTS/SSIS方式:
1.    import/export data方式需要先保存SSIS包,然后修改Connection Manager的属性

 

2.    直接使用SQL Server Business Intelligence Development Stuidio新建 SSIS包

3、通过BCP方式
1.      先将数据BCP出来 BCP ...OUT
BCP testdb.dbo.person Out "bcp_data" /t  /N /U **** /P *** /S "****.sqlserver.rds.aliyuncs.com,3433"
2.      然后将数据BCP进去 BCP...IN ,但需要指定提示:/h "CHECK_CONSTRAINTS"
BCP testdb.dbo.person In "bcp_data" /C /N /q /k /h "CHECK_CONSTRAINTS" /U *** /P *** /b 500 /S  "***.sqlserver.rds.aliyuncs.com,3433"
 4、通过bulk insert方式(在RDS不可是实现,因为不允许上传文件)

BULK INSERT testdb.dbo.person_in
FROM N'D:\trace\bcp.txt'
WITH
(
 CHECK_CONSTRAINTS 
);

四种方式教你在SQL Server中避免触发镜像SUSPEND,希望对大家的学习有所帮助。

相关文章

  • SQL Server数据表字段自定义自增数据格式的方法

    SQL Server数据表字段自定义自增数据格式的方法

    这篇文章主要介绍了SQL Server数据表字段自定义自增数据格式的方法,结合实例形式分析了SQL Server自增数据格式的定义方法与具体实现步骤,需要的朋友可以参考下
    2016-08-08
  • SQL 双亲节点查找所有子节点的实现方法

    SQL 双亲节点查找所有子节点的实现方法

    下面小编就为大家带来一篇SQL 双亲节点查找所有子节点的实现方法。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • sqlserver 文件数据库和关系数据库的比较

    sqlserver 文件数据库和关系数据库的比较

    本文概要地从数据格式、数据库结构和WEB发布数据三个方面比较了文件数据库和关系数据库的异同,同时差别了文件数据库和过去存储数据的文件系统的不同
    2011-10-10
  • SQL Server文件组的用法和原理

    SQL Server文件组的用法和原理

    数据文件的组合,称作文件组(File Group),数据库不能直接设置存储数据的数据文件,而是通过文件组来指定,本文给大家详细的介绍了SQL Server文件组,并通过代码讲解的非常详细,需要的朋友可以参考下
    2024-03-03
  • sql编程工具Sql Prompt下载及安装破解图文教程

    sql编程工具Sql Prompt下载及安装破解图文教程

    SQL Prompt是一款拥有SQL智能提示功能的SQL Server和VS插件。SQL Prompt能根据数据库的对象名称,语法和用户编写的代码片段自动进行检索,智能的为用户提供唯一合适的代码选择。自动脚本设置为用户提供了简单的代码易读性--这在开发者使用的是不大熟悉的脚本时尤其有用
    2014-08-08
  • SSMS中出现两个相同的服务器名称的问题解决

    SSMS中出现两个相同的服务器名称的问题解决

    在SSMS的【连接到服务器】页面,有时候可能会出现多个相同的服务器名称本文主要介绍了SSMS中出现两个相同的服务器名称的问题解决,感兴趣的可以了解一下
    2024-05-05
  • 浅谈为什么#{}可以防止SQL注入

    浅谈为什么#{}可以防止SQL注入

    本文主要介绍了浅谈为什么#{}可以防止SQL注入,#{} 匹配的是一个占位符,会对一些敏感字符进行过滤,编译过后会对传递的值加上双引号,因此可以防止 SQL 注入问题,感兴趣的可以来了解一下
    2022-05-05
  • 浅谈SQL Server中统计对于查询的影响分析

    浅谈SQL Server中统计对于查询的影响分析

    SQL Server查询分析器是基于开销的。通常来讲,查询分析器会根据谓词来确定该如何选择高效的查询路线,比如该选择哪个索引
    2012-05-05
  • 行转列之SQL SERVER PIVOT与用法详解

    行转列之SQL SERVER PIVOT与用法详解

    这篇文章主要给大家介绍了关于行转列之SQL SERVER PIVOT与用法的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用SQL SERVER具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • SQL Server新特性SequenceNumber用法介绍

    SQL Server新特性SequenceNumber用法介绍

    这篇文章介绍了SQL Server新特性SequenceNumber的用法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02

最新评论