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

SQL Server 記錄鏈 (Log Chain) 概念澄清:備份集 vs 記錄鏈 vs 截斷

     編輯:關於SqlServer

許多 DBA 混淆 記錄鏈、備份鏈/備份記錄、截斷記錄檔。本文以實驗釐清三者關係,並展示 fn_dblog 觀察記錄鏈連續性。

核心定義

  • 記錄鏈:指交易記錄檔 (LDF) 內部 LSN 序列的連續性。完整備份/差異備份包含資料+記錄,記錄備份僅包含記錄。只要 LSN 無斷點,記錄鏈即完整。
  • 備份記錄:msdb.dbo.backupset 記錄的每次備份操作歷史 (完整、差異、記錄)。
  • 截斷記錄檔:將 VLF 狀態從 In Use 變為 Free,釋放空間供覆寫。不等於 記錄鏈斷裂。
備份壓縮包比喻

實驗環境與腳本

USE master;
GO
CREATE DATABASE LogChainTest;
GO
ALTER DATABASE LogChainTest SET RECOVERY FULL;
GO

USE LogChainTest;
GO
CREATE TABLE dbo.t (id INT IDENTITY, val CHAR(8000) DEFAULT 'x');
GO

-- 1. 完整備份 (建立基準 LSN)
BACKUP DATABASE LogChainTest TO DISK='NUL:' WITH INIT, STATS=10;
GO

-- 2. 產生記錄
INSERT INTO dbo.t DEFAULT VALUES;
GO 100

-- 3. 記錄備份
BACKUP LOG LogChainTest TO DISK='NUL:';
GO

-- 4. 觀察 fn_dblog LSN 連續性
SELECT
    [Current LSN],
    [Previous LSN],
    Operation,
    Context,
    [Transaction ID]
FROM fn_dblog(NULL, NULL)
WHERE Operation IN ('LOP_BEGIN_XACT','LOP_COMMIT_XACT','LOP_INSERT_ROWS')
ORDER BY [Current LSN];

關鍵觀察點

  1. 完整備份不斷開記錄鏈:它只標記「備份起始 LSN」,後續記錄備份從該 LSN 續接。
  2. 記錄備份後 VLF 可被截斷,但 LSN 序列在邏輯上仍連續 (下一筆記錄的 Previous LSN 指向上一筆)。
  3. 斷開記錄鏈的操作:
     - ALTER DATABASE SET RECOVERY SIMPLE (後續無記錄備份)。
     - BACKUP LOG ... WITH TRUNCATE_ONLY (已移除)。
     - 切換復原模式 (FULL→SIMPLE→FULL) 會重置記錄鏈,需新完整備份重建。

實務判斷記錄鏈是否完整

-- 檢查是否存在無法跨越的 LSN 斷點
SELECT
    database_name,
    backup_start_date,
    type, -- D=Full, I=Diff, L=Log
    first_lsn,
    last_lsn,
    database_backup_lsn,
    checkpoint_lsn
FROM msdb.dbo.backupset
WHERE database_name = 'LogChainTest'
ORDER BY backup_start_date;

-- 邏輯:某記錄備份的 first_lsn 必須 <= 前一筆記錄備份的 last_lsn
-- 且 first_lsn >= 最近一次完整/差異備份的 database_backup_lsn

總結

  • 記錄鏈 = LSN 連續性,支援時間點還原 (Point-in-Time Recovery)。
  • 備份記錄 = 歷史操作紀錄,供管理員審計、腳本自動化還原。
  • 截斷 = 空間回收,不影響 LSN 邏輯連續性 (除非切換復原模式)。
  • 維護完整記錄鏈的鑰匙:FULL 復原模式 + 定期記錄備份 + 避免切換復原模式。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved