壓縮交易記錄檔

如果您知道交易記錄檔包含不再需要的未使用空間,就可以透過減少交易記錄的大小,回收過多的空間。此程序稱為「壓縮」(Shrinking) 記錄檔。

只有當資料庫已上線,而且至少有一個虛擬記錄檔可用時,才可以進行壓縮。在某些情況下,壓縮記錄可能要等到下一個記錄截斷之後才能進行。

[!附註]

一般而言,截斷會自動在簡單復原模式 (資料庫已備份時) 和完整復原模式 (交易記錄已備份時) 底下進行。不過,截斷可能會因為許多因素而延遲。如需詳細資訊,請參閱<可能會延遲記錄截斷的因素>。

若要壓縮記錄檔 (但不壓縮資料庫檔案)

若要監視記錄檔壓縮事件

To monitor log space

[!附註]

壓縮資料庫和記錄檔的作業可設定為自動進行。不過,我們建議您不要進行自動壓縮,而且 autoshrink 資料庫屬性預設為 FALSE。如果 autoshrink 設定為 TRUE,只有當超過 25% 的空間未使用時,自動壓縮才會減少檔案的大小。此時,檔案會壓縮成只有 25% 的檔案是未使用空間的大小,或檔案的原始大小,以較大者為準。如需有關變更 autoshrink 屬性之設定的詳細資訊,請參閱<如何:檢視或變更資料庫的屬性 (SQL Server Management Studio)>:使用 [選項] 頁面上的 [自動壓縮] 屬性或<ALTER DATABASE SET 選項 (Transact-SQL)>:使用 AUTO_SHRINK 選項。

壓縮記錄檔如何運作?

壓縮交易記錄可透過移除一或多個非使用中虛擬記錄檔,縮減實體大小。大小縮減的單位一律為一個虛擬記錄檔。例如,如果您有一個 600 MB 的記錄檔,而且已經分割成 6 個 100 MB 的虛擬記錄檔,記錄檔的大小就只能以 100 MB 的增量為單位來縮減。檔案大小可縮減為 500 MB 或 400 MB 的大小,但不能縮減為 433 MB 或 525 MB 這類的大小。保存任何使用中記錄檔記錄的虛擬記錄檔 (亦即,「使用中虛擬記錄檔」) 是邏輯記錄的一部分,而且無法加以移除。如需詳細資訊,請參閱<交易記錄檔實體架構>。

[!附註]

建立或擴充記錄檔時,Database Engine 會以動態方式選擇虛擬記錄檔的大小。如需詳細資訊,請參閱<交易記錄檔實體架構>。

對於記錄檔而言,目前的大小與虛擬記錄檔所用的頁面總大小相同。不過,請注意,記錄檔不會使用頁面。保存部分邏輯記錄的虛擬記錄檔無法釋出。如果記錄檔中的所有虛擬記錄檔都保存部分邏輯記錄,就無法壓縮此檔案。要等到記錄截斷將一或多個虛擬記錄檔標示為非使用中之後,才能進行壓縮。

壓縮檔案作業只能移除非使用中的虛擬記錄檔。如果沒有指定目標大小,壓縮檔案作業只會移除超過上一個使用中虛擬記錄檔的非使用中虛擬記錄檔。如果指定了目標大小,指定的壓縮檔案作業就只會移除接近但不超過目標大小所需的非使用中虛擬記錄檔。進行壓縮之後,記錄檔通常會稍微比目標大小更大,但絕對不會更小。虛擬記錄檔會讓您難以預測記錄檔實際壓縮的程度。

檔案壓縮時,釋出的空間必須來自檔案結尾。壓縮交易記錄檔之後,記錄檔結尾會釋出足夠的虛擬記錄檔,以便將記錄檔縮減成使用者要求的大小。使用者所指定的 target_size 將進位至第二高的虛擬記錄檔界限。例如,如果使用者針對我們包含六個 100 MB 虛擬記錄檔的 600 MB 範例檔,指定了 325MB 的 target_size,最後的兩個虛擬記錄檔將被移除,而新的檔案大小則為 400 MB。

DBCC SHRINKDATABASE 或 DBCC SHRINKFILE 作業會立即嘗試將實體記錄檔壓縮為所要求的大小:

  • 如果邏輯記錄檔沒有任何部分位於 target_size 標示之外的虛擬記錄檔中,target_size 標示之後的虛擬記錄檔將會釋出,且在順利完成 DBCC 陳述式時不會顯示任何訊息。

如果虛擬記錄檔中的部分邏輯記錄檔確實超過 target_size 標示,SQL Server Database Engine 將盡可能釋出最多的空間,並發出參考用訊息。此訊息將告訴您需要執行哪些動作,才能從檔案結尾的虛擬記錄檔移除邏輯記錄檔。執行此動作之後,您可以重新發出 DBCC 陳述式來釋出剩餘的空間。

例如,假設包含六個虛擬記錄檔的 600 MB 記錄檔,其中有一個邏輯記錄開始於虛擬記錄檔 3,而結束於虛擬記錄檔 4,當您執行將 target_size 設成 275 MB (虛擬記錄檔 3 的四分之三) 的 DBCC SHRINKFILE 陳述式時:

在壓縮之前具有六個虛擬記錄檔的記錄檔

因為虛擬記錄檔 5 與 6 並未包含邏輯記錄檔的任何部分,所以會立即釋出。不過,若要符合指定的 target_size,虛擬記錄檔 4 也應被釋出,但是因為它包含了邏輯記錄檔的結束部分,因此無法被釋出。釋出虛擬記錄檔 5 與 6 之後,Database Engine 會以虛擬記錄來填滿虛擬記錄檔 4 的剩餘部分。這樣會將記錄檔的結尾強制到虛擬記錄檔 1 的結尾。在大多數系統中,以虛擬記錄檔 4 開始的所有交易都可迅速認可。這表示記錄檔的整個使用中部分會移至虛擬記錄檔 1。記錄檔現在看起來如下:

記錄檔已縮減為 4 個虛擬檔案

DBCC SHRINKFILE 陳述式也會發出參考用訊息,指出無法釋出所有要求的空間,並指示您可以執行 BACKUP LOG 陳述式來釋出剩餘的空間。將記錄的使用中部分移到虛擬記錄檔 1 之後,BACKUP LOG 陳述式將截斷位於虛擬記錄檔 4 中的整個邏輯記錄:

在截斷記錄檔之後的記錄檔結果

因為虛擬記錄檔 4 不再保留邏輯記錄檔的任何部分,您現在就可以執行同樣的 DBCC SHRINKFILE 陳述式,將 target_size 設為 275 MB。接著會釋出虛擬記錄檔 4,且實體記錄檔的大小將縮減為您要求的大小。

[!附註]

某些因素 (例如,長時間執行的交易) 可能讓虛擬記錄檔長期保持在使用中的狀態。這可能會限制記錄的壓縮,或甚至導致記錄完全無法壓縮。如需詳細資訊,請參閱<可能會延遲記錄截斷的因素>。