交易式複寫:替已經有訂閱的發行集加發行項

參閱http://deepakrangarajan.blogspot.com/2009/01/sql-2005-transaction-replication-adding.html(這是針對 SQL Server 2005,但與 2008 僅差在 sp_addarticle 系統預存程序的 @source_table 要換成 @source_object)

若新增了資料表發行項,而希望既有的訂閱者只需要加入該資料表,而不是重新完整初始化(將訂閱端資料表刪除、所有的資料表再一次地下載、BCP OUT/IN),這有些麻煩。建好交易式複寫的發行與訂閱後,若僅要差異式地更新新增的資料表發行項,則發行集的 immediate_sync 屬性不可以是 true,這可以連接落在發行集的資料庫時,透過以下的系統預存程序查詢:
exec sp_helppublication ‘發行集名稱’

或查詢 dbo.syspublications 系統資料表(提供發行集的資料庫會自動新增一些系統資料表,例如:dbo.sysarticles、dbo.syssubscriptions…等,對於觀察覆寫都有幫助)

一般精靈建出來發行集 immediate_sync 屬性為 true,而查詢線上說明 sp_addpublication,其描述 immediate_sync 的用途為下:

指定每次執行快照集代理程式時,是否都要建立發行集的同步處理檔案。immediate_synchronization 是 nvarchar(5),預設值是 FALSE。如果是 true,每次執行快照集代理程式時,都會建立或重新建立同步處理檔案。如果在建立訂閱之前,快照集代理程式已經完成,訂閱者便能夠立即取得同步處理檔案。新的訂閱會取得最近執行快照集代理程式所產生的最新同步處理檔案。independent_agent 必須是 true,immediate_synchronization 才能是 true。如果是 false,只有在新訂閱存在時,才會建立同步處理檔案。當您累加地將新的發行項加入現有的發行集時,您必須針對每一項訂閱來呼叫 sp_addsubscription。在訂閱之後,快照集代理程式啟動和完成之前,訂閱者無法接收同步處理檔案。

而 immediate_sync 與 allow_anonymous 屬性有相依性,若要將 immediate_sync 改為 false,需要先將 allow_anonymous 屬性改為 false。

透過精靈建立好發行與訂閱後,依然可以透過系統預存程序改發行集的這兩個屬性

EXEC sp_changepublication
@publication = ‘發行集’,
@property = N’allow_anonymous’,
@value = ‘false’

EXEC sp_changepublication
@publication = ‘發行集’,
@property = N’immediate_sync’,
@value = ‘false’

改完後,若要對某個發行集新增發行項,可以執行以下的系統預存程序

exec sp_addarticle @publication=’發行集’, @article=’發行項’,
@source_object=’資料表’ , @force_invalidate_snapshot=1

EXEC sp_addsubscription
@publication = ‘發行集’,
@article = ‘發行項’,
@subscriber = ‘伺服器執行個體’,
@destination_db = ‘資料庫’,
@reserved=’Internal’

而後重新叫起產生快照集的作業,就會單獨產生僅有該資料表的快照集,待散發代理程式到訂閱端執行。

一旦採用這種模式後,需對個別訂閱者設定新增,也就是 sp_addsubscription 要針對不同的伺服器執行個體、資料庫重覆定義,並個別產生快照集…

 

PS. Merge Replication 似乎不需要這麼麻煩,我針對 Publication 再加入 Article 後,透過 Snapshot Agent,它依然產生全部 Article 的 Sanpshot。但據 Replication Monitor 呈現 Merge Agent 執行的結果,它只傳遞了新增的 Article

One Trackback

  1. […] 交易式複寫:替已經有訂閱的發行集加發行項 […]

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s

%d 位部落客按了讚: