SQLServer 可更新訂閱數據在線架構更改(增加字段)方案
之前一直查找沖突發布和訂閱數據不一致的原因,後來發現多少數據庫升級引起,因為一直以來都是在發布數據庫增加字段,訂閱也會自動同步。在此時如果訂閱隊列有數據,這些數據將丟失。參考上一篇說明:SQLServer 可更新訂閱數據沖突的一個原因 。當在發布數據庫增加一個字段時,系統同步存儲過程和觸發器都會重新生成,這會導致仍在隊列中的數據無法正常同步。訂閱隊列中的命令將因“同步”後消失,代理有可能出錯,但也會自動回復正常!~
這周測試了一些方法,最終算是確定一個方案可行的,雖然麻煩和耗時。
首先看簡單的架構圖:
上圖中,上面為發布服務器,下面為訂閱服務器。以一個表為例,正常發布為 Table 到 T1 的可更新訂閱發布,數據雙向同步,用戶都是在訂閱數據庫操作,都是操作視圖。增加字段時,為了使用戶能夠在訂閱正常操作,再創建一個發布訂閱,只發布一張表,數據太多時初始化會較久。註意:新的發布不能是同一個數據庫!如果是同一個數據庫,為了避免和原來的表名一樣,更改了新訂閱的表名,會導致 發布到原來的訂閱數據不同步!所以新的訂閱在另一個數據庫上,保持表名稱一致!因為系統調用的存儲過程表結構一致。~如上圖,所以一個發布中,在訂閱服務器中要求兩個數據庫訂閱,其中一個發布訂閱只有一張表,該表將是新增字段的表。此時3張表都同步發布雙向同步。
因為用戶都是操作視圖的,所以視圖的定義改為到新的數據庫表中,用戶操作仍正常,數據同步也正常。對新增加的發布,禁止架構同步,發布數據庫增加字段時,不會同步到新訂閱表中,但是會同步到原訂閱表中。待字段同步完成後,視圖定義改回原來的表,此時發布和訂閱都有新字段了。而作為中介創建的的發布訂閱可以刪除了!~
主要步驟如下:
1. 確保發布和訂閱數據一致
2. 創建1個可更新訂閱發布,只發布1張表 (發布數據庫執行)
3. 新發布的“沖突解決策略”: 保留發布服務器更改(發布屬性更改)
4. 新發布的“復制架構更改”: false(發布屬性更改)
5. 創建訂閱(訂閱服務器新的數據庫)
6. 更改作業所有者;初始化訂閱;等待完成…………
7. 發布更改視圖定義(會同步到原訂閱中),使用另一個數據庫的訂閱表(發布數據庫執行,註意訂閱表權限問題)
8. 確定原訂閱的隊列已經同步完成
9. 發布數據庫中對表增加字段(自動同步到原訂閱中,新訂閱不同步)
10. 訂閱隊列如無積累,更改發布視圖的定義,使用原來數據庫的表(發布數據庫執行)
11. 最後刪除新創建的發布
--1. 確保發布和訂閱數據一致 --2. 創建可更新訂閱(篩選)發布,只發布1表(發布數據庫執行) --3. 新發布的“沖突解決策略”: 保留發布服務器更改(發布屬性) EXEC sp_changepublication @publication = N'temp02', @property = N'conflict_policy', @value = N'pub wins' EXEC sp_changepublication @publication = N'temp03', @property = N'conflict_policy', @value = N'pub wins' --4. 新發布的“復制架構更改”: false(發布屬性) EXEC sp_changepublication @publication = N'temp02', @property = N'replicate_ddl', @value = 0 EXEC sp_changepublication @publication = N'temp03', @property = N'replicate_ddl', @value = 0 --5. 創建訂閱(訂閱服務器新的數據庫) --6. 更改作業所有者;初始化4個訂閱;等待完成………… --7. 發布更改視圖定義,使用另一個數據庫的訂閱表(發布數據庫執行,註意訂閱表權限問題) ALTER VIEW [dbo].[VTestTab] as SELECT Identifier,Name,value,info FROM DemoDB.dbo.TestTab --另一個訂閱數據庫的表 GO --8. 確定原訂閱的隊列已經同步完成 --9. 發布數據庫中對表增加字段(自動同步到原訂閱中) ALTER TABLE dbo.TestTab ADD TEST INT --10.訂閱隊列無太多,則更改發布視圖定義,使用原來數據庫的表(發布數據庫執行) ALTER VIEW [dbo].[VTestTab] as SELECT Identifier,Name,value,info FROM dbo.TestTab GO --11.刪除新創建的發布
測試完成!~個人測試正常,還未應用到生產庫中。其中最麻煩的是要初始化表數據,這是主要耗時的。
SQLServer 可更新訂閱數據在線架構更改(增加字段)方案