首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

善用 SQL Server 事務日誌解決常見故障:意外關機恢復、異地同步 (鏡像/日誌傳送)、災難切換全攻略

     編輯:關於SqlServer

事務日誌核心角色

  • **寫前日誌 (WAL)**:資料變更先寫日誌緩衝區 → 刷盤 (強制) → 異步寫入資料頁 (Checkpoint/Lazy Writer)。
  • **恢復依據**:啟動時 **Redo (前滾)** 已提交交易 + **Undo (回滾)** 未提交交易,保證 ACID。
  • **同步載體**:日誌傳送、資料庫鏡像、AlwaysOn 皆以「傳送/重放日誌記錄」為核心。

故障一:伺服器意外關機 (斷電/藍畫面/殺進程) 導致資料遺失風險

機制

  1. 交易提交時,日誌記錄 **強制寫入磁碟** (Write-Ahead Logging),資料頁**暫留記憶體**。
  2. 斷電瞬間:日誌已持久化,資料頁可能未刷新。
  3. 重啟啟動資料庫:
  • 掃描日誌 → **Redo** 所有已提交交易 (將資料頁帶到最新)。
  • **Undo** 所有未提交交易 (回滾部分變更)。
  • 資料庫進入 **一致狀態 (ONLINE)**。

關鍵操作

  • **檢查日誌可用性**:啟動前確認 `.ldf` 完整、無損毀。若日誌遺失/損壞,**無法 Redo/Undo**,資料庫進入 SUSPECT/EMERGENCY,需人工修復 (見 83722)。
  • **不要強制刪除 .ldf 重建** (除非接受資料遺失且無備份)。
  • **啟用 CHECKSUM 頁面驗證**:`ALTER DATABASE ... SET PAGE_VERIFY CHECKSUM;` 早期偵測硬體損壞。

故障二:異地高可用同步 — 日誌傳送 vs 資料庫鏡像 vs AlwaysOn

方案 A:日誌傳送 — 成熟、低成本、手動切換


主庫 (Primary)          次要庫 (Secondary)          監視器 (Monitor, 可選)
   │                         │                         │
   ├─ BACKUP LOG → 共享資料夾 ← RESTORE LOG WITH STANDBY (唯讀可查詢)
   │       (排程: 15分/1小時)      (排程: 延遲還原)          │
   │                         │                         │
   └─ 清理舊備份              └─ 報告狀態/警報           ← 記錄歷史/發送警報
  • **復原模式限制**:主庫必須 **FULL** 或 **BULK_LOGGED** (SIMPLE 會截斷日誌導致傳送中斷)。
  • **多主一從**:一台次要庫可承載多個主庫備份,節省硬體/授權成本。
  • **切換流程**:手動執行尾部日誌備份 → 次要庫 `RESTORE ... WITH RECOVERY` → 修改連線字串/DNS → 上線。**RTO 分鐘級,RPO = 最後一次傳送間隔**。
  • **優點**:簡單、標準版支援、次要庫可讀 (STANDBY)、頻寬需求低 (壓縮備份)。
  • **缺點**:無自動容錯移轉、切換需人工、次要庫還原期間有延遲。

方案 B:資料庫鏡像 — 自動容錯移轉、同步/非同步模式 (SQL 2005-2016,已淘汰轉 AlwaysOn)

模式同步性資料遺失風險效能影響自動容錯移轉
高安全性 (同步)主從雙寫確認零 (同步提交)主庫延遲 = 網路 RTT + 從庫寫入需見證伺服器支援
高效能 (非同步)主庫不等從庫確認可能 (最後幾筆日誌)主庫幾乎無延遲不支援 (需手動強制服務)
  • **架構**:主體 + 鏡像 (配對) + 見證 (選配,僅高安全性模式用於自動容錯移轉仲裁)。
  • **限制**:單一資料庫、僅 FULL 復原模式、無讀取擴展 (鏡像庫不可讀,需快照)。
  • **角色切換**:自動 (高安全性+見證) 或手動 `ALTER DATABASE ... SET PARTNER FAILOVER`。

方案 C:AlwaysOn 可用性群組 (SQL 2012+ 標準配置) — 企業級首選

  • **群組層級**容錯移轉 (多資料庫原子切換)。
  • **可讀次要複本** (Readable Secondary) — 報表卸載、備份卸載。
  • **多目標** (最多 8 次要,含 2 同步 + 6 非同步)。
  • **靈活容錯移轉策略** (自動/手動/外部)。
  • **無共享儲存需求** (不同於 FCI)。

災難切換實戰 SOP (以日誌傳送為例)

  1. 確認主庫狀態:若主庫仍可存取 → `BACKUP LOG Db_Test TO DISK='...' WITH NORECOVERY` (尾部日誌)。
  2. 次要庫應用尾部日誌:`RESTORE LOG Db_Test_Bak FROM DISK='...' WITH RECOVERY` → 資料庫上線 (零資料遺失)。
  3. 主庫不可存取:次要庫直接 `RESTORE LOG Db_Test_Bak WITH RECOVERY` → **損失尾部日誌後所有交易** (RPO = 最後成功傳送點)。
  4. 驗證業務功能:連線測試、關鍵查詢、寫入測試。
  5. 更新應用配置:連線字串、DNS CNAME、負載平衡器健康檢查。
  6. 事後複盤:RTO/RPO 實測、根因分析、改進備份頻率/網路冗餘。

日誌管理最佳實踐

  • **定期完整備份 + 高頻日誌備份** (如 15 分鐘) — 控制 RPO、截斷日誌空間。
  • **監控 `log_reuse_wait_desc`** — `LOG_BACKUP` (需備份)、`ACTIVE_TRANSACTION` (長交易)、`REPLICATION`/`AVAILABILITY_REPLICA` (同步延遲)。
  • **預設自動增長固定 MB + 瞬間檔案初始化** — 避免 VLF 碎片化 (過多 VLF 導致啟動/還原/備份緩慢)。
  • **異地備份副本** — 至少異地一份 (雲存儲/異地機房)。
  • **定期演練還原** — 未測試的備份 = 無備份。

總結

事務日誌是 SQL Server **靈魂**:
1. **意外關機** — 靠日誌 Redo/Undo 自動修復,**勿動 .ldf**。
2. **異地同步** — 日誌傳送 (手動、成本低)、鏡像 (自動、淘汰中)、**AlwaysOn (現代標準、群組級、可讀次要)**。
3. **災難切換** — 有尾部日誌 = 零遺失;無尾部日誌 = 接受 RPO。
**投資日誌備份基礎設施 (頻率、網路、異地、演練),就是投資資料資產的最終保障。**

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved