資料庫鏡像是 SQL Server 2005 引入的高可用性解決方案,其核心機制是將主資料庫(Principal)的交易記錄即時傳送至鏡像資料庫(Mirror),實現資料的熱備份。鏡像資料庫平時處於恢復中狀態,不可直接讀取,僅在主資料庫發生故障時透過容錯移轉接管服務。
| 優勢 | 限制 |
|---|---|
| 無需共享儲存,硬體成本低 | 以資料庫為單位設定,新增資料庫需重複配置 |
| 支援同步/非同步模式切換 | 登入帳號儲存在 master 資料庫,無法鏡像,需手動同步 |
| 設定相對叢集簡單 | SQL Agent 作業、跨資料庫交易、分散式交易不支援 |
| 客戶端可透明切換(需 .NET 2.0+ / JDBC 1.1+) | 僅 Enterprise/Standard/Developer 版支援,Express 僅能作見證 |
SELECT @@VERSION;
確認版本為 Standard/Enterprise/Developer 後,將目標資料庫設為完整復原模式:
USE master; ALTER DATABASESET RECOVERY FULL;
採用憑證認證避免網域依賴,步驟如下:
-- 主體 USE master; CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'StrongPwd@2024'; CREATE CERTIFICATE HOST_A_cert WITH SUBJECT = 'HOST_A certificate', START_DATE = '01/01/2024'; -- 鏡像 USE master; CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'StrongPwd@2024'; CREATE CERTIFICATE HOST_B_cert WITH SUBJECT = 'HOST_B certificate', START_DATE = '01/01/2024';
-- 主體
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
FOR DATABASE_MIRRORING (
AUTHENTICATION = CERTIFICATE HOST_A_cert,
ENCRYPTION = REQUIRED ALGORITHM AES,
ROLE = ALL
);
-- 鏡像(憑證名稱對調)
-- 主體備份 BACKUP CERTIFICATE HOST_A_cert TO FILE = 'D:\SQLBackup\HOST_A_cert.cer'; -- 鏡像備份 BACKUP CERTIFICATE HOST_B_cert TO FILE = 'D:\SQLBackup\HOST_B_cert.cer';
將 .cer 檔案互相複製到對方的 D:\SQLBackup\ 目錄。
-- 主體執行 CREATE LOGIN HOST_B_login WITH PASSWORD = 'StrongPwd@2024'; CREATE USER HOST_B_user FOR LOGIN HOST_B_login; CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE = 'D:\SQLBackup\HOST_B_cert.cer'; GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login]; -- 鏡像執行(對調名稱)
主資料庫查詢 SID:
USE master; SELECT sid, name FROM syslogins;
鏡像端以相同 SID 建立登入:
USE master; EXEC sp_addlogin @loginame = 'app_user', @passwd = 'Pwd@123', @sid = 0x074477739DCA0E499C29394FFFC4ADE4;
還原成功後,鏡像資料庫將顯示「正在恢復...」圖示。
-- 主體執行 ALTER DATABASE [TargetDB] SET PARTNER = 'TCP://10.168.6.45:5022'; -- 若主體失敗,改在鏡像執行 ALTER DATABASE [TargetDB] SET PARTNER = 'TCP://10.168.6.49:5022';
若報錯「交易記錄未同步」,補做一次記錄備份並還原至鏡像後重試。
| 場景 | T-SQL 指令 |
|---|---|
| 手動容錯移轉(主體發起) | ALTER DATABASE [DB] SET PARTNER FAILOVER; |
| 強制服務(主體宕機,允許資料遺失) | ALTER DATABASE [DB] SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS; |
| 切換同步模式(高安全) | ALTER DATABASE [DB] SET PARTNER SAFETY FULL; |
| 切換非同步模式(高效能) | ALTER DATABASE [DB] SET PARTNER SAFETY OFF; |
sys.database_mirroring 狀態欄位(MIRRORING_STATE_DESC)。