Sql-Server

日誌文件大小和 dbcc sqlperf(日誌空間)

  • December 3, 2020

考慮名為 XYZ 的數據庫的以下日誌文件設置:

初始大小 = 250MB,自動增長 500MB,限制為 1GB

我使用以下腳本創建了一個 SQL 作業來監視 XYZ 數據庫 ldf 的大小,並將其插入到名為 ABC 的不同數據庫中的表中。

DECLARE @sql_command VARCHAR(MAX)
DECLARE @action VARCHAR(MAX)
DECLARE @size REAL
DECLARE @sizeUsed REAL

IF exists (SELECT * FROM tempdb.dbo.sysobjects o WHERE o.xtype in ('U') and o.id = OBJECT_ID(N'tempdb..#TempForLogSpace'))
   DROP TABLE #TempForLogSpace;   

CREATE TABLE #TempForLogSpace
(
   DBName varchar(MAX),
   LogSize real,
   LogSpaceUsed real,
   Status int
)

SELECT @sql_command = 'dbcc sqlperf (logspace)' 
INSERT INTO #TempForLogSpace EXEC (@sql_command)

SELECT @size = LogSize, @sizeUsed = LogSpaceUsed FROM #TempForLogSpace WHERE DBName = 'XYZ'

INSERT INTO dbo.ABC.tbl (DBName, FileSize, SpaceUsedPercentage, LoggedDate)
VALUES('XYZ', @size, @sizeUsed, GETDATE())

執行幾個小時後的初步結果如下

在此處輸入圖像描述

我的期望是,

  1. 隨著在數據庫 XYZ 中進行事務,SpaceUsedPercentage = LogSpaceUsed (DBCC) 應該增加,
  2. 如果 ldf 大小達到初始大小,SQL 伺服器會將 ldf 文件大小再增加 500MB, FileSize = LogSize (DBCC) 的值也會增加。

但是看到結果後:

  1. 似乎SpaceUsedPercentage 不時增加/減少 - 實際發生了什麼?
  2. 如果 ldf 達到初始大小 -擷取的FileSize是初始大小還是增加的大小?

感謝您的關注。

根據名為 XYZ 的數據庫的恢復模型,使用的空間會因不同的原因而減少。

首先,事務日誌是“循環的”,這意味著它的一部分(虛擬日誌文件或簡稱 VLF)可以在不再需要時重複使用。將 VLF 標記為重用稱為“清除”或“截斷”事務日誌。

如果 XYZ 處於簡單恢復模型中,那麼只要數據庫中發生檢查點操作(無論是手動的,還是定期發生的自動檢查點之一),VLF 都會被標記為可重用。

如果它處於完全恢復模式,則一旦 VLF 包含的資訊已在日誌備份中備份,就可以重複使用它們。

這很可能是周期性發生的這兩件事之一,導致使用的空間下降。

如果 VLF 沒有足夠快地清除,日誌文件將根據您的配置/期望增長(並且文件大小將更改為增加的大小)。


您應該查看SQL Server 事務日誌體系結構和管理指南上的 MS Docs 頁面,以獲取有關事務日誌如何工作的詳細資訊。

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