資料庫鏡像 是 SQL Server 2005 引入的高可用性技術,以非同步/同步方式將交易記錄從主體伺服器傳送至鏡像伺服器,支援自動容錯移轉 (需見證伺服器)。本文提供三台伺服器環境的完整設定步驟、證書驗證模式與測試腳本。
| 角色 | 主機名/IP | 說明 |
|---|---|---|
| 主體 | A (192.168.137.44) | 提供讀寫服務 |
| 鏡像 | B (192.168.137.32) | 熱備援,同步/非同步接收記錄 |
| 見證 | C (192.168.137.49) | 仲裁自動容錯移轉,不持有資料 |
ccerp_jzt,復原模式 FULL
-- 主體 A:完整備份
BACKUP DATABASE ccerp_jzt TO DISK = N'F:\databak\ccerp_jzt_full.bak' WITH INIT;
-- 記錄備份 (鏡像同步起點)
BACKUP LOG ccerp_jzt TO DISK = N'F:\databak\ccerp_jzt_log.trn' WITH NO_TRUNCATE;
-- 鏡像 B:建立同名空資料庫 (路徑需一致或還原時 MOVE)
RESTORE DATABASE ccerp_jzt FROM DISK = N'F:\databak\ccerp_jzt_full.bak'
WITH NORECOVERY,
MOVE 'ccerp_ydswzip_Data' TO 'D:\Data\ccerp_jzt.mdf',
MOVE 'ccerp_ydswzip_Log' TO 'D:\Data\ccerp_jzt_log.ldf';
RESTORE LOG ccerp_jzt FROM DISK = N'F:\databak\ccerp_jzt_log.trn' WITH NORECOVERY;
-- 主體 A
USE master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'StrongPwd#2024';
CREATE CERTIFICATE HostA_Cert WITH SUBJECT = 'HostA Certificate', START_DATE = '2024-01-01';
-- 鏡像 B
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'StrongPwd#2024';
CREATE CERTIFICATE HostB_Cert WITH SUBJECT = 'HostB Certificate', START_DATE = '2024-01-01';
-- 見證 C
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'StrongPwd#2024';
CREATE CERTIFICATE HostC_Cert WITH SUBJECT = 'HostC Certificate', START_DATE = '2024-01-01';
-- 主體 A (ROLE = ALL 可作主體/鏡像)
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
FOR DATABASE_MIRRORING
(AUTHENTICATION = CERTIFICATE HostA_Cert, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = ALL);
-- 鏡像 B
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
FOR DATABASE_MIRRORING
(AUTHENTICATION = CERTIFICATE HostB_Cert, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = ALL);
-- 見證 C (ROLE = WITNESS)
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
FOR DATABASE_MIRRORING
(AUTHENTICATION = CERTIFICATE HostC_Cert, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = WITNESS);
-- 各自備份
BACKUP CERTIFICATE HostA_Cert TO FILE = 'E:\HostA_Cert.cer';
BACKUP CERTIFICATE HostB_Cert TO FILE = 'E:\HostB_Cert.cer';
BACKUP CERTIFICATE HostC_Cert TO FILE = 'E:\HostC_Cert.cer';
將三個 .cer 檔案複製到每台伺服器的相同路徑 (如 E:\Certs\),每台最終擁有三個憑證檔。
-- 主體 A 範例:建立 B、C 的登入並授權
CREATE LOGIN HostB_Login WITH PASSWORD = 'ComplexPwd#123';
CREATE USER HostB_User FOR LOGIN HostB_Login;
CREATE CERTIFICATE HostB_Cert AUTHORIZATION HostB_User FROM FILE = 'E:\Certs\HostB_Cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO HostB_Login;
CREATE LOGIN HostC_Login WITH PASSWORD = 'ComplexPwd#123';
CREATE USER HostC_User FOR LOGIN HostC_Login;
CREATE CERTIFICATE HostC_Cert AUTHORIZATION HostC_User FROM FILE = 'E:\Certs\HostC_Cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO HostC_Login;
-- 鏡像 B、見證 C 同理建立其他兩台的登入/使用者/憑證/授權
-- 鏡像 B 執行
ALTER DATABASE ccerp_jzt SET PARTNER = 'TCP://192.168.137.44:5022';
-- 主體 A 執行
ALTER DATABASE ccerp_jzt SET PARTNER = 'TCP://192.168.137.32:5022';
ALTER DATABASE ccerp_jzt SET WITNESS = 'TCP://192.168.137.49:5022';
SELECT
DB_NAME(database_id) AS DatabaseName,
mirroring_role_desc AS Role,
mirroring_state_desc AS State,
mirroring_safety_level_desc AS SafetyLevel,
mirroring_partner_instance AS Partner
FROM sys.database_mirroring
WHERE mirroring_guid IS NOT NULL;
正常應顯示:主體 PRINCIPAL/SYNCHRONIZED、鏡像 MIRROR/SYNCHRONIZED、安全性 FULL (同步)。
| 情境 | 指令 | 執行位置 |
|---|---|---|
| 手動容錯移轉 (主備切換) | ALTER DATABASE ccerp_jzt SET PARTNER FAILOVER; | 主體 |
| 強制服務 (主體掛點,允許資料遺失) | ALTER DATABASE ccerp_jzt SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS; | 鏡像 |
| 恢復鏡像 (原主體修復後) | ALTER DATABASE ccerp_jzt SET PARTNER RESUME; → FAILOVER | 鏡像 (現主體) |
| 切換同步/非同步模式 | SET PARTNER SAFETY FULL/OFF | 主體 |
-T1400。BACKUP LOG ... WITH NO_TRUNCATE,鏡像 RESTORE LOG ... WITH NORECOVERY。