1. 程式人生 > >【sql server復制】不重新初始化快照的情況下新增表/存儲過程/函數等

【sql server復制】不重新初始化快照的情況下新增表/存儲過程/函數等

clas prim from depend 實現 inf arc pri 發布庫

轉發自:https://www.cnblogs.com/datazhang/p/5498789.html 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。   

##註意:從定義中看出來,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

技術分享圖片

##註:新增函數/存儲過程類似如上操作,新增字段直接在發布庫執行即可

【sql server復制】不重新初始化快照的情況下新增表/存儲過程/函數等