[SQL]在 Workgroup 環境下設定 SQL Server 資料庫鏡像 ( Database Mirroring )

[SQL]在 Workgroup 環境下設定 SQL Server 資料庫鏡像 ( Database Mirroring )

前一陣子整理一份 Log Shipping 的架設文件,在 FB 上有朋友詢問到,是否可以同時搭配 Database Mirroring + Log Shipping,因此花了一點時間來準備 Mirroring 的環境,順利整理出來以免後續要架設的時候又忘記了。

 

由於在 Workgroup 的環境下,雖然有人介紹過在兩邊都使用相同帳密,就可以不用麻煩的去設定憑證,但這個方式我沒有測試成功,所以就先整理透過憑證的方式來處理,因此過程中就會比較複雜一點,使用較多的指令碼來進行。

 

首先我先架設兩個 VM 來做 Lab , 都安裝好 Windows 2012 R2 Standard + SQL Server 2012 Standard 的版本,資訊如下 :

第一台

電腦名稱 : Primary

網路位址 : 10.40.40.76

角色 : Principal Server

第二台

電腦名稱 : Standby1

網路位址 : 10.40.40.77

角色 : Mirroring Server

 

由於要先建立憑證,因此我先在 Primary 的環境下,用以下的指令碼來建立一組憑證和端點,並且將憑證給備份下來,等一下要複製到 Standby1 的電腦上使用。


-- Primary
SELECT @@SERVERNAME,* FROM sys.symmetric_keys;
GO

-- ##MS_DatabaseMasterKey##
CREATE MASTER KEY ENCRYPTION BY Password = '!QAZ2wsx'
GO

-- 建立憑證
CREATE CERTIFICATE Primary_Mirror_Cert
	WITH SUBJECT = 'DB Mirroring Principal Server Certificate',
	EXPIRY_DATE = '12/31/2100'
 GO

 -- 查看憑證
 SELECT * FROM sys.certificates WHERE name = 'Primary_Mirror_Cert'
 GO

 -- 建立端點
 CREATE ENDPOINT [鏡像] STATE = STARTED 
 AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
 FOR DATABASE_MIRRORING
 (
	AUTHENTICATION = CERTIFICATE Primary_Mirror_Cert,
	ENCRYPTION = REQUIRED ALGORITHM RC4,
	ROLE = ALL
 )
 GO

 -- 備份憑證
 BACKUP CERTIFICATE Primary_Mirror_Cert 
	TO FILE = 'C:\Temp\Primary_Mirror_Cert.cer'
 GO

Standby1 的電腦上,也類似上述的指令,只是把憑證名稱改一下,免得混淆。產生之後我們一樣將憑證備份出來,這個憑證就要複製到 Primary 的電腦上使用了


-- StandBy1
SELECT @@SERVERNAME,* FROM sys.symmetric_keys;
GO

-- ##MS_DatabaseMasterKey##
CREATE MASTER KEY ENCRYPTION BY Password = '!QAZ2wsx'
GO

-- 建立憑證
CREATE CERTIFICATE StandBy1_Mirror_Cert
	WITH SUBJECT = 'DB Mirroring Mirroring Server Certificate',
	EXPIRY_DATE = '12/31/2100'
 GO

 -- 查看憑證
 SELECT * FROM sys.certificates WHERE name = 'StandBy1_Mirror_Cert'
 GO

 -- 建立端點
 CREATE ENDPOINT [鏡像] STATE = STARTED 
 AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
 FOR DATABASE_MIRRORING
 (
	AUTHENTICATION = CERTIFICATE StandBy1_Mirror_Cert,
	ENCRYPTION = REQUIRED ALGORITHM RC4,
	ROLE = ALL
 )
 GO

 -- 備份憑證
 BACKUP CERTIFICATE StandBy1_Mirror_Cert 
	TO FILE = 'C:\Temp\StandBy1_Mirror_Cert.cer'
 GO

這些準備工作完成之後,就可以把備份出來的憑證複製到另外一台去,接下來我們就可以來處理權限的問題了。

首先在 Primary 這一台上,利用以下的程式碼來處理。透過由 Standby1 所複製過來的憑證建立一個可以連接 Primary 端點的帳號


-- PRIMARY
SELECT @@SERVERNAME

-- 建立登入
CREATE LOGIN StandBy1_login WITH 
	PASSWORD='!QAZ2wsx', 
	CHECK_EXPIRATION=OFF, 
	CHECK_POLICY=OFF
GO

-- 建立使用者
CREATE USER StandBy1_User FOR LOGIN StandBy1_login;
GO

