2018年12月7日 星期五

log檔和tempdb檔案大小一直增加時,該如何縮小?

在管理SQL Server經常會遇到此類的問題,如果這兩類檔案長的太大的話,
也會造成SQL Server緩慢,因此要控管這兩類檔案的大小,首先來針對log檔的縮小進行說明。
因為資料庫運行時會有大量的新增、刪除、修改等交易,導致log檔必須是記錄這些動作,
在log檔持續長大的情況下,此時要縮小log檔有兩種方式:
1.寫個數小時備份log檔的job排程
2.直接下指令DBCC SHRINKDATABASE
如果這樣子都縮小不下來,那麼就必須查看是否有大量交易正在進行中佔住Log檔案。
接下來是如何縮小tempdb檔案大小,因為此類檔案是主要供Store Procedure建立的暫存物件(#,##開頭的)所使用的
,因此要先下CHECKPOINT指令將在記憶體的資料回寫到資料檔裡,接著再下以指令
--釋放佔用的記憶體
DBCC FREESYSTEMCACHE ('ALL')
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
DBCC FREESESSIONCACHE
GO
特別注意以上這幾行指令只能在系統的離峰時間進行
因為有許多SQL指令的執行計劃快取都存在記憶體裡,一旦清空將導致CPU需要重新編譯執行計劃,有可能造成CPU使用率拉高並持續一段時間,進而使系統緩慢。
以上指令都做好後,接著再DBCC SHRINKDATABASE(N'tempdb')即可。
通常會讓tempdb暴增的原因是在Store Procedure中大量使用暫存表格和物件,使用後也沒有立刻刪除(drop),隨著SP執行次數的增加,暫存物件會持續增加,進而使tempdb檔案愈來愈大。
所以養成良好的撰寫Store Procedure的習慣是很重要的!

沒有留言:

張貼留言

[SQL Server]主動通知SQL Server發生錯誤的機制

當SQL Server有特定錯誤發生時,管理人員也沒有時間經常去查看SQL Server錯誤檔, 於是有時特定錯誤可能很重要時,但卻沒有人被通知到,現在小弟實作一個主動通知的機制。 首先先新增警示,在這裡選擇想要被通知的錯誤訊息的等級或其它設定 接著在回應頁籤中,勾選執...