專案進行資料歸檔時,大量寫入導致交易日誌(LDF)暴增,嚴重佔用磁碟空間並拖慢效能。本文提供兩種清理方案:圖形化「分離-刪除-附加」流程,以及適合 SSIS 自動化的 T-SQL 腳本。
此腳本動態取得檔案路徑,啟用 OLE Automation 以刪除實體檔案,完成全自動清理:
-- 1. 取得資料庫檔案路徑
DECLARE @logfilename VARCHAR(100), @datafilename VARCHAR(100);
SELECT @logfilename = physical_name FROM sys.database_files WHERE type = 1;
SELECT @datafilename = physical_name FROM sys.database_files WHERE type = 0;
-- 2. 切換至 master 並分離資料庫
USE master;
EXEC sp_detach_db @dbname = 'TestVFA';
-- 3. 啟用 OLE Automation Procedures(預設關閉)
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;
-- 4. 使用 FileSystemObject 刪除實體 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. 附加資料庫(自動重建日誌)
EXEC sp_attach_single_file_db @dbname = 'TestVFA', @physname = @datafilename;
DUMP TRANSACTION TestDB WITH NO_LOG; -- 清空日誌
DBCC SHRINKFILE ('TestDB_log', 1); -- 收縮日誌檔至 1 MB
BACKUP LOG TestDB WITH NO_LOG; -- 截斷日誌(2008+ 不支援)