天天看點

SQL SERVER Transactional Replication中添加新表如何不初始化整個快照

在SQL SERVER的複制(Replication)中,有可能出現由于業務需求變更,需要新增一張表或一些表到已有的複制(釋出訂閱)當中,這種需求應該是很正常,也很常見的。但是在已有的複制(釋出訂閱)當中增加新表/文章,往往需要将整個快照重新初始化,這樣做雖然簡單,但是往往在實際應用中會出現一些問題,例如,釋出訂閱的表比較多,資料量比較大,那麼重新初始化快照往往需要很長一段時間,影響系統正常運作。另外就是這樣做會增大伺服器的負荷,影響網絡帶寬.

    那麼是否可以在新增表/文章後,不用初始化整個快照,而隻是初始化新增的表呢? 當然可以,下面以一個小案例來講述一下如何操作:

在資料庫TTT上建立了名為RPL_TTT的釋出,要釋出的對象為WipNoToReed和WipNoToStarch這兩張表,在另外一個伺服器的資料庫Test上訂閱了該釋出。現在由于需求變跟,需要增加一張表WipNoToLoosen

<a href="http://images.cnitblog.com/blog/73542/201502/020033143163060.png"></a>

我們可以按照下面三個步驟來操作,如下所示:

1:使用sp_helppublication檢視該釋出的相關資訊,如下所示,你會看到預設情況下,'immediate_sync' 和 'allow_anonymous'這兩個屬性都是啟用的。我們首先需要禁用這兩個屬性。

        allow_anonymous      表示是否允許對釋出使用匿名訂閱。

       immediate_sync       表示是否在每次快照代理運作時建立或重新建立同步檔案。

<a href="http://images.cnitblog.com/blog/73542/201502/020033177693648.png"></a>

<a href="http://images.cnitblog.com/blog/73542/201502/020033193161921.png"></a>

2:在本地釋出當中找到"RPL_TTT",然後在"項目"當中增加表WipNoToLoosen,當然你也可以使用 sp_addarticle指令添加。如下所示:

<a href="http://images.cnitblog.com/blog/73542/201502/020033219251852.png"></a>

SQL SERVER Transactional Replication中添加新表如何不初始化整個快照

3:在釋出"RPL_TTT"上,右鍵單擊“檢視快照代理狀态”,在彈出的視窗上選擇“啟動”,你會發現快照隻會初始化一個表而不是整個三個表。

<a href="http://images.cnitblog.com/blog/73542/201502/020033257841499.png"></a>

指令執行完成後,你會發現該表的subscription_status變為了2,如下所示

SQL SERVER Transactional Replication中添加新表如何不初始化整個快照

至于完成後,'immediate_sync' 和 'allow_anonymous'這兩個屬性如果你要啟動的話,也是非常簡單容易的。不啟用也問題不大。