1. 程式人生 > >SqlServer 可更新訂閱升級字段隊列數據丟失原因

SqlServer 可更新訂閱升級字段隊列數據丟失原因

targe span 丟失 之前 因此 sdn ont new 實時同步

原文:SqlServer 可更新訂閱升級字段隊列數據丟失原因

之前簡單描述過數據沖突發生的原因:SQLServer可更新訂閱數據沖突的一個原因但具體內部原理是怎麽丟失的還不清楚,今天補充說明。可更新訂閱,在訂閱數據庫操作數據,數據實時同步到發布數據庫中。


經測試,有3種情況會導致訂閱隊列的數據丟失:


1.更改字段類型

2.增加刪除字段

3.表對象發布


另:添加默認值約束,存儲過程,函數正常!訂閱隊列數據不丟失!(觸發器未設置同步)



具體模擬步驟如下:

1.在發布中添加表

2.停止隊列讀取器代理

3.此時對訂閱數據庫對其他已同步的表進行DML

操作

4.啟動快照代理(新表同步)

5.啟動隊列讀取器代理

6.查看訂閱庫中的隊列表已無數據,但發布數據庫表卻未變化。


也就是在啟用快照後,隊列數據消失了!~



打開 profiler跟蹤到,在給一個新表創建發布時,訂閱隊列中的事務和命令都會被清空!

技術分享圖片


執行的存儲過程為:sp_MSreset_queued_reinitsp_repldeletequeuedtran


execsp_MSreset_queued_reinitN‘serverName‘,N‘subscriber_db‘,@artid

execsp_repldeletequeuedtran

N‘serverName,N‘publisher_db‘,N‘publication‘,N‘tranid‘,@orderkeylow,@orderkeyhigh


訂閱隊列表數據將被刪除:dbo.MSreplication_queuedbo.MSrepl_queuedtraninfo




因此當啟用隊列讀取器的時候,隊列已經沒有數據了!(啟用隊列讀取器後,後續的同步正常)

訂閱變化的數據也就無法同步到發布中,這就導致了訂閱數據和發布數據的不一致!

雖然本例是停止隊列讀取器模擬,但是在生產環境中,隊列可以說總是存在數據的,每個表的操作都會有。如果要升級數據庫結構,對於這種架構,還得停機維護來升級!或者晚上用戶較少的時候,禁止用戶訪問來升級數據庫結構。




SqlServer 可更新訂閱升級字段隊列數據丟失原因