阿里雲 RDS SQL Server 主備架構下,大量匯入若未正確指定參數,會觸發未修復的 Bug 導致鏡像狀態變為 SUSPEND。核心在於:最小日誌記錄需滿足「表鎖 (TABLOCK)」與「無複寫」條件,並顯式啟用 CHECK_CONSTRAINTS 提示。
using (var blkcpy = new SqlBulkCopy(destConnString, SqlBulkCopyOptions.CheckConstraints))
{
blkcpy.BatchSize = 2000;
blkcpy.BulkCopyTimeout = 5000;
blkcpy.DestinationTableName = "Person";
blkcpy.WriteToServer(dt);
}
關鍵:SqlBulkCopyOptions.CheckConstraints(對應 CHECK_CONSTRAINTS 提示)。
SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions(); copyOptions.setCheckConstraints(true); // 必須設為 true SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(conn, copyOptions);
CheckConstraints=True。

REM 1. 匯出 BCP testdb.dbo.person OUT "bcp_data" /t /N /U **** /P *** /S "***.sqlserver.rds.aliyuncs.com,3433" REM 2. 匯入(關鍵 /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"
BULK INSERT testdb.dbo.person_in FROM N'D:\trace\bcp.txt' WITH (CHECK_CONSTRAINTS);
預設大量匯入忽略 CHECK 約束以提速,但 RDS 鏡像機制要求匯入資料經過約束驗證,否則主備資料不一致觸發 SUSPEND。顯式啟用後:
SIMPLE 或 BULK_LOGGED。TABLOCK(BCP /h "TABLOCK"、SqlBulkCopy TableLock 選項、BULK INSERT TABLOCK)。CHECK_CONSTRAINTS。