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.備庫僅僅作為資料查詢使用,不具備主備切換的功能