-- 建立憑證 ( 
CREATE CERTIFICATE StandBy1_Mirror_Cert
	AUTHORIZATION StandBy1_User
	FROM FILE = 'C:\Temp\StandBy1_Mirror_Cert.cer'
GO

 -- 賦予另外一台可以連接端點的權限
GRANT CONNECT On ENDPOINT::[鏡像] TO [StandBy1_login]
GO

用同樣類似的指令,我們在 Standby1 這一台上,則是另外由 Primary 所複製過來的憑證建立一個可以連接 Standby1 端點的帳號


-- STANDBY1
SELECT @@SERVERNAME

-- 建立登入
CREATE LOGIN Primary_login WITH 
	PASSWORD='!QAZ2wsx', 
	CHECK_EXPIRATION=OFF, 
	CHECK_POLICY=OFF
GO

-- 建立使用者
CREATE USER Primary_User FOR LOGIN Primary_login;
GO

-- 建立憑證 
CREATE CERTIFICATE Primary_Mirror_Cert
	AUTHORIZATION Primary_User
	FROM FILE = 'C:\Temp\Primary_Mirror_Cert.cer'
GO

 -- 賦予另外一台可以連接端點的權限
GRANT CONNECT On ENDPOINT::[鏡像] TO [Primary_login]
GO

透過上述的方式,我們已經將兩台電腦可以有互相信任的帳號連接對方的端點,那麼就可以來進行資料庫上的處理了。因此這裡我們可以透過 GUI 或者是 T-SQL 的指令,將要設定 Mirroring 的資料庫給備份,並且將這些檔案複製到 Standby1 的電腦上。


-- 備份測試資料庫
BACKUP DATABASE MirrorDemo TO DISK='C:\Temp\MirrorDemo_20150616.BAK' 
	WITH COMPRESSION ;
GO

-- 備份測試資料庫
BACKUP LOG MirrorDemo TO DISK='C:\Temp\MirrorDemo_20150616.TRN' 
	WITH COMPRESSION ;
GO

複製過來之後,就可以在 Standby1 的這台上進行還原資料庫的處理,此時要記得在還原資料庫的時候,加入 NORECOVERY 的參數


-- STANDBY1
SELECT @@SERVERNAME

-- 還原資料庫
USE [master]
RESTORE DATABASE [MirrorDemo] FROM  
	DISK = N'C:\Temp\MirrorDemo_20150616.BAK' WITH  NORECOVERY;
GO

-- 還原交易紀錄
RESTORE LOG [MirrorDemo] FROM  
	DISK = N'C:\Temp\MirrorDemo_20150616.TRN' WITH  NORECOVERY;
GO



接下來就要設定最後一個步驟,設定兩邊的資料庫同步,可以透過指令或者是 GUI 來做,原本自己做的時候搞錯了一些設定,造成使用指令去處理會有問題,謝謝 Rock 的提醒,剛剛測試一下是沒有問題的,完全是自己耍白癡,只要記得先到 Standby1 進行設定,設定完再回到 Primary 設定就可以了。

先在 Standby1 的這台上進行設定和 Primary 同步


-- STANDBY1
SELECT @@SERVERNAME

-- 設定跟 Primary 同步
ALTER DATABASE [MirrorDemo]
    SET PARTNER = 'TCP://Primary:5022'
GO

接著在 Primary 這台上進行設定和 Standby1 同步


-- Primary
SELECT @@SERVERNAME

-- 設定跟 Standby1 同步
ALTER DATABASE [MirrorDemo]
    SET PARTNER = 'TCP://Standby1:5022'
GO


最後設定如果懶的處理,也可以用 SSMS 透過精靈來做,但似乎也省不了多少功夫。直接使用 SSMS 上來完成後續的設定,我們在要設定的資料庫上,選擇「工作」→「鏡像」,選擇透過精靈的方式來做設定。

image

 

image

 

因為測試環境中主要焦點是針對權限,因此我們只考慮兩台的環境來做處理

image

image

 

透過「連接」的按鈕設定鏡像伺服器的參數

image

 

設定好之後,因為相關端點和權限我們已經在前面預備的時候,就已經建立好了,因此這個部分就保持空白不用去設定。

image

image

image

 

安裝好之後 SSMS 就會詢問你是否要啟動鏡像,這裡我們就選擇「啟動鏡像」

image

 

image

 

按下「是」之後,過了幾秒鐘之後,就可以看到同步的訊息了。

image

 

而平常我們如果要查看他的運作狀況,也可以透過「資料庫鏡像監視器」,很方便的清楚目前鏡像的狀態。

image