由於關聯式資料庫的機制要求合併複製資料同步時需要有良好的自治性,SQL Server的合併複製的應用場景相對比較少。一些典型的應用場景比如異地資料同步,跨洋的資料同步等。由於網路延時以及該種業務有相對比較大的資料獨立性,因此在合併複製在某些場景會比較合適。
在一些情況下,合併複製如果由於某些原因壞掉,需要重新初始化,而由於網路頻寬的限制,用快照重新初始化稍微大一點的庫基本不現實,因此需要考慮使用通過備份初始化,在初始化過程中,我遇到了如下錯誤:
{call sp_MSsetconflicttable (N'__UserSyncOptions', N'MSmerge_conflict_Main___UserSyncOptions', N'DB\MAIN', N'DB1', N'Main')}
Incorrect syntax near 'Id'.
後來通過排查發現,疏忽了關鍵步驟,因此在此寫下從備份初始化合並複製的正確姿勢:
1.為需要合併複製的表新增唯一的RowGuid列,該列是合併複製用於確認行的唯一依據,因此該列有如下要求:
- 有唯一約束
- 有唯一索引
- 有GUID的預設值Newid()或newsequentialid()
- 該列Not Null
該列的新增指令碼為:
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE 表名稱 ADD
ROWGUID uniqueidentifier NOT NULL ROWGUIDCOL CONSTRAINT MSmerge_df_rowguid_ DEFAULT (newid())
GO
ALTER TABLE 表名稱 SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
2. 備份需要初始化的資料庫。 (在此期間,請不要備份日誌,以防日誌鏈斷裂!)
3. 建立釋出,並手動生成釋出的快照。該步驟十分重要,雖然訂閱伺服器不需要快照初始化訂閱,但是需要快照的後設資料!
4. 在訂閱端還原資料庫備份。注意,不能指定KEEP_REPLICATION選項。
5. 建立訂閱,選項請指定不立即初始化,如果是指令碼建立訂閱,請指定:@sync_type = N'None'
6. 手動啟動合併代理,以便從釋出端同步後設資料。至此整個過程完成。