在已有事務復制中,時長需要新增表、索引,這些變更時不會同步到從庫中。如果采用默認的設置,每次都需要重新初始化快照,從庫重新應用快照和未執行的同步命令,這顯然是無法在線上實踐的方法。另一種方法是將新增的架構變更新建一個發布訂閱,但會造成維護困難,增加出錯的幾率。
可以通過設置immediate_sync和allow_anonymous 來實現不重新初始化快照的前提下新增表。
先看着兩個參數的含義:
immediate_sync:指定每次運行快照代理時是否為發布創建同步文件。 immediate_synchronization 的數據類型為 nvarchar(5),默認值為 FALSE。 如果為 True,表示每次運行快照代理時都創建或重新創建同步文件。 如果快照代理在訂閱創建前完成,則訂閱服務器可以立即獲得同步文件。 新訂閱將獲取最近一次執行快照代理所生成的最新同步文件。 independent_agent 必須為 true,以便於 immediate_synchronization 為 true。 如果為 False,則僅當有新訂閱時,才創建同步文件。 當以增量方式向現有發布添加新項目時,必須為每個訂閱調用 sp_addsubscription。 訂閱后訂閱服務器無法接收同步文件,直到啟動並完成快照代理為止。
allow_anonymous:指定是否可為給定發布創建匿名訂閱。 allow_anonymous 的數據類型為 nvarchar(5),默認值為 FALSE。 如果為 True,則 immediate_synchronization 也必須設置為 True。 如果為 False,則表示不允許對該發布創建匿名訂閱。
從定義中看出來,immediate_sync為false時,新的項目(表、存儲過程等)可以以增量方式發布,而allow_anonymous必須為false,immediate_sync才能為false。
案列,創建了一個數據庫masterdb,創建一張表t:
CREATE TABLE t( id INT ,NAME VARCHAR( 10),CONSTRAINT pk_t PRIMARY KEY (id)) INSERT INTO t VALUES(1 ,1),( 2,2 ),(3, 3)
訂閱名為repl_master,訂閱數據庫slavedb。
查看現有數據庫這兩個屬性的設置,現在設置都是1
USE msterdb sp_helppublication; 或者: select immediate_sync ,allow_anonymous from dbo .syspublications
修改這兩個參數為0: use msterdb ; go EXEC sp_changepublication @publication = 'repl_master', @property = 'allow_anonymous' , @value = 'false' GO EXEC sp_changepublication @publication = 'repl_master', @property = 'immediate_sync' , @value = 'false' GO
新建一個表,並進行發布 CREATE TABLE t1( id INT ,NAME VARCHAR( 10),CONSTRAINT pk_t1 PRIMARY KEY(id )) INSERT INTO t1 VALUES(1 ,1),( 2,2 ),(3, 3)
在發布屬性的項目中勾選新增表:
在復制監視器中啟動代理,看到
日志生成狀況:
查看從庫,表t1已經同步。
刪除同步就比較簡單了,只需要在發布的項目中刪除該項目就行,但是在訂閱數據庫中依然保留該表,需要手動drop