資料庫交易記錄已滿的可能解決方式

本文將介紹資料庫交易記錄已滿的可能解決方式。

問題描述

當您嘗試存取SQL Server 時發生【資料庫'db name'的交易記錄已滿。如果要了解為何無法重複使用記錄中的空間,請參閱sys.databases中的log_reuse_wait_desc資料行】,從 SQL Server 的記錄檔檢視器,您會看到類似下圖的記錄。

image

實際檢查交易記錄檔所使用的磁碟機似乎還有足夠的空間可供使用,為什麼會發生這樣的問題呢?KB 317375 指出可能的原因如下:

實作步驟

若您想要了解是什麼原因造成交易記錄無法重複使用,必須強制截斷或清空,您可以依照錯誤訊息的提示來查詢 sys.databases 系統檢視的 log_reuse_wait_desc 資料行,該資料行會告訴您目前交易記錄檔的空間正等待進行什麼樣的作業。

NOTHING CHECKPOINT LOG_BACKUP ACTIVE_BACKUP_OR_RESTORE
ACTIVE_TRANSACTION DATABASE_MIRRORING REPLICATION DATABASE_SNAPSHOT_CREATION
LOG_SCAN AVAILABILITY_REPLICA OLDEST_PAGE OTHER_TRANSIENT

但是要解決這個問題,或許您可以直接以下列兩種方式之一來截斷或清空交易記錄。

方法一、使用 T-SQL:您可以利用設定資料庫復原模式為簡單復原模式,來截斷或清空交易記錄。


SET RECOVERY SIMPLE
GO

方法二、使用 SSMS:您也可以在 SSMS 的物件總管中,在發生上述錯誤訊息的資料庫上按滑鼠右鍵選擇【屬性】。

image

於資料庫屬性視窗左側的選取頁面區塊中點選【選項】,接著設定復原模式為【簡單】,最後按確定,即可截斷或清空記錄檔。

image

建議除了開發或測試的資料庫使用簡單復原模式以外,正式環境還是在截斷交易記錄之後,還是把復原模式改回來完整,以確保可以使用更多樣的資料庫策略,進而降低資料遺失的機率。

參考資料

執行 SQL Server 之電腦上的交易記錄檔意外地擴充或滿溢

sys.databases (Transact-SQL)

The transaction log for database 'mydatabase' is full. To find out why space in the log cannot be reused, see the log_reuse_wait

交易記錄檔已滿、爆掉;截斷交易記錄檔。