資料庫鏡像 (Database Mirroring) 是 SQL Server 經典高可用方案。本文提供從端點建立、備份還原、夥伴/見證配置、安全授權到狀態驗證的**完整可執行 T-SQL 腳本**,適配 SQL Server 2005~2019。
所有節點需同版本、同版次、同補丁;防火牆開放 **TCP 5022** (預設鏡像端口)。
-- MIR-A (Principal) & MIR-B (Mirror): ROLE = PARTNER
CREATE ENDPOINT DB_MirroringEP
STATE = STARTED
AS TCP (LISTENER_PORT = 5022)
FOR DATABASE_MIRRORING (ROLE = PARTNER, ENCRYPTION = SUPPORTED);
GO
-- MIR-W (Witness): ROLE = WITNESS
CREATE ENDPOINT DB_MirroringEP
STATE = STARTED
AS TCP (LISTENER_PORT = 5022)
FOR DATABASE_MIRRORING (ROLE = WITNESS, ENCRYPTION = SUPPORTED);
GO
-- 驗證端點
SELECT * FROM sys.database_mirroring_endpoints;
-- 假設服務帳號為 DOMAIN\sqlsvc
GRANT CONNECT ON ENDPOINT::DB_MirroringEP TO [DOMAIN\sqlsvc];
GO
-- MIR-A: 完整備份
BACKUP DATABASE AdventureWorks TO DISK = 'C:\Backup\AdventureWorks.bak' WITH COMPRESSION, STATS=5;
GO
-- 複製 .bak 到 MIR-B (安全複製)
-- MIR-B: 無恢復還原 (關鍵:NORECOVERY)
RESTORE DATABASE AdventureWorks
FROM DISK = 'C:\Backup\AdventureWorks.bak'
WITH NORECOVERY, STATS=5, MOVE 'AdventureWorks_Data' TO 'D:\Data\AdventureWorks.mdf', MOVE 'AdventureWorks_Log' TO 'L:\Log\AdventureWorks.ldf';
GO
-- 如有差異備份/日誌備份,依序 NORECOVERY 還原
-- 4.1 MIR-B (Mirror) 先指定 Principal 夥伴
ALTER DATABASE AdventureWorks SET PARTNER = N'TCP://MIR-A.yourdomain.com:5022';
GO
-- 4.2 MIR-A (Principal) 指定 Mirror 夥伴
ALTER DATABASE AdventureWorks SET PARTNER = N'TCP://MIR-B.yourdomain.com:5022';
GO
-- 4.3 MIR-A 指定 Witness
ALTER DATABASE AdventureWorks SET WITNESS = N'TCP://MIR-W.yourdomain.com:5022';
GO
-- 4.4 設定安全等級 (High-Safety 同步模式)
ALTER DATABASE AdventureWorks SET SAFETY FULL;
GO
-- 1. SSMS 物件總管:資料庫圖示顯示 (Principal, Synchronized) / (Mirror, Synchronized / Restoring)
-- 2. 資料庫屬性 → 鏡像頁籤:狀態、運作模式、見證狀態
-- 3. 系統目錄查詢
SELECT
db_name(database_id) AS DatabaseName,
mirroring_state_desc, -- SYNCHRONIZED / SUSPENDED / PENDING_FAILOVER
mirroring_role_desc, -- PRINCIPAL / MIRROR
mirroring_safety_level_desc, -- FULL / OFF
mirroring_witness_state_desc,
mirroring_connection_timeout
FROM sys.database_mirroring
WHERE database_id = DB_ID('AdventureWorks');
| 錯誤 | 原因 | 對策 |
|---|---|---|
| 1418: 網路地址無法到達 | 端口未開、防火牆、主機名解析失敗 | telnet 5022、hosts 檔/IP 直連、DNS |
| 1416: 無法成為鏡像 | Mirror DB 不在 NORECOVERY / LSN 斷裂 | 重新完整備份+NORECOVERY 還原、補齊日誌鏈 |
| 1456: 見證無法連接 | Witness 端點角色錯/防火牆/授權 | 檢查 ROLE=WITNESS、GRANT CONNECT、端口 |
SQL Server 2012+ 推薦使用 **AlwaysOn Availability Groups**:支援多副本、可讀次要、無見證單點、群組故障轉移、聽眾器自動導流。鏡像已進入維護模式,新架構請直接上 AG。