Sql-Server

為什麼我必須備份事務日誌兩次才能縮小?

  • June 15, 2020

這個問題在專家交流中被嘗試了兩次,沒有真正的答案。

我知道我不應該縮小日誌文件——這不是問題。

如果您想回答一個人不應該這樣做 - 這已經被多次證實是的,這不是這個問題的目標。

設置為簡單備份也不是一種選擇。

多年來它一直困擾著我——事實上我現在知道為什麼它應該備份兩次。

我最近看到第一個日誌文件在第一次嘗試時每次都能夠縮小——這令人難以置信。我問了那個人,我所能做的就是“在發布前重組”——我不知道他指的是什麼。我無法再次聯繫到他。

我從 EE 上的現有文章中知道這一點:“收縮會刪除日誌的非活動部分。為了不活動,必須截斷日誌,這作為日誌備份的一部分發生。

但是,事務日誌由許多以循環方式使用的虛擬日誌文件組成。只能修剪文件末尾的虛擬日誌,因此如果 SQL Server 目前正在使用最後一個虛擬日誌,則無法刪除任何內容。sql 7 中的舊修復是執行一個腳本,該腳本執行足夠多的虛擬事務來填充日誌並將指針環繞到第一個虛擬日誌(如果您願意,您仍然可以使用此方法)。

http://support.microsoft.com/kb/256650/EN-US

DBCC 現在為您執行此操作,但仍需要再次截斷日誌的額外步驟,以便可以刪除非活動空間”

來自另一位使用者:“我所要做的就是停止上一個管理員在數據庫維護計劃中留下的自動優化和完整性檢查。”

SQL Server 的事務日誌文件由虛擬日誌文件 (VLF) 組成。收縮日誌文件時,它只會在文件末尾釋放未使用的 VLF。總會有至少一個 VLF 用於目前活動。

考慮這個簡化的例子。您有一個由 6 個大小相同的 VLF 組成的日誌文件。為簡單起見,假設 1 VLF = 1MB,因此總日誌文件為 6MB。你想把它縮小到 3MB。您執行事務日誌備份,這使一些 VLF(我們將隨機選擇 4 個)處於活動狀態,其餘的可供重用:

1____2____3____4_XX_5____6____

現在,您執行收縮,目標大小為 3MB。Shrink 只能在最後刪除未使用的 VLF,但不能一直降低到 3MB 的目標大小:

1____2____3____4_XX_

你不能再縮小了,因為 VLF 4 正在使用中,這就是事情的工作方式。您需要 VLF 4 可供重用,然後才能被截斷。因此,您進行第二次事務日誌備份——VLF 4 被備份,VLF 1 成為活動 VLF:

1_XX_2____3____4____

現在,您可以執行第二次收縮,並將事務日誌縮小到 3MB 的目標大小:

1_XX_2____3____

引用自:https://dba.stackexchange.com/questions/169408