1

在我的團隊ASP.NET應用程序的數據訪問層中,我通過使用.NET SQLClient對我們的數據庫運行存儲過程。增加新的代碼,允許對數據庫的插入操作後,我測試的代碼,並獲得了以下異常:數據庫中事務日誌已滿的潛在原因和解決方案

The transaction log for database 'DBName' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases

我覈實,我從MS SQL Server中嘗試插入操作當收到同一消息管理工作室。我很擔心,因爲我最近添加了三個兩個觸發器兩個數據庫來執行基於插入和更新某些表的一些數據插入,並且我認爲可能我已經招致了無限循環或某種性質的事情。

但是,基於此問題的其他實例在線,它似乎不是通常由觸發器或旋轉查詢引起的問題。我查詢針對log_reuse_waitlog_reuse_wait_desc列和返回以下:

2 | LOG_BACKUP

此外,查詢SELECT [name], recovery_model_desc, log_reuse_wait_desc
FROM sys.databases
返回:

name | recovery_model_desc| log_reuse_wait_desc 

DBName| FULL   | LOG_BACKUP 

在其中第一列是log_reuse_wait,第二個是log_reuse_wait_desc。 根據msdn上代碼的定義,我需要執行日誌備份,然後可以自動截斷日誌,從而允許對數據庫進行進一步的操作。這是一個正確的假設嗎?這是否可能是由錯誤編碼的觸發器引起的,或者更多是日常維護任務,由數據庫上的大量事務引起?

編輯:

查詢select type_desc, size, max_size from sys.database_files回報:

type_desc | size | max_size 
1| ROWS  | 512 | -1 
2| LOG  | 64 | -1 
+1

你知道你對這個數據庫的備份策略嗎? – tschmit007

+0

什麼「從sys.database_files中選擇type_desc,size,max_size」返回? – tschmit007

+0

是的,這是文檔所說的,你需要做什麼。如果觸發器添加,更新或刪除,那麼將被記錄。如果觸發器不必要地添加,更新或刪除,那麼將不必要地記錄。問題是你需要一個完整的恢復模型嗎? – Paparazzi

回答

9

如果您的數據庫是完全恢復模式,日誌不會被截斷(截斷是個可憐的詞,我希望他們能選擇的東西其他)直到執行日誌備份。基本上,當您將數據庫置於FULL恢復模式時,您告訴SQL Server您需要時間點恢復。爲此,SQL Server需要上一次完整(或差異)備份的完整日誌鏈,爲此,它不會重複使用(「截斷」)日誌空間,直到您備份完日誌。

這是處於完全恢復模式的數據庫的常規操作問題。如果您不需要時間點恢復,那麼將您的數據庫設置爲SIMPLE恢復模式 - 這將自動重新使用日誌空間,但您只能恢復到上次的完整/差異備份。

如果確實需要時間點恢復,那麼您需要(以及您的DBA團隊需要)設置一個定期執行日誌備份的維護計劃。

+0

謝謝,我相信這告訴我我需要什麼。 – Christian