SQL Server中防止觸發鏡像SUSPEND的N種辦法。本站提示廣大學習愛好者:(SQL Server中防止觸發鏡像SUSPEND的N種辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是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,願望對年夜家的進修有所贊助。