你不可不知的複寫常識
複寫用來複製資料和資料庫物件的一項強大的功能,是大型資料庫或資料庫同步維持資料一致性的功能
透過各種網路、撥接連線,將資料散佈到不同地點上,即然是複寫了顧名思義,就是將資料同步的寫到各個不同的資料庫伺服器上
你不可不知的複寫常識
複寫用來複製資料和資料庫物件的一項強大的功能,是大型資料庫或資料庫同步維持資料一致性的功能
透過各種網路、撥接連線,將資料散佈到不同地點上,即然是複寫了顧名思義,就是將資料同步的寫到各個不同的資料庫伺服器上
當然在整個資料庫的複寫中,也有考量到效能處理及資料庫結構問題,又分為三種複寫架構:交易式、合併式、快照式。
快照式複寫:資料變更數量大,但次數不用太頻繁的同步複寫時,最適合使用快照式複寫。
在所有複寫功能中快照式在「發行者」端負擔較小,因為他不用追踨累加變更的資料,只需要將資料庫中的資料做快照即可。
例如,在整個整批交易中,每天共有三十萬筆資料,一天只需要傳回總部一次,那麼快照式複寫就可以較有效率的將資料複寫回去。
※此種複寫需要每一張表都有Identify欄位。
交易式複寫:當資料有任何改變時,會主動的傳遞到訂閱者,預設交易式複寫是唯讀存取,因此在訂閱者端有任何資料的改變
是不會傳遞回到發行者端的。不過交易式複寫是可以設定成訂閱者亦可更新資料。
這種複寫狀態會有較大的彈性並且於資料端有大量的更新或插入、刪除的動作,適合非MS SQL Server資料庫做同步的複寫方式。
※此種複寫在發行資料庫下會主動的配置交易記錄,透過交易記錄來執行複寫轉送,當使用這種複寫方式在資料尚未完全移動到散發資料庫前,記錄檔無法被截斷。
※所有交易式複寫的資料表上,必須包含主索引鍵,否則無法被利用來發送。
合併式複寫:與交易式複寫很類似,是在發行者上發佈後,訂閱者存資料時,之主動的交換最後一次同步處理所變更過的資料。
通常這種複寫是較適合在多個訂閱者可能會在不同時間之下更新相同的資料,較容易產生資料衝突,當資料產生衝突時,必須由DBA進行排解。
※此種複寫會自動建立一組GUID資料行,且支援Timestamp資料行,在訂閱者套用快照集時會重新產生timestamp,驗證timestamp是否為可用快照。
環境限制和需求
不論在那一種複寫狀況之下,建立快照集資料夾的安全問題都是需要被重視的,因此在資料庫複寫的過程中,快照夾實體目錄權限就必須考慮進來,
使用何種複寫則必須視你所貼近的環境來選用,若資料庫設計時,並無使用identify,或並無使用索引欄位,那麼於快照及交易複寫就不適用,除非改變資料庫內容。
實作注意事項
在實作時,必須先選擇何者為發行者、散發者、訂閱者…等等的角色定義。(總是要知道誰負責發資料、誰是來接受同步資料的角色吧)
多數的工作是著在發行者身上,其它的資料處理同步,就可以透過代理程式來決定運作在訂閱者發起同步令命,還是由訂閱者發起呢?
若是遠端的資料庫同步(跨WAN)則必須透過VPN達成複寫或是Web同步處理方式,畢竟複寫是必須透過網芳、或XML訊息傳遞來處理。
在實作的過程中,有一個問題產生了,因SQL是建置在WINDOWS之上,又有使用網芳傳遞,那麼如何確認每個資料庫的同步是沒有問題的呢?
因此在複寫的安全架構下,必須將SQL Server Agent的啟動帳戶設定為相同的實體本機帳號,另外網路上存取網芳亦必須開通由這幾台db可存取。
實作環境說明
目前Jason的測試環境是以兩台Windows 2008 Server作為平台安裝SQL Server 2008(分別為:WinSQLSvrA, WinSQLSvrB),並且兩台server兩網卡
一個是將兩台網卡串接在一起做為NLB的heartbeat,另一張網卡則是對外提供服務,並設定為NLB。示意圖如下:
建立本機使用者
分別於兩台Server上新增乙使用者,並命名為SQLReplace,並設定密碼永久有效,而密碼長度就依照各安全要求囉!
接下來將兩台server服務中的SQL Server Agent(MSSQLSERVER)內容中的登入設定成為以SQLReplace帳號啟動
※完成後務必將服務重新啟動
1.找到SQL Server Agent(XXX)服務
2.於服務上按右鍵選擇內容。
3.於登入頁籤中輸入複寫共用帳號SQLReplace並登打密碼。
4.並重新啟動服務,只要服務啟動沒有錯誤即可完成該設定。
建立複寫集目錄
預設複寫集存放目錄為C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\repldata
設定複寫存放位置權限及開啟共享,設定SQLReplace帳號可以完全控制該目錄
設定複寫發行集
接下來,我們將WIN-SQLSvrA主機設定為複寫的發行者
1.展開複寫功能,並於本機發行集上按右鍵,新增發行集。
2.指定以Win-SQLSvrA為散發者。
3.必須於快照集指定為網路路徑
複寫進存放位址置放於\\Win-SQLSvrA\repldata
4. 設定發行複寫的資料庫Web_Jason
5.本例選擇以合併式複寫發行
6.核選所需要複寫的項目,可依照需求定義,亦可選擇發行的種類來複寫。
7.選擇可接受的訂閱者類型及其版本。
8.此時會依照所選擇的複寫類型而告知必須加入的動作及後續的作業。
9.依照所需的內容可以以篩選的方式將資料同時處理到所需的發行集中。
10.快照建立時,可選擇多久的時間建立一次快照,因為合併式是即時複寫及快照複寫兩種,
因此下面定義的快照集代理程式是指拍快照的時間,而複寫是即時複寫的,
快照完成時間會再進行一次複寫,使有誤差的資料庫完全相同。
11.複寫集是透過SQL Agent來執行的,因此在代理程式中,必須設定相關安全性的需求(連入帳戶、處理帳戶…等等)
12.若是已將SQL Server Agent重新設定以帳號啟動,則可選擇以服務帳號執行,若無則亦可指定帳號執行
連接到發行者的部份,則可直接選由模擬處理帳號即可,不指定帳號登入。
13.接下來選擇必須完成的動作(核選建立發行集)。
14.給發行集名稱一個唯一的名字吧!
15.接下來隨即進行發行集的產生及相關的設定。
16.複寫發行集設定成功…
複寫的訂閱模式
提取訂閱:提取訂閱是由發行者設定好發行集後,由訂閱者連線至發行者要求取得複寫集的方式。
發送訂閱:剛好與上者相反訂閱方式相反,是由發行者指定將發行集派送給何者做複寫的方式。
設定複寫安全性
因Jason一時不查造成有網友實作時發生權限問題,因此在本部份針對資料庫必須設定的安全性加以說明。
隨著訂閱的方式不同,發行集的內容不同,其安全性的設定也會有所差異
在此建議大家依照所需要的環境及安全設計到下面的連結中查詢(複寫方式不同和代理程式的訂閱不同會有不同設定喲!)
http://msdn.microsoft.com/zh-tw/library/ms151868.aspx
1.於Win-SQLSvrA上將SQLReplace帳號加入到登入中,於安全性上按右鍵->新增->登入。
2.將Win-SQLSvrA中的SQLReplace帳號點選進來,依照預設值即可。
3.給予SQLReplace帳號具有Distribution及欲提供複寫的資料庫(Web_Jason)具有db_Owner的權限。
4.接下來請切換至Win-SQLSvrB伺服器上,並且將SQLReplace帳號加入登入中
並設定欲成為複寫目標的資料庫(Web_Jason)具有db_Owner權限。
訂閱複寫
接下來再以Win-SQLSvrB設定為訂閱者,連接到了Win-SQLSvrB後,於複寫中展開本機訂閱
1.於本機訂閱上按下右鍵,選擇新增訂閱。
2.新增訂閱時,必先指定發行者,因此於發行者下拉式方塊中選擇”尋找SQL Server發行者”
3.接下來直接連接至Win-SQLSvrA中
4.當連線到發行者後,可在發行者發行的發行集中看到剛剛建立起的發行集Web_Jason_Replace。
5.若發行者主機較強,可選擇散發者上執行代理程式,若希望降低發行者的負擔可選擇在訂閱者端執行代理。
6.接下來選擇要訂閱的資料庫名稱
※資料庫不需要是同名稱。
7.依據代理發行其連接設定
※若已設定SQL Server Agent執行身份,可不需指定連接至散發者帳號密碼。
8.接下來指定同步的排程可指定為連續執行
※意指,有任何變更隨即同步複寫,若選擇在有需要時執行,則是依照發行者設定的排程時間執行
若選擇定義排程,則可自我訂義排程時間。
9.衝突發生時,以何者為何優先處理順序,預設值為依照先丟遞至發行者為優先。
10.接下來即可建立訂閱,並完成訂閱。
啟動初始化
在設定好訂閱後,於Win-SQLSvrA啟動初始化
1.於發行集中展開後,按右鍵檢視快照集代理程式狀態。
接下來點下代理程式的啟動按鈕即可。
檢視複寫監視器
複寫監視器是一個可以看到複寫的所有狀態及動作的監視器,在任何一台DB上都可以直接檢視,只需要做下列的設定即可。
1.於複寫功能上按右鍵,點選啟動複寫監視器。
2.點選我的發行者,並於右手邊的視窗中,選擇加入發行者。
3.在加入發行者處選擇加入SQL Server發行者÷並輸入發行者的帳號及密碼,即可完成加入發行。
接下來即可在複寫監視器中看到複寫的狀態及各項複寫過程所遇到的錯誤問題。
呼~~!好長一篇,有任何問題再跟大家一起討論,先休息喘一下吧!
如有看不懂的地方,可以大家一起討論。
可參考Microsoft Technet的SQL複寫http://technet.microsoft.com/zh-tw/library/ms151198.aspx
Anything keeps Availability.
Anywhere keeps Integrity.
Anytime keeps Confidentiality.
keep A.I.C. = Information Security