2013年12月30日 星期一

MS SQL ldf檔太大處理






方法:截斷交易記錄檔->壓縮交易記錄檔

1、截斷交易記錄檔:將資料庫「復原模式」改為「簡單」,即可即斷交易記檔

關於復原模式的官方說明:
http://msdn.microsoft.com/zh-tw/library/ms189275%28v=sql.105%29.aspx

可以從 SQL Server Management Studio
在資料庫上按右鍵->「屬性」->「選項」->「復原模式」進行修改,
或是直接執行以下指令修改。
ALTER DATABASE 資料庫名稱 SET RECOVERY SIMPLE

2、查 ldf 檔的邏輯名稱(name)
執行

SP_HELPDB 資料庫名稱

use 資料庫名稱
GO
select * from sys.database_files


此時可查得 ldf 檔對應到的邏輯名稱(name),一般會是"資料庫名稱_log",
但若之前是從備份資料還原到不同名稱的資料庫,邏輯名稱(name)就可能不一樣。

3、壓縮交易記錄檔
執行以下指令後,應該可以發現ldf的檔案大小縮小成2MB

use 資料庫名稱
GO
DBCC SHRINKFILE('ldf的邏輯名稱',2)

4、將資料庫「復原模式」改回「完整」執行
ALTER DATABASE 資料庫名稱 SET RECOVERY FULL

備註1:mdf 和 ldf 檔的邏輯名稱(name)修改指令如下
alter database 資料庫名稱 modify file(name=舊mdf的name, newname=新mdf的name)
alter database 資料庫名稱 modify file(name=舊ldf的name, newname=新ldf的name)
備註2:經測試,將資料庫「復原模式」改成「簡單」,接著改回「完整」,最後再進行「壓縮交易記錄檔」的操作,似乎也是可行。
備註3:MS SQL 2005 以前的版本,
可以使用"BACKUP LOG 資料庫名稱 WITH NO_LOG"
或"BACKUP LOG 資料庫名稱 WITH TRUNCATE_ONLY"截斷交易記錄檔,
但在MS SQL 2008之後已不建議使用這兩個指令。
http://msdn.microsoft.com/en-us/library/ms144262%28v%3Dsql.100%29.aspx

寫成維護計劃
DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=3)
BEGIN
--------------------------
--HRExportData Start--
--------------------------
--先做一次交易紀錄備份作業
USE HRExportData
Backup Log[HRExportData]To Disk=N'NUL';
DBCC SQLPERF(LOGSPACE);
DBCC LOGINFO

--用DBCC SHRINKFILE來將LDF檔壓縮到2MB
DBCC SHRINKFILE('HRExportData_log',1)
DBCC SQLPERF(LOGSPACE);
DBCC LOGINFO

SET @intFlag  = @intFlag + 1
END

沒有留言: