大日誌文件已滿但非常小的 tlog 備份
我們有一個 SQL Server 2014 SP2 實例,我在其中發現了一個奇怪的行為。其中一個數據庫(完全恢復模式)有一個大約 10GB 的日誌文件,我看到隨機的文件定期增長。
我還沒有找到導致文件增長的原因,但讓我感興趣的是日誌文件在早上是空的,並且日誌備份(每 15 分鐘進行一次)大部分時間為 700KB,有時為 12MB。
有人能解釋一下 10GB 的完整日誌文件如何生成如此小的日誌備份嗎?備份壓縮可以做到這一點嗎?
因為日誌增長發生在晚上,我無法執行
DBCC SQLPERF(LOGSPACE)
,但我希望文件已滿,否則它不會增長。同樣,我不能說那log_reuse_wait_desc
是什麼。我現在已經設置了監控,所以我可以獲得額外的數據。
您應該在進行日誌備份後檢查
log_reuse_wait_desc
以sys.databases
找出原因。日誌備份只是試圖清除日誌,但它可能會發生,這是不可能的。
在這篇文章sys.databases (Transact-SQL)中你可以找到為什麼日誌不能被清除的可能原因,它可以是打開事務、複製、鏡像、ecc。
如果日誌無法清除,它將增長。一旦日誌保留的原因消失,日誌就會被清除並且可以重複使用。
造成這種情況的一個自然原因是完全備份。如果您的數據庫足夠大並且完整備份需要幾個小時才能完成,即使日誌備份可以同時執行並且它們的大小像往常一樣小,那麼在完整備份的整個過程中,日誌也不會被清除。
這意味著您的日誌文件應該足夠大,以容納至少這幾個小時內的所有數據修改。
有人能解釋一下 10GB 的完整日誌文件如何生成如此小的日誌備份嗎?
生成日誌記錄不是日誌大小:)
這是您的數據庫編寫活動。如果您每 15 分鐘執行一次日誌備份並且它們大約為 700Kb,這意味著您的活動每 15 分鐘生成 700Kb 的日誌記錄。
相反,您要問的是什麼可以防止我的日誌被清除這麼長時間以至於它積累了 10Gb 的數據並且仍然不能被截斷?
如果上次日誌備份時沒有截斷日誌,並不意味著下次日誌備份會抓取更多的日誌記錄。下一個日誌備份將從上一個備份停止的記錄的下一個記錄開始。日誌備份不是累積的。
我給你舉個例子:
我打開了事務並沒有進行送出或回滾就回家了。日誌備份每 15 分鐘定期執行一次,每個日誌備份會抓取 1Mb 的日誌記錄。我在生病 1 週後重返工作崗位。我的交易仍然開放!一周內無法截斷日誌。我的日誌備份仍然是 1Mb,但我的日誌幾乎已滿:它累積了 1Mb*4 247 Mb=672Mb。
現在我回來了,我終於發出了一個送出。下一個日誌備份仍然是 1Mb,但它最終可以截斷日誌。
因此,在我的情況下,可能是某些東西阻止了日誌截斷 => 日誌文件增長,但幾週內可以進行 700KB 的日誌備份?
對,就是這樣。你應該找到這個阻止日誌截斷的“東西”。