Sql-Server

縮小事務日誌?

  • November 2, 2012

為什麼不建議收縮事務日誌?

你為什麼要?在正常情況下,它無論如何都會重新長出來,直到下一次備份。另外,它會使文件碎片化,這對性能不利。最佳實踐說不要使用自動增長,這自動意味著不要切碎東西,以便它需要增長。

這完全取決於您提出的問題的意思。

一般來說,您不需要定期縮減事務日誌。

但是,有時需要對它進行碎片整理或在事務失控後恢復空間。

碎片化

此程式碼將向您顯示事務日誌的內部結構。

-- get list of VLFs
use AdventureWorks2008R2
go
dbcc loginfo
go

你想看到的是你所有的 VLF 都具有相同的大小。如果您有一個百分比或非常小的增長設置,您最終會得到一個零散的事務日誌。

此外,不要太少或太多。見這篇文章:http ://www.sqlskills.com/blogs/kimberly/post/Transaction-Log-VLFs-too-many-or-too-few.aspx

那麼,你有成百上千的 VLF 嗎?它們都是不同的尺寸嗎?如果是這樣,您的事務日誌是零散的。

修復它

收縮數據文件會將其分片。收縮事務日誌會對其進行碎片整理。

再次執行此程式碼:

-- get list of VLFs
use AdventureWorks2008R2
go
dbcc loginfo
go

狀態為 2 的行是活動的 VLF。它可能在中間的某個地方,我們一開始就想要它。您將無法將日誌縮小到活動 VLF 的位置之外。

多次執行 LOG 備份作業。然後再次執行上面的程式碼。繼續這樣做,直到活動 VLF 位於或接近事務日誌的開頭。

縮小它

執行此程式碼以縮小您的日誌文件。

– 收縮文件,減少 VLF 的數量,從而對事務日誌進行碎片整理 dbcc shrinkfile(‘AdventureWorks2008R2_Log’, 1) go

然後返回並執行上面的程式碼來檢查你的 VLF。您應該會看到 VLF 的數量有所減少。

您可能需要多次重複日誌備份/收縮文件常式。

調整大小

在您的系統執行了幾個業務週期之後,您應該對它的自然大小有一個很好的了解。所以這就是你在縮小/碎片整理後將它的大小。

首先設置增長:

-- manually set the growth
use master
go
alter database AdventureWorks2008R2
modify file (name = 'AdventureWorks2008R2_Log', filegrowth = 512000kb)
go

然後調整大小:

-- manually set the log size
use master
go
alter database AdventureWorks2008R2
modify file (name = 'AdventureWorks2008R2_log', size = 4096000kb)
go

當然,您的數字會有所不同。一件事是,如果您的日誌將變得很大,例如 32G,請不要一次性將其設置為該值。相反,將其增長到 8G,然後是 16G、24G、32G。

還有一件事,避免4G的倍數以避免4G的錯誤。參考這裡:http ://www.sqlskills.com/BLOGS/PAUL/post/Bug-log-file-growth-broken-for-multiples-of-4GB.aspx

所以我使用4000MB或8000MB等。

自動增長和 MaxSize

雖然您確實想手動調整文件大小,但請保持 Autogrow 處於打開狀態,這樣您就不會被流氓程序抓住。

一般來說,我不建議設置 MaxSize,除非您有多個事務日誌共享同一個 LUN,或者如果您有一個數據庫經常執行一個瘋狂的查詢來填滿驅動器。

引用自:https://serverfault.com/questions/198032