[Windows][SQL]架設 DB Mirroring 的環境在 Windows 2012 ( 2/2 )

[Windows][SQL]架設 DB Mirroring 的環境在 Windows 2012 ( 2/2 )

帳號設定好之後,那我們就可以繼續往下來做資料庫方面的設定囉,基本上要安裝資料庫鏡像,我個人認為有以下四個步驟:

  1. 利用 Backup & Restore 同步來源和目的端的資料庫。
  2. 檢查資料庫連線和防火牆設定
  3. 在目標資料庫上設定資料庫鏡像參數。
  4. 測試

 

同步資料庫

在我們的測試環境中,來源主機是 DBMirror1,目的端主機是 DBMirror2,而目標資料庫我們先拿 AdventureWorks2012 來進行測試。首先我們針對目標資料庫,要先注意一下該資料庫之選項內的「復原模式」,這個部分必須設定為「完整」。

image

 

檢查無誤之後,必須先針對這個目標目標資料庫做「完整備份」和「交易紀錄備份」,並且將所備份出來的這兩個檔案複製到目的電腦上,在目的電腦先針對完成備份的檔案做「還原」處理,這裡有一個重點,就是在還原時必須要在「選項」的頁籤選擇復原模式為「RESTORE WITH NORECOVERY」,這點非常的重要。

image

 

接著還原交易紀錄,一樣要記得選擇「RESTORE WITH NORECOVERY」才可以喔

image

 

完成上述步驟,應該就可以在目的端的電腦上看到有一個複製過來的資料庫,資料庫名稱後面會加上 (正在還原…)

image

 


防火牆設定

Windows 安裝的時候預設防火牆是開啟的,而在設定 Database Mirroring 的時候,兩邊也會用 TCP 互相溝通,因此要針對連線所使用的 Port 開通連線,因此我利用 netsh 的指令,設定開啟 SQL Server 所使用的 TCP 1433 Port,SQL Browse 所使用的 UDP 1434 Port 和 Mirroring 所要使用的 TCP 5022 Port。但如果您的環境所使用的 Port 不同,則就需要自行調整一下 SCIPT 內的設定了。

netsh advfirewall firewall add rule name="SQL Server"    dir=in action=allow protocol=TCP localport=1433
netsh advfirewall firewall add rule name="SQL Browser"   dir=in action=allow protocol=UDP localport=1434
netsh advfirewall firewall add rule name="SQL Mirroring" dir=in action=allow protocol=TCP localport=5022

 

設定完成之後,利用 SSMS 連接來源和目的兩端的 SQL Server 主機,確定設定是正常可以連線的。

image

 

 


資料庫鏡像參數

在資料庫屬性內選擇「鏡像」,接著按下右上方的「設定安全性

image

 

透過「資料庫鏡像安全性精靈」,可以讓我們很方便地透過 Wizard 的方式,一步一步地完成相關設定

image

 

這裡就要看我們想要設定的方式,一種是透過見證伺服器讓他自動偵測資料庫是否有正常運作,等發覺有異常的時候,他會自動把雙方腳色易位,因此如果您的程式使用比較新的開發方式,可以允許您設定 Failover Partner Attribute ( 可以參考 http://msdn.microsoft.com/zh-tw/library/ms366348.aspx ) 的話,那就比較方便了。但因為我所遇到的是一些舊系統,因此在更換資料庫的時候還要同時調整相關設定,因此我這裡先採用不包含見證伺服器

image

 

設定連接 Port,如果這裡要調整的話,則前面設定防火牆的地方也要同步更改。

image

 

接下來要透過連接的按鈕來連接目的伺服器,這裡如果有異常的話,建議大家可以檢查防火牆設定和安全性設定,因為我在安裝 SQL Server 的時候,有指定把 「BUILTIN\Administrators」 群組加入倒 sysadmin 內,而前面第二個步驟也有先設定好防火牆,因此這裡設定就沒有甚麼問題了。

image

image

image

 

在設定服務帳戶的時候,我就根據前一篇所建立的群組受管理服務帳戶,加入到這裡,因為是屬於服務帳戶,因此帳號後面必須多加上一個 $ ,用來識別。

image

image

image

image

 

當前面步驟按下「啟動鏡像」之後,SQL Server 就會開始幫您同步兩邊的資料庫,過了一陣子之後,就可以在下方狀態中看到「已同步處理 資料庫已完全同步」,到這了算是完成一大半了。

image

 


測試資料庫鏡像

當我們完成前述相關設定之後,如果一切都正常的狀況下,那麼在 SSMS 內我們就可以看到類似下方的狀況了

image

 

如果我們想要測試一下兩邊腳色互換的話,一種是直接選擇資料庫屬性,亦或者是在資料庫名稱上按下滑鼠右鍵,選擇「工作」→「 鏡像」,這兩個方式都可以透過同樣的設定介面,選擇「容錯移轉」

image

 

選擇「是」確認要做計畫性移轉

image

 

接著我們就看到 SQL Server 將主體的角色換成給 DBMirror2 了。

image

 

接著我們要測試強制服務,模擬當主體伺服器異常時候,需要緊急將鏡像伺服器上線,但可能會有因為原主體伺服器可能有部分資料尚未移轉到鏡像伺服器上,造成部分資料遺失的狀況發生。為了要模擬這樣的狀況,因此我們先把 DBMirror2 給關機。

image

 

此時需要手動針對現在是鏡像伺服器上的 AdventureWorks2012 的資料庫,透過指令方式設定他變成主體伺服器。

ALTER DATABASE [AdventureWorks2012] SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS

 

重新 Refresh 後,就可以看到 DBMirror1 上的資料庫已經變成主體,但目前還是中斷連接的狀態。

image

 

此時我們恢復 DBMirror2 上線,看這樣會不會造成異常,會發現 DBMirror1 還是可運作,DBMirror2 在關機前的資料庫是主體,但恢復上線之後就會自動變成是鏡像,但此時兩者之間的同步關係已經暫停了。

image

 

接著我們要來重新恢復主體和鏡像之間的連線關係,此時我們選擇 AdventureWorks2012 的資料庫,按下滑鼠右鍵選擇「工作」→「鏡像」之後,確定連線資訊沒有問題的話,按下「繼續

image

 

接著會彈出警告訊息的畫面,因為我們確定是因為使用強制服務所導致的,因此按下「是」表示願意放棄之前 DBMirror2 還是主體時,可能有部分資料沒有複製到 DBMirror1 上的,我們願意承擔遺失那些資料的風險。

image

 

接著就會發現這兩個又重新恢復運作了。

image

 


後記

我個人覺得比較好的解決方案應該是 AlwaysON,但是除了 Windows & SQL Server 都需要升級,資料庫部分還要是 Enterprise 版本才有辦法支援 ( Windows Server 2012 Standard 已經有支援 Cluster 服務 ),整體建置成本目前看起來還算是高的。因此最近遇到一些朋友在討論這些事情的時候,除了預算是很大的一個影響因素之外,加上他們的環境可能資料庫短時間內也沒有辦法升級,所以想說整理一下資料庫鏡像資料的相關設定,或許可以提供給它們另外一種方式來解決。