許多 DBA 混淆 記錄鏈、備份鏈/備份記錄、截斷記錄檔。本文以實驗釐清三者關係,並展示 fn_dblog 觀察記錄鏈連續性。
msdb.dbo.backupset 記錄的每次備份操作歷史 (完整、差異、記錄)。
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];
ALTER DATABASE SET RECOVERY SIMPLE (後續無記錄備份)。BACKUP LOG ... WITH TRUNCATE_ONLY (已移除)。-- 檢查是否存在無法跨越的 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