生產環境要上鏡像,自己又做了一遍測試,總結記錄一下。
目的:實現關鍵數據庫的熱備和故障自動切換。
環境:Win2008_R2_X64,SQLServer2008_R2_X64,WorkGroup網絡模式。
數據庫:people
主機:192.168.1.3
鏡像機:192.168.1.110
見證機:192.168.1.111
准備工作:
-
打開每個實例的RemoteDACEnable.
方法:SSMS選中實例右鍵Facets(方面)在Facet列表選中"Surface area configuration"設定"RemoteDacEnabled"為true。
-
在每台Server的防火牆入站規則中添加鏡像所需端口(我用的是5022).
方法:開始控制面板Windows防火牆高級設置入站規則新增規則
-
對主機的people數據庫做一個全備和事務日志備份並將其COPY到鏡像機上用Replace,NoRecovery選項恢復。
主機備份:
USE master
GO
BACKUP DATABASE [people] TO DISK = N'D:\people.bak'
WITH FORMAT, INIT, NAME = N'people-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10;
GO
BACKUP LOG [people] TO DISK = N'D:\people.bak'
WITH NOFORMAT, NOINIT, NAME = N'people-Transaction Log Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10;
GO
鏡像恢復:
USE master
GO
RESTORE DATABASE [people] FROM DISK = N'F:\people.bak'
WITH FILE = 1,
NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
GO
RESTORE LOG [people] FROM DISK = N'F:\people.bak'
WITH FILE = 2, NORECOVERY, NOUNLOAD, STATS = 10
GO
實施,以下步驟按編號順序執行:
USE master
GO
--創建證書,並備份
CREATE MASTER KEY ENCRYPTION BY PASSWORD=N'joe123';
CREATE CERTIFICATE Cert_JOEPC
WITH SUBJECT=N'JOEPC Certificate',START_DATE='20120405',EXPIRY_DATE='20990405';
BACKUP CERTIFICATE Cert_JOEPC TO FILE=N'C:\Cert_JOEPC.cer';
GO
--創建鏡像端口
CREATE ENDPOINT EP_JOEPC_Mirr
STATE=STARTED
AS TCP
(
LISTENER_PORT=5022,
LISTENER_IP=ALL
)
FOR DATABASE_MIRRORING
(
AUTHENTICATION=CERTIFICATE Cert_JOEPC,
ENCRYPTION=REQUIRED ALGORITHM AES,
ROLE=PARTNER
)
GO
USE master
GO
--創建證書,並備份
CREATE MASTER KEY ENCRYPTION BY PASSWORD=N'joe123';
CREATE CERTIFICATE Cert_110
WITH SUBJECT=N'Certificate 110',START_DATE='20120405',EXPIRY_DATE='20990405';
BACKUP CERTIFICATE Cert_110 TO FILE=N'C:\Cert_110.cer';
GO
--創建鏡像端口
CREATE ENDPOINT EP_110_Mirr
STATE=STARTED
AS TCP
(
LISTENER_PORT=5022,
LISTENER_IP=ALL
)
FOR DATABASE_MIRRORING
(
AUTHENTICATION=CERTIFICATE Cert_110,
ENCRYPTION=REQUIRED ALGORITHM AES,
ROLE=PARTNER
)
GO
USE master
go
--創建證書,並備份
CREATE MASTER KEY ENCRYPTION BY PASSWORD =N'joe123';
CREATE CERTIFICATE Cert_111
WITH SUBJECT=N'Certificate 111';
BACKUP CERTIFICATE Cert_111 TO FILE=N'C:\Cert_111.cer';
GO
--創建鏡像端口
CREATE ENDPOINT EP_111_Mirr
AS TCP
(
LISTENER_PORT=5022,
LISTENER_IP=ALL
)
FOR DATABASE_MIRRORING
(
AUTHENTICATION=CERTIFICATE Cert_111,
ENCRYPTION=REQUIRED ALGORITHM AES,
ROLE=WITNESS
)
GO
4. 把上面三個步驟中備份的證書COPY到每台機,確保每台機都有此三個證書。
5. 主機上執行:
USE master
GO
--為鏡像機訪問主機的鏡像端口而創建登錄和用戶,並授予連接權限
CREATE LOGIN Login_For_110 WITH PASSWORD=N'joe123';
CREATE USER User_For_110 FOR LOGIN Login_For_110;
CREATE CERTIFICATE Cert_For_110 AUTHORIZATION User_For_110 FROM FILE=N'C:\Cert_110.cer';
GRANT CONNECT ON ENDPOINT::EP_JOEPC_Mirr TO Login_For_110;
GO
--為見證機訪問主機的鏡像端口而創建登錄和用戶,並授予連接權限
CREATE LOGIN Login_For_111 WITH PASSWORD=N'joe123';
CREATE USER User_For_111 FOR LOGIN Login_For_111;
CREATE CERTIFICATE Cert_For_111 AUTHORIZATION User_For_111 FROM FILE=N'C:\Cert_111.cer';
GRANT CONNECT ON ENDPOINT::EP_JOEPC_Mirr TO Login_For_111;
GO
USE master
GO
--為主機訪問鏡像機的鏡像端口而創建登錄和用戶,並授予連接權限
CREATE LOGIN Login_For_JOEPC WITH PASSWORD=N'joe123';
CREATE USER User_For_JOEPC FOR LOGIN Login_For_JOEPC;
CREATE CERTIFICATE Cert_For_JOEPC AUTHORIZATION User_For_JOEPC
FROM FILE =N'c:\Cert_JOEPC.cer';
GRANT CONNECT ON ENDPOINT::EP_110_Mirr TO Login_For_JOEPC;
GO
--為見證機訪問鏡像機的鏡像端口而創建登錄和用戶,並授予連接權限
CREATE LOGIN Login_For_111 WITH PASSWORD=N'joe123';
CREATE USER User_For_111 FOR LOGIN Login_For_111;
CREATE CERTIFICATE Cert_For_111 AUTHORIZATION User_For_111
FROM FILE =N'c:\Cert_111.cer';
GRANT CONNECT ON ENDPOINT::EP_110_Mirr TO Login_For_111;
GO
USE master
GO
--為主機訪問見證機的鏡像端口而創建登錄和用戶,並授予連接權限
CREATE LOGIN Login_For_JOEPC WITH PASSWORD=N'joe123';
CREATE USER User_For_JOEPC FOR LOGIN Login_For_JOEPC;
CREATE CERTIFICATE Cert_For_JOEPC AUTHORIZATION User_For_JOEPC FROM FILE=N'c:\Cert_JOEPC.cer';
GRANT CONNECT ON ENDPOINT::EP_111_Mirr TO Login_For_JOEPC;
GO
--為鏡像機訪問見證機的鏡像端口而創建登錄和用戶,並授予連接權限
CREATE LOGIN Login_For_110 WITH PASSWORD=N'joe123';
CREATE USER User_For_110 FOR LOGIN Login_For_110;
CREATE CERTIFICATE Cert_For_110 AUTHORIZATION User_For_JOEPC FROM FILE=N'c:\Cert_110.cer';
GRANT CONNECT ON ENDPOINT::EP_111_Mirr TO Login_For_110;
GO
ALTER DATABASE people SET PARTNER =N'TCP://192.168.1.3:5022';
ALTER DATABASE [people] SET PARTNER=N'TCP://192.168.1.110:5022';
ALTER DATABASE [people] SET WITNESS=N'TCP://192.168.1.111:5022';
主機:
鏡像機:
然后在主機上簡單地查詢一下見證機的狀態:我這里的見證機因為后來重新用GUI配置過,所以顯示為計算機名。
SELECT 'people' AS [DB_Name],mirroring_role_desc,
mirroring_partner_name,mirroring_witness_name,mirroring_witness_state_desc
FROM sys.database_mirroring
WHERE database_id=DB_ID(N'people')

總結:
- 工作組模式下,曾經遇到過兩次主機和鏡像配置成功,見證機總是連接不上的問題。我嘗試過以下方法解決:
- 檢查網絡聯通性,確保見證機的IP和端口可用。
- 給每台機加上FQDN,即設置同樣的DNS后綴名。(方法:計算機右鍵,屬性更改設置更改其他DNS后綴)
- 修改每台機的HOST文件,將計算機名和IP綁定。
- 用SSMS GUI重新配置一次見證機。
- 還遇到過一些其它問題,錯誤提示很明顯,根據其基本能解決。最常見無法建立鏡像的錯誤,是因為鏡像未能與主機一致,備份主機日志到鏡像恢復一次或者重做鏡像。
