Transaction-Log

隨機和恆定的“日誌增長”警報,如何讓它停止?

  • March 3, 2020

我已經在我的所有數據庫伺服器上設置了警報,每隔一段時間我就會收到以下錯誤,有時它會一直持續下去,有時會在這里和那裡出現幾次。

The SQL Server performance counter 'Log Growths' (instance '_Total') of object 'SQLServer:Databases' now equals the threshold of 1.00.

我可以更改任何配置來阻止這種情況嗎?它似乎只來自兩台伺服器。

這告訴您一個或多個事務日誌重複增長,這意味著它設置為 FULL 或 BULK LOGGED 恢復模式,沒有或沒有足夠的事務日誌備份,或者有人寫了一個非常糟糕或長的查詢來保留事務日誌積極的。

您應該查找該伺服器上的所有 FULL 恢復模式數據庫以及最後一次首先進行事務日誌備份的時間,因為這是最危險的。假設沒有設置最大大小,tlog 可能會增長到佔用所有磁碟的位置,停止對該數據庫或任何其他具有該磁碟上的數據或日誌的數據庫的所有寫入。如果沒有,移動 fwd,您可能需要設置一個最大大小,以便 1 DB 不會刪除所有 DB tlog。

SELECT name, recovery_model_desc 
FROM sys.databases

看看有沒有滿的?如果是這樣,最後一次事務日誌備份是什麼時候?是一個可以幫助您的腳本:

SELECT   d.name,
        d.recovery_model_desc,
        MAX(b.backup_finish_date) AS backup_finish_date
FROM     master.sys.databases d
        LEFT OUTER JOIN msdb..backupset b
        ON       b.database_name = d.name
        AND      b.type          = 'L'
GROUP BY d.name, d.recovery_model_desc
ORDER BY backup_finish_date DES

如果這不能為您提供所需的資訊,這裡是一種從 msdn 查找執行時間最長的前 10 個事務的方法:

SELECT DISTINCT TOP 10
t.TEXT QueryName,
s.execution_count AS ExecutionCount,
s.max_elapsed_time AS MaxElapsedTime,
ISNULL(s.total_elapsed_time / 1000 / NULLIF(s.execution_count, 0), 0) AS AvgElapsedTime,
s.creation_time AS LogCreatedOn,
ISNULL(s.execution_count / 1000 / NULLIF(DATEDIFF(s, s.creation_time, GETDATE()), 0), 0) AS FrequencyPerSec
FROM sys.dm_exec_query_stats s
CROSS APPLY sys.dm_exec_sql_text( s.sql_handle ) t
ORDER BY s.max_elapsed_time DESC, ExecutionCount DESC
GO

最後,一旦您看到哪個數據庫的日誌文件不斷增長,您就可以看到是什麼使日誌文件保持打開狀態。它甚至可能是複制設置或其他未完全刪除的 HA 解決方案。這會告訴你:

SELECT [log_reuse_wait_desc]
   FROM [master].[sys].[databases]
--  WHERE [name] = N'DBNAME';
GO

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