問題背景:
客戶反饋sqlserver數據庫日志增長迅速,兩分鍾增長好幾個g,目前數據庫已改為簡單模式
sqlserver 日志文件不停增長的原因
日志不停增長的原因
1.數據庫是完整模式,但是並沒有定期的進行日志備份。日志備份可以截斷事務,可以使得空間重用。
解決這個問題,只需做好日志定時備份的計划作業就行
2.有事務長時間沒有提交
由於開發人員的粗心大意,沒有把已經運行完成的事務提交,日志一直在記錄,導致很大
解決這個問題,查找出已經運行完成但沒有提交的事務,kill掉此事務即可
3.有很大的事務正在運行
這個事務很大,一直不停的在記錄大量的日志,導致日志增大
解決這個問題,看看在語句和業務邏輯上看看能否優化的余地,運行很大的事務能否分事務運行
造成2,3兩種情況的根本原因是因為:日志備份只備份已提交的事務
還需要注意的是:只有日志備份才能截斷日志,使得日志空間可以重用!!!
問題排查:
1 DBCC SQLPERF(LOGSPACE) 2 GO 3 SELECT name,recovery_model_desc,log_reuse_wait,log_reuse_wait_desc 4 FROM sys.databases 5 GO
如果大部分日志都在使用中且重用狀態為:ACTIVE_TRANSACTION,那么要看看最久的事務是誰申請的
步驟2:檢查最久的活動事務:
如果大部分日志都在使用中且重用狀態為:ACTIVE_TRANSACTION,那么要看看最久的事務是誰申請的:
1 DBCC OPENTRAN 2 GO 3 SELECT * 4 FROM sys.dm_exec_sessions AS t2 , 5 sys.dm_exec_connections AS t1 6 CROSS APPLY sys.dm_exec_sql_text(t1.most_recent_sql_handle) AS st 7 WHERE t1.session_id = t2.session_id 8 AND t1.session_id > 50
查看spid為314的進程,text為一條刪除語句,delete from modeDataShare_141
如果Log Space Used(%)很高,就要馬上定位為什么不能被清除。如果狀態為:LOG_BACKUP,意味着SQLServer等待着日志備份。要檢查是否需要做日志備份。
此現象符合
2.有事務長時間沒有提交
由於開發人員的粗心大意,沒有把已經運行完成的事務提交,日志一直在記錄,導致很大
解決這個問題,查找出已經運行完成但沒有提交的事務,kill掉此事務即可
3.有很大的事務正在運行
這個事務很大,一直不停的在記錄大量的日志,導致日志增大
解決這個問題,看看在語句和業務邏輯上看看能否優化的余地,運行很大的事務能否分事務運行
需要程序層面及時提交事務