SqlServer 可更新訂閱升級字段隊列數據丟失原因
之前簡單描述過數據沖突發生的原因:SQLServer可更新訂閱數據沖突的一個原因 ,但具體內部原理是怎麽丟失的還不清楚,今天補充說明。可更新訂閱,在訂閱數據庫操作數據,數據實時同步到發布數據庫中。
經測試,有3種情況會導致訂閱隊列的數據丟失:
1.更改字段類型
2.增加刪除字段
3.表對象發布
另:添加默認值約束,存儲過程,函數正常!訂閱隊列數據不丟失!(觸發器未設置同步)
具體模擬步驟如下:
1.在發布中添加表
2.停止隊列讀取器代理
3.此時對訂閱數據庫對其他已同步的表進行DML
4.啟動快照代理(新表同步)
5.啟動隊列讀取器代理
6.查看訂閱庫中的隊列表已無數據,但發布數據庫表卻未變化。
也就是在啟用快照後,隊列數據消失了!~
打開 profiler跟蹤到,在給一個新表創建發布時,訂閱隊列中的事務和命令都會被清空!
執行的存儲過程為:sp_MSreset_queued_reinit和sp_repldeletequeuedtran
execsp_MSreset_queued_reinitN‘serverName‘,N‘subscriber_db‘,@artid
execsp_repldeletequeuedtran
訂閱隊列表數據將被刪除:dbo.MSreplication_queue和dbo.MSrepl_queuedtraninfo
因此當啟用隊列讀取器的時候,隊列已經沒有數據了!(啟用隊列讀取器後,後續的同步正常)
訂閱變化的數據也就無法同步到發布中,這就導致了訂閱數據和發布數據的不一致!
雖然本例是停止隊列讀取器模擬,但是在生產環境中,隊列可以說總是存在數據的,每個表的操作都會有。如果要升級數據庫結構,對於這種架構,還得停機維護來升級!或者晚上用戶較少的時候,禁止用戶訪問來升級數據庫結構。
SqlServer 可更新訂閱升級字段隊列數據丟失原因