爲本次實驗我搭建了3臺虛擬機,均是windows2003+sql2008,各分配內存爲500M。
拓補圖如下:
sql-1===用作主服務器 =ip:10.40.1.10
sql-2===用作鏡像服務器 =ip:10.40.1.11
sql-3===用作見證服務器 =ip:10.40.1.12
本次環境爲工作組,爲方便驗證3臺都已administrator來登入登入密碼都一樣
首先在對象資源管理器裏分別連接到這3臺服務器
若無法連接,請在各自服務器的sql網絡配置裏啓動named pipes和tcp/ip協議
然後再SQL-1上建立一個測試用的數據庫如:ositpro
並設置數據庫恢復模式爲完整
代碼如下:
alter database ositpro set recovery full with no_wait |
圖形界面的設置位置在數據庫的屬性-選項裏,如下圖
接着分別在SQL-1服務器的D盤根目錄下建立存放備份的文件夾:sqlbak
在SQL-2服務器的D盤根目錄下建立同樣的目錄並設置共享權限:sqlbak及保存鏡像還原保存數據及
文件夾建立後我們在SQL-1上備份剛纔創建的ositpro數據庫到sqlbak目錄
backup database ositpro to disk='d:/sqlbak/ositpro.bak' |
備份完畢後我們將數據拷到sql-2上的sqlbak目錄下,然後再sql-1上直接還原數據庫
選擇目標數據庫,源備份文件
將行數據及日誌另存到D盤sqldata目錄下,並選擇恢復模式的第2條:restore with norecovery
還原完畢
接下來分別在3臺服務器上創建用於偵聽對象的TCP端點
因爲3臺SQL服務器所使用的實例都不一樣,所以端口號可以相同,反之必須不同
SQL-1執行下面腳本
create endpoint endpoint_mirroring state=started as tcp(listener_port=5022) for database_mirroring(authentication=windows ntlm,encryption=supported,role=partner) go |
create endpoint endpoint_mirroring state=started as tcp(listener_port=5022) for database_mirroring(authentication=windows ntlm,encryption=supported,role=partner) go |
create endpoint endpoint_mirroring state=started as tcp(listener_port=5022) for database_mirroring(authentication=windows ntlm,encryption=supported,role=witness) go |
ALTER DATABASE ositpro SET PARTNER='TCP://sql-1:5022'; |
ALTER DATABASE ositpro SET PARTNER='TCP://sql-2:5022'; GO ALTER DATABASE ositpro SET WITNESS='TCP://sql-3:5022';
GO |
接下來進行模擬故障切換
首先在sql-2上打開數據庫鏡像監視器,此狀態每10秒更新一次
此時sql-1爲主體服務器,sql-2爲鏡像,下面我們禁用sql-1的網卡
由下圖可以看到sql-1的數據庫狀態變成了正在恢復,sql-2變成了主體,因爲沒有了鏡像服務器,所以顯示
在sql-2上的鏡像監視器裏可以看到,sql-2當前腳色爲主體,鏡像狀態爲斷開,見證服務器連接正常
此時如果sql-1的網卡回覆正常sql-2還是主服務器,sql-1變成了鏡像服務器了
2個不會恢復原始狀態的,如需切換到初始環境使用下面代碼在sql-1上執行即可
ALTER DATABASE ositpro SET PARTNER FAILOVER |