核心觀念:容錯移轉只是戰役的一半
Log Shipping、Replication、Database Mirroring、Always On 可建立備援資料庫,但應用程式能否無縫切換,取決於資料庫外部的相依性是否已預先就緒。
關鍵外部相依性清單
- 登入與使用者:SQL 驗證登入的 SID 必須同步,否則資料庫使用者變成「孤立使用者」
- SQL Agent 作業:備份、維護、ETL 排程
- SSIS/DTS 套件:儲存於 MSDB 或檔案系統
- 連結伺服器:跨實例查詢設定
- 系統資料庫物件:master 中的登入、msdb 中的作業、model 中的預設設定
- 同名資料庫衝突:多租戶環境需規劃命名空間
- 檔案路徑與權限:資料/記錄檔路徑、服務帳號 NTFS 權限
- 應用程式連接字串:DNS 別名、多子網故障轉移支援
登入同步最佳實踐
方案 A:sp_help_revlogin 指令碼(微軟官方)
在主庫執行 sp_help_revlogin 產生含 SID、密碼雜湊的 CREATE LOGIN 指令碼,於備援伺服器執行,完美保留 SID 映射關係。
方案 B:Contained Database(SQL 2012+)
啟用 CONTAINMENT = PARTIAL,使用者直接在資料庫層級建立,無需實例級登入,故障轉移零同步負擔。
方案 C:臨時修復孤立使用者
USE YourDB;
EXEC sp_change_users_login 'UPDATE_ONE', 'DBUser', 'LoginName';
預先部署清單
- 將所有 Agent 作業、SSIS 套件、連結伺服器腳本化,納入版控
- 建立「故障轉移驗證腳本」:檢查登入、作業、連結伺服器、磁碟空間、服務狀態
- 使用 DNS CNAME 或 SQL Client Alias 指向生產實例,切換時只改 DNS/IP,應用端零修改
- 定期演練:每季模擬故障轉移,記錄 RTO/RPO 實測值
拉丁諺語啟示
Si vis pacem, para bellum —— 若想要安寧,須先備戰。災難恢復的本質,是在平時把「戰時」需要的一切都準備妥當。