SQL Server2012高可用之事物復制(發布訂閱)測試
(一)測試目的
目前公司使用的SQL SERVER 2012高可用環境為主備模式,其中主庫可執行讀寫操作,備庫既不可寫也不可讀,即采用的高可用技術為“數據庫鏡像”。存在的問題為:開發人員需要登錄到生產服務器上去確認數據,無法保證數據安全。因此,需要搭建一種主備模式,保證備庫可讀,從而讓開發人員在不接觸生產環境的情況下也能通過備庫校驗數據的正確性。
(二)技術選擇
經過確認,SQL Server2012的高可用主要有以下方案:
高可用技術 |
優勢 |
劣勢 |
最終選擇 |
SQL Server集群 |
多台服務器組成一個集群,可保證一個節點出故障,其它節點仍正常運行 |
集群使用共享存儲,存儲故障會導致整個集群出故障 |
不符合本次主備分離的特點。 |
日志傳送 |
通過主庫的日志恢復備庫,可保證主備庫數據一摸一樣 |
備份作業每隔一段時間觸發一次,所以不是實時的 |
日志恢復有延遲,無法查到最新的數據 |
數據庫鏡像 |
可保證主備庫數據一摸一樣 |
鏡像數據庫是一個一直處於“恢復”狀態的數據庫,因此不能直接訪問 |
備庫無法訪問,不符合要求 |
復制-->快照復制 |
直接同步數據庫某一時刻的整個狀態 |
數據有延遲、需要保證整體數據量小,數據量大的時候速度非常慢 |
不符合要求 |
復制-->事務復制 |
通過日志讀取代理和分發代理程序,將發布服務器上的數據更改和架構修改幾乎實時傳遞給訂閱服務器; |
暫時無 |
符合要求 |
復制-->合並復制 |
允許用戶同時修改訂閱服務器和發布服務器上的數據,並把這些修改合並成一個統一的結果 |
暫時無 |
實際環境中主庫不需要同步備庫的變更,不符合要求 |
經過確認,使用復制技術中的事物復制來測試是否滿足需求。
(三)搭建步驟
測試基礎環境信息如下:
主庫 |
備庫 |
|
操作系統 |
Windows Server 2012 R2 64bit |
Windows Server 2012 R2 64bit |
數據庫版本 |
cn_sql_server_2012_enterprise_edition_x86_x64 |
cn_sql_server_2012_enterprise_edition_x86_x64 |
服務器名稱(IP) |
WIN-PRIMARY(10.1.106.2) |
WIN-STANDBY(10.1.106.3) |
同步數據庫信息 |
masterdb |
slavedb |
(3.1)配置分發(主庫執行)
STEP1: 在SSMS“對象資源管理器”中選擇“復制”,右鍵“配置分發”,彈出“配置分發向導”,點擊“下一步”
STEP2: 分發服務器可以是當前服務器,也可以是其它服務器,這里選擇當前服務器作為分發服務器
STEP3: 快照文件夾用於存放快照
該文件夾需要手動修改權限,最好直接給“Everyone”的權限
STEP4: 配置分發數據庫,默認即可
STEP5: 配置發布服務器,默認即可
STEP6: 后續步驟默認即可
(3.2)創建發布(主庫執行)
STEP1: 在SSMS“對象資源管理器”中選擇“復制”,點擊“本地發布”,右鍵“新建發布”
STEP2:選擇要發布的數據庫,這里選擇要發布的數據庫,即要進行主備同步的數據庫。本次測試為masterdb數據庫的所有表,選擇masterdb
STEP3:選擇發布類型,這里選擇事務發布
STEP4:發布項目,選擇要發布的表。需要注意,要發布的表必須要有主鍵,否則無法發布。
STEP5:是否要過濾數據,這里因為要保持主備數據相同,不過濾,直接下一步。
STEP6:勾選“立即創建快照並使快照保持可用狀態,以初始化訂閱”
STEP7:代理安全性,選擇“安全設置”
STEP8:默認在向導結束時創建發布
STEP9:填寫發布名稱,點擊“完成”
STEP10:確認發布成功
發布成功后,可以在對象資源管理器的“復制”-->”本地發布”下面找到新的發布:
(3.3)創建訂閱(備庫執行)
STEP1:在備庫服務器上創建新的數據庫slavedb。在SSMS的“對象資源管理器”-->“數據庫”-->右鍵點擊“新建數據庫”,創建slavedb。
STEP2:選擇“復制”-->“本地訂閱”-->“新建訂閱”
STEP3:發布。“發布服務器”菜單選擇“<查找SQL Server發布服務器...>”,在彈出的菜單中,填寫主數據庫的信息,然后“連接”,如下:
在“數據庫和發布”中選擇主庫的發布
STEP4:在分發代理位置中選擇“在分發服務器xxx上運行所有代理(推送訂閱)”
STEP5:訂閱服務器中選擇“訂閱數據庫”為slavedb
STEP6:分發代理安全性,點擊紅框部分
如下圖設置分發代理安全性
STEP7:同步計划,選擇“連續運行”
STEP8:初始化訂閱,選擇“立即”
STEP9:保持默認
STEP10:確認訂閱成功
刷新“本地訂閱”,即可看到剛剛創建的訂閱
(3.4)檢查數據同步狀態
檢查“對象資源管理器”-->“數據庫”-->“slavedb”-->“表”下面是否已經有表
檢查表中是否有數據
如果有表和數據,那么說明數據已經同步過來。或者在主庫手動插入數據,看是否會同步到備庫,也是一個好辦法。
(四)數據庫操作對復制的影響
(4.1)添加新表(主庫操作)
結果:主庫添加新表,備庫並不會自動同步。
如果要同步,有3種方法:
方法一:在發布服務器重新生成快照,重啟發布、分發作業
STEP1:在主庫上打開SSMS,點擊“復制”-->“本地發布”,點擊要修改的發布名稱“[masterdb]:publish_masterdb”-->右鍵“屬性”
STEP2:在“項目”中,去掉勾選“僅顯示列表中已選中的項目”,即可看到所有表,選擇新表,點擊確定,
STEP3:選擇發布,重新初始化
STEP4:重啟快照代理和分發代理
首先確認本地發布“publish_masterdb”的快照代理和分發代理的名稱。在“SQL Server代理”--“作業活動監視器”,找到“publish_masterdb”相關代理。
然后關閉快照代理和分發代理(停止作業),最后在開啟快照代理和分發代理(作業開始步驟...)
STEP5:確認備庫表是否同步過去
方法二:添加新表到原來的發布中,然后重啟發布、分發作業
TEP1:在主庫上打開SSMS,點擊“復制”-->“本地發布”,點擊要修改的發布名稱“[masterdb]:publish_masterdb”-->右鍵“屬性”
STEP2:在“項目”中,去掉勾選“僅顯示列表中已選中的項目”,即可看到所有表,選擇新表,點擊確定,
STEP3:重啟快照代理和分發代理
首先確認本地發布“publish_masterdb”的快照代理和分發代理的名稱。在“SQL Server代理”--“作業活動監視器”,找到“publish_masterdb”相關代理。
然后關閉快照代理和分發代理(停止作業),最后在開啟快照代理和分發代理(作業開始步驟...)
STEP4:確認備庫表是否同步過去
方法三:對新表新建發布、訂閱
這里以test10表為例,將test10表同步到salvedb中。
STEP1:在主庫上對test10表新建事務發布“p_masterdb_test10”
STEP2:在備庫上對“p_masterdb_test10”進行訂閱
STEP3:確認備庫表是否同步過去
三種方法使用總結:
方法 |
使用優劣勢 |
方法一:在發布服務器重新生成快照,重啟發布、分發作業 |
優勢:能夠在同一個發布中增加新表,管理規范、方便; 劣勢:重新初始化步驟會將主庫的所有數據重新同步到備庫,如果數據量很大,同步速度會較慢; |
方法二:添加新表到原來的發布中,然后重啟發布、分發作業 |
優勢:1.能夠在同一個發布中增加新表,管理規范、方便; 2.不需要重新生成快照,僅對新加的表增量更新,負載小 個人認為該方法是最優的 |
方法三:對新表新建發布、訂閱 |
優勢:直接對新表新建發布訂閱,不影響原有的同步,對業務影響小; 劣勢:每次增加新表都需要新建發布訂閱,管理上不規范; |
(3.2)刪除表(主庫操作)
結果:主庫無法刪除正在同步的表。
drop table test01;
報錯:
消息 3724,級別 16,狀態 2,第 2 行
無法對 表'test01' 執行 刪除,因為它正用於復制。
(3.3)修改表結構(主庫操作)
結果:①添加列:主庫添加列,備庫會自動添加列;②刪除列:主庫刪除列,備庫會自動刪除列;
(3.4)插入、更新、刪除數據(主庫操作)
結果:主庫插入、更新、刪除數據,備庫自動同步;
(3.5)truncate表(主庫操作)
結果:無法執行truncate操作;
truncate table test01;
消息 4711,級別 16,狀態 1,第 1 行
無法截斷表 'test01',因為該表已為復制發布或者已啟用了變更數據捕獲。
(3.6)修改操作系統Administrator密碼(主庫操作)
結果:數據傳輸正常;
(四)如何監控
在SMSS中,點擊“復制”-->“啟動復制監視器”,即可看到所有的發布、訂閱監視列表、代理,雙擊“訂閱監視列表”,即可看到具體的執行記錄。
(五)總結
如果使用事務復制:
1.對於要同步到備庫的表,必須要有主鍵;
2.被復制的表在主庫無法執行drop、truncate操作;
3.新添加表需要DBA重新手動將其加入到發布中;
4.備庫僅僅作為數據查詢使用,不具備主備切換的功能。