資料歸檔、大批次導入、長事務未提交,常導致MSSQL日誌文件(LDF)暴增至百GB,佔滿磁碟、拖垮效能。本文提供兩套生產驗證方案:圖形化「分離-刪除-附加」與可自動化的T-SQL腳本(含Ole Automation啟用)。
xxx_log.ldf風險:分離期間服務不可用;若MDF損壞無法附加,需從備份恢復。
master,分離資料庫(sp_detach_db)sp_OA系列存儲過程調用Scripting.FileSystemObject刪除LDF物理文件sp_attach_single_file_db僅掛載MDF,自動重建LDF-- 1. 獲取文件路徑
DECLARE @logfilename VARCHAR(100), @datafilename VARCHAR(100);
SELECT @logfilename = physical_name FROM sys.database_files WHERE type = 1; -- log
SELECT @datafilename = physical_name FROM sys.database_files WHERE type = 0; -- data
-- 2. 啟用 Ole Automation(預設關閉,需sysadmin)
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;
-- 3. 切換 master 並分離
USE master;
EXEC sp_detach_db @dbname = 'TestVFA';
-- 4. 刪除 LDF 物理文件
DECLARE @Result INT, @FSO_Token INT;
EXEC @Result = sp_OACreate 'Scripting.FileSystemObject', @FSO_Token OUTPUT;
EXEC @Result = sp_OAMethod @FSO_Token, 'DeleteFile', NULL, @logfilename;
EXEC @Result = sp_OADestroy @FSO_Token;
-- 5. 單文件附加(自動重建 LDF)
EXEC sp_attach_single_file_db @dbname = 'TestVFA', @physname = @datafilename;
DUMP TRANSACTION TestDB WITH NO_LOG; -- 截斷日誌
DBCC SHRINKFILE ('TestDB_log', 1); -- 收縮至1MB
BACKUP LOG TestDB WITH NO_LOG; -- 同DUMP
現代替代:簡單恢復模式下DBCC SHRINKFILE;完整恢復模式需先BACKUP LOG再收縮。
| 措施 | 說明 |
|---|---|
設置合理MAXSIZE與FILEGROWTH | 避免無限增長或頻繁小幅增長(預設10%極差),建議固定增長512MB/1GB |
定期BACKUP LOG | 完整恢復模式下唯一釋放VLF的方式,配合維護計畫每15-60分鐘備份一次 |
大批次操作切換BULK_LOGGED | 最小化日誌記錄,操作後切回FULL |
監控log_reuse_wait_desc | SELECT name, log_reuse_wait_desc FROM sys.databases,非NOTHING需排查 |
清理只是止痛,合理的恢復模式、備份策略、自動增長配置才是治本之道。