sqlserver同步后在不重新初始化快照的情況下新增表


       在已有事務復制中,時長需要新增表、索引,這些變更時不會同步到從庫中。如果采用默認的設置,每次都需要重新初始化快照,從庫重新應用快照和未執行的同步命令,這顯然是無法在線上實踐的方法。另一種方法是將新增的架構變更新建一個發布訂閱,但會造成維護困難,增加出錯的幾率。
       可以通過設置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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM