<a href="#_labelContents">本文所涉及的内容(Contents)</a>
<a href="#_labelContexts">背景(Contexts)</a>
<a href="#_labelProcess">搭建過程(Process)</a>
<a href="#_labelAttention">注意事項(Attention)</a>
<a href="#_labelQuestions">疑問(Questions)</a>
<a href="#_labelReferences">參考文獻(References)</a>
當SQL Server遇到同樣需要對曆史資料庫搭建複制,通常的做法是在本地釋出快照,再由訂閱傳輸資料,那SQL Server應該如何實作備份曆史資料搭建複制(釋出/訂閱)呢?下圖是備份檔案初始化訂閱的基本邏輯結構圖:

(Figure0:備份檔案初始化訂閱邏輯結構圖)
(一) 環境資訊
系統環境:Windows Server 2008 + SQL Server 2008
釋出伺服器:192.168.1.105,伺服器名稱:QuZhoushiwei105
分發伺服器:與釋出伺服器同一台機器
訂閱伺服器:192.168.1.106,伺服器名稱:QuZhoushiwei106
釋出資料庫:Barfoo.TestPublish
訂閱資料庫:Barfoo.TestSubscribe
資料庫帳号:ReplicationUser/ ReplicationPassword
(二) 搭建步驟
1) 在釋出伺服器上以QuZhoushiwei105伺服器名稱登陸釋出伺服器,如果你以localhost或者IP形式登陸伺服器,在建立釋出的時候會出現下圖Figure1的錯誤資訊;
(Figure1:錯誤資訊)
登陸伺服器之後使用下面的SQL腳本建立一個測試資料庫:Barfoo.TestPublish,建立一個測試表:UserInfo,并插入一條資料,用于模拟曆史資料;
(Figure2:UserInfo表記錄)
2) 在釋出資料庫和訂閱伺服器上分别執行下面的SQL腳本建立帳号和密碼(ReplicationUser/ ReplicationPassword);
3) 在釋出伺服器上建立一個釋出,具體步驟如下圖所示:
(Figure3:建立釋出)
(Figure4:選擇資料Barfoo.TestPublish)
(Figure5:選擇事務釋出)
(Figure6:選擇需要釋出的字段)
(Figure7:不勾選)
(Figure8:設定快照代理)
(Figure9:設定代理安全性)
(Figure10:設定日志讀取器代理)
(Figure11:設定帳号密碼)
(Figure12:建立釋出)
(Figure13:釋出名稱)
(Figure14:建立成功)
(Figure15:建立的釋出)
4) 設定釋出屬性中的訂閱選項,把允許從備份檔案初始化的預設值false設定為true;也可以使用下面的SQL腳本進行修改;
(Figure16:Allow initialization from backup files)
5) 使用下面的SQL腳本備份資料庫Barfoo.TestPublish,保留備份檔案,在後面建立訂閱的時候需要用到;
6) 在訂閱伺服器:192.168.1.106上使用下面的SQL腳本還原剛剛的備份檔案;
7) 在訂閱伺服器行修改帳号ReplicationUser,SQL腳本如下:
8) 在釋出伺服器上執行sp_addsubscription存儲過程添加訂閱,SQL腳本如下:
如果上面的SQL腳本執行成功,資料庫會傳回下面的提示資訊:
(Figure17:建立訂閱傳回資訊)
注意:如果備份檔案之後相隔太長時間,執行上面的腳本有可能會出現下面的錯誤資訊,如果遇到這個問題,可以參考下面【疑問】的内容:
消息21397,級别16,狀态1,過程sp_MSaddautonosyncsubscription,第271 行
對從指定備份建立的非同步訂閱進行同步時需要一些事務,但這些事務在分發伺服器上不可用。請使用更新的日志以及差異或完整資料庫備份再試此操作。
9) 檢查新添加的訂閱屬性中的安全性->訂閱伺服器連接配接,确認正确的帳号和密碼,預設是使用代理帳号;
(Figure18:訂閱伺服器屬性)
(Figure19:設定安全性)
(Figure20:設定登入名密碼)
也可以通過下面的SQL腳本設定訂閱伺服器連接配接的帳号密碼:
10) 檢查釋出伺服器和訂閱伺服器的訂閱狀态;
(Figure21:啟動複制螢幕)
(Figure22:訂閱狀态)
(Figure23:訂閱伺服器的本地訂閱)
11) 檢視訂閱伺服器QuZhoushiwei106的資料庫Barfoo.TestSubscribe的UserInfo表的資料;
(Figure24:UserInfo表資料)
12) 使用下面的SQL腳本在釋出伺服器上UserInfo表插入新資料,測試複制,分别檢視釋出伺服器與訂閱伺服器的資料;
(Figure25:釋出伺服器上UserInfo表資料)
(Figure26:訂閱伺服器上UserInfo表資料)
1. 在SQL SERVER下實作釋出伺服器和訂閱伺服器的通信正常(即可以互訪),打開1433端口,在防火牆中設定入站規則;
2. 釋出伺服器與訂閱伺服器的SQL Server Agent代理帳号必須設定的一樣,否則不能互訪;
3. 後期添加新的表需要手動在訂閱伺服器建立表結構,主要先在釋出屬性的項目中勾選新表,再通過表的右鍵菜單建立表結構腳本。
(一) 怎麼確定在釋出伺服器持續進資料的情況下,如何保證在拷貝曆史資料備份之後還能知道訂閱從哪個LSN開始讀取?
解答:如果備份檔案之後相隔太長時間,執行上面的腳本有可能會出現下面的錯誤資訊:
如果遇到這個問題,有3種解決辦法:
A. 按照上面的提示,對Barfoo.TestPublish資料庫做一個差異備份,再在Barfoo.TestSubscribe資料庫做差異還原,需要注意的是在使用sp_addsubscription的時候應該指定差異備份的檔案;
B. 如果你的資料庫Barfoo.TestPublish可以接受短時間不寫入資料,可以在做完整備份之前就先設定資料庫為隻讀狀态,在資料庫【屬性】-【選項】-【狀态】-【資料庫為隻讀】設定為True;
(Figure27:資料庫隻讀)
(Figure28:分發清除)
(二) 如果是transactional的replication,建立完畢之後是會産生對應的三個Job,下面3個是複制作業中的Job,他們的作用分别是什麼呢?
A. QUZHOUSHIWEI105-Barfoo.TestPublish-12
B. QUZHOUSHIWEI105-Barfoo.TestPublish-testpub-12
C. QUZHOUSHIWEI105-Barfoo.TestPublish-testpub-QUZHOUSHIWEI106-22
QUZHOUSHIWEI105-Barfoo.TestPublish-12,這是REPL-LogReader類别的JOB,一個資料庫隻會有一個日志讀取器作業,命名的格式是:ServerName-DBName-Num;
QUZHOUSHIWEI105-Barfoo.TestPublish-testpub-12,這是REPL-Snapshot類别,的JOB,一個釋出(也叫做一條同步鍊)對應一個快照作業,命名的格式是:ServerName-DBName-PublishName-Num;
QUZHOUSHIWEI105-Barfoo.TestPublish-testpub-QUZHOUSHIWEI106-22,這是一個REPL-Distribution類别的JOB,一個訂閱對應一個分發作業,命名的格式是:ServerName-DBName-PublishName-ServerName-Num;
可以通過下面的SQL腳本查詢訂閱JOB和訂閱屬性的相關資訊:
(Figure29:訂閱配置資訊)
<a href="http://technet.microsoft.com/zh-cn/library/75c8c1f8-60bc-44a8-944b-d18d1f6bda11(v=sql.90)">初始化事務訂閱(不使用快照)</a>
<a href="http://technet.microsoft.com/zh-cn/library/ms147834(v=sql.105)">如何從備份初始化事務訂閱(複制 Transact-SQL 程式設計)</a>
<a href="http://technet.microsoft.com/zh-cn/library/ms151795(v=sql.110).aspx">使用快照初始化訂閱</a>
<a href="http://blog.csdn.net/arrow_gx/article/details/6370134">SQL Server事務複制通過備份檔案進行訂閱初始化</a>
<a href="http://database.51cto.com/art/201010/230683.htm">SQL Server複制用備份檔案初始化訂閱</a>
<a href="http://msdn.microsoft.com/zh-cn/magazine/ms187359(SQL.90).aspx">ALTER AUTHORIZATION (Transact-SQL)</a>
<a href="http://blog.sina.com.cn/s/blog_4b05f08e01011rue.html">Server2008+SQL2008 日志讀取代理器未運作 程序無法在“WIN-XXX”上執行“sp_replcmds”</a>
<a href="http://www.cnblogs.com/fygh/archive/2011/07/04/2097405.html">SQLServer Replication 常見錯誤</a>
<a href="http://technet.microsoft.com/zh-cn/library/ms181702.aspx">sp_addsubscription (Transact-SQL)</a>
<a href="http://technet.microsoft.com/zh-cn/library/ms188358(v=sql.110).aspx">sp_addpullsubscription_agent (Transact-SQL)</a>