萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

SQL Server 清理交易記錄檔 (LDF) 兩大法:收縮資料庫 vs 手動 T-SQL 截斷

LDF 檔案暴增佔滿磁碟是常見營運災難。提供兩種清理法:**圖形介面收縮 (簡單、適合維護窗口)** 與 **T-SQL 手動截斷 (精確控制、無維護窗口)**。

方法一:SSMS 圖形介面收縮 (簡單模式切換)

  1. SSMS → 資料庫右鍵 → 「屬性」 → 「選項」 → 復原模式 = 簡單
  2. 右鍵資料庫 → 「工作」 → 「收縮」 → 「檔案」 → 檔案類型選「記錄」 → 「釋放未使用空間」/「重組頁面再釋放」
  3. 完成後 **改回完整模式** (生產環境必須),並立即做**完整備份**啟動新記錄鏈

優點:操作直觀、自動處理 VLF。
缺點:需切換復原模式、中斷記錄鏈、大 LDF 耗時久。

方法二:T-SQL 精確控制 (不切換復原模式、生產適用)

SET NOCOUNT ON;
DECLARE @LogicalFileName SYSNAME = 'YourDB_log',  -- 邏輯檔名 (非物理路徑)
        @MaxMinutes INT = 10,                     -- 最大允許包裝時間
        @NewSizeMB INT = 100;                     -- 目標大小 (MB)

USE YourDB;

-- 1. 記錄原始大小
DECLARE @OriginalSize INT = (SELECT size FROM sys.database_files WHERE name = @LogicalFileName);
PRINT 'Original Log Size: ' + CAST(@OriginalSize * 8 / 1024.0 AS VARCHAR(20)) + ' MB';

-- 2. 建立虛擬表填充記錄強制包裝
CREATE TABLE #DummyTrans (DummyColumn CHAR(8000) NOT NULL);
DECLARE @Counter INT, @StartTime DATETIME = GETDATE();
DECLARE @TruncLog NVARCHAR(MAX) = 'BACKUP LOG [' + DB_NAME() + '] WITH TRUNCATE_ONLY'; -- 2008 以前
-- SQL 2008+ 簡單模式下用: BACKUP LOG [DB] WITH NO_LOG; (已移除)
-- 完整模式下必須先備份記錄再收縮

-- 3. 簡單模式下直接收縮
DBCC SHRINKFILE (@LogicalFileName, @NewSizeMB);

-- 4. 完整模式下: 備份記錄 → 收縮
-- BACKUP LOG YourDB TO DISK = 'NUL:';  -- 丟棄備份 (極度不推薦,僅緊急)
-- DBCC SHRINKFILE (@LogicalFileName, @NewSizeMB);

-- 5. 若未達目標,迴圈寫入虛擬資料強制 VLF 包裝
WHILE @MaxMinutes > DATEDIFF(MI, @StartTime, GETDATE())
  AND @OriginalSize = (SELECT size FROM sys.database_files WHERE name = @LogicalFileName)
  AND (@OriginalSize * 8 / 1024) > @NewSize
BEGIN
    SET @Counter = 0;
    WHILE @Counter < @OriginalSize / 16 AND @Counter < 50000
    BEGIN
        INSERT #DummyTrans VALUES ('Fill Log');
        DELETE #DummyTrans;
        SET @Counter += 1;
    END
    -- 簡單模式無需 BACKUP LOG TRUNCATE_ONLY
    DBCC SHRINKFILE (@LogicalFileName, @NewSizeMB);
END

PRINT 'Final Log Size: ' + CAST((SELECT size FROM sys.database_files WHERE name = @LogicalFileName) * 8 / 1024.0 AS VARCHAR(20)) + ' MB';
DROP TABLE #DummyTrans;
SET NOCOUNT OFF;

版本差異關鍵點

版本截斷指令備註
SQL 2000/2005BACKUP LOG db WITH TRUNCATE_ONLY已棄用
SQL 2008+簡單模式下自動截斷 / 完整模式需 BACKUP LOG TO DISKTRUNCATE_ONLY/NO_LOG 已移除

最佳實踐:預防勝於治療

  1. 完整模式 + 定期記錄備份 (每 15-60 分鐘) → LDF 自然循環復用,不會暴增
  2. 監控 VLF 數量:DBCC LOGINFO,VLF > 1000 影響啟動/還原/備份速度
  3. 預先規劃 LDF 初始大小/增長量:避免 10%/1MB 預設值導致頻繁自動增長碎片
  4. 大量載入/索引重建:暫切簡單模式或預先放大 LDF

緊急情況清單

  • 磁碟剩餘 < 10% → 立即切簡單模式 + SHRINKFILE
  • 記錄備份失敗導致 LDF 爆滿 → 修復備份作業 → 手動備份記錄 → SHRINKFILE
  • 異常長交易 (open transaction) → DBCC OPENTRAN 找出 → KILL 或等待提交
copyright © 萬盛學電腦網 all rights reserved