Sql-Server
日誌文件大小和 dbcc sqlperf(日誌空間)
考慮名為 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())
執行幾個小時後的初步結果如下
我的期望是,
- 隨著在數據庫 XYZ 中進行事務,SpaceUsedPercentage = LogSpaceUsed (DBCC) 應該增加,
- 如果 ldf 大小達到初始大小,SQL 伺服器會將 ldf 文件大小再增加 500MB, FileSize = LogSize (DBCC) 的值也會增加。
但是看到結果後:
- 似乎SpaceUsedPercentage 不時增加/減少 - 實際發生了什麼?
- 如果 ldf 達到初始大小 -擷取的FileSize是初始大小還是增加的大小?
感謝您的關注。
根據名為 XYZ 的數據庫的恢復模型,使用的空間會因不同的原因而減少。
首先,事務日誌是“循環的”,這意味著它的一部分(虛擬日誌文件或簡稱 VLF)可以在不再需要時重複使用。將 VLF 標記為重用稱為“清除”或“截斷”事務日誌。
如果 XYZ 處於簡單恢復模型中,那麼只要數據庫中發生檢查點操作(無論是手動的,還是定期發生的自動檢查點之一),VLF 都會被標記為可重用。
如果它處於完全恢復模式,則一旦 VLF 包含的資訊已在日誌備份中備份,就可以重複使用它們。
這很可能是周期性發生的這兩件事之一,導致使用的空間下降。
如果 VLF 沒有足夠快地清除,日誌文件將根據您的配置/期望增長(並且文件大小將更改為增加的大小)。
您應該查看SQL Server 事務日誌體系結構和管理指南上的 MS Docs 頁面,以獲取有關事務日誌如何工作的詳細資訊。