2022年4月14日 星期四

[研究] SQL Server 資料庫 的交易紀錄已滿,因為發生 'LOG_BACKUP'。

[研究] SQL Server 資料庫 的交易紀錄已滿,因為發生 'LOG_BACKUP'。

[研究]縮小 SQL Server Database Transaction Log File 資料庫交易記錄檔 (.ldf) 大小

2022-04-14

環境:SQL Server 2019 Standard

最近連上某系統,發現無法登入;因為客製化的遠端錯誤訊息不足,所以直接登入連上該主機,在該伺服器主機上再測試一次,訊息顯示資料庫的交易紀錄已滿。


檢查存放資料庫檔案的 D:\,發現已經爆滿了,刪除部分其他檔案後,系統正常運作了。

********************************************************************************

DBCC SHRINKFILE (Transact-SQL) - SQL Server | Microsoft Docs
https://docs.microsoft.com/zh-tw/sql/t-sql/database-console-commands/dbcc-shrinkfile-transact-sql?view=sql-server-ver15

在 SQL Server Management Studio ( SSMS ) 上執行


use TestDB;
GO

ALTER DATABASE TestDB SET RECOVERY SIMPLE;
GO

DBCC SHRINKFILE (TestDB_Log, 1);
GO

ALTER DATABASE TestDB SET RECOVERY FULL;
GO



********************************************************************************
用圖形介面加上命令操作 
(其實不會比上面方便)







********************************************************************************
變更預設 .ldf 檔案大小限制

預設約 2TB,但若磁碟分割沒有那麼大,或希望它不會超過多大,可以設定一下。


********************************************************************************

2024-01-26 補
請問為何發生 "資料庫 MyDB 的交易記錄已滿,因為發生 'LOG_BACKUP'。" ?

ChatGPT
這個錯誤訊息表示資料庫(MyDB)的交易日誌(log)已滿,這通常是由於交易日誌沒有進行備份 (LOG_BACKUP) 而導致的。

在SQL Server或其他資料庫管理系統中,交易日誌是用來記錄數據庫的所有變更的地方。當交易日誌檔案的大小達到其最大限制時,資料庫引擎就會停止對資料庫進行修改,除非進行交易日誌備份以釋放空間。

要解決這個問題,你可以執行交易日誌備份操作。這可以通過使用SQL Server Management Studio (SSMS) 或 Transact-SQL 語句進行。以下是一個使用 T-SQL 的簡單範例:

BACKUP LOG MyDB TO DISK = 'C:\Path\To\Backup\MyDB_LogBackup.bak';

請注意,這只是一個簡單的範例,實際情況可能需要根據你的環境和需求進行調整。請確保在執行備份操作之前仔細檢查和測試。

另外,也建議設定定期的交易日誌備份作業,以確保日誌文件不會再次達到最大限制。這可以透過定期執行類似的備份操作來實現。

**********

訊息 4208,層級 16,狀態 1,行 1
當復原模式為 SIMPLE 時,不允許使用陳述式 BACKUP LOG。請使用 BACKUP DATABASE 或使用 ALTER DATABASE 來變更復原模式。
訊息 3013,層級 16,狀態 1,行 1
BACKUP LOG 正在異常結束。

ChatGPT
這個錯誤訊息表明在資料庫的復原模式為 "SIMPLE" 時,是不允許使用陳述式 BACKUP LOG 的。在 "SIMPLE" 復原模式下,SQL Server自動處理交易日誌,並且不允許手動執行交易日誌備份。

如果你的資料庫在 "SIMPLE" 復原模式下,你不需要手動執行交易日誌備份。系統會自動管理交易日誌的截斷(截斷不再需要的部分),而不需要額外的操作。這種模式通常用於小型資料庫或不需要複雜還原的應用程序。

如果你確實需要執行交易日誌備份,你可能需要將資料庫的復原模式更改為 "FULL" 或 "BULK-LOGGED"。這可以使用 ALTER DATABASE 來實現,例如:

ALTER DATABASE MyDB SET RECOVERY FULL;

請注意,在 "FULL" 或 "BULK-LOGGED" 復原模式下,你可以使用 BACKUP LOG 進行交易日誌備份,但同時也需要定期進行交易日誌備份和日誌檔案的備份,以防止日誌檔案變得過大。

**********
訊息 4214,層級 16,狀態 1,行 2
無法執行 BACKUP LOG,因為沒有目前的資料庫備份。
訊息 3013,層級 16,狀態 1,行 2
BACKUP LOG 正在異常結束。

ChatGPT
這個錯誤訊息表明在嘗試執行 BACKUP LOG 操作時,系統發現沒有目前的資料庫備份。在 SQL Server 中,通常在執行交易日誌備份之前,需要先執行完整資料庫備份(FULL DATABASE BACKUP)。這是為了確保在還原操作中有完整的起點,可以使用完整備份的檔案還原到某個時間點。

以下是一個可能的步驟:

執行完整資料庫備份:

BACKUP DATABASE MyDB TO DISK = 'C:\Path\To\Backup\MyDB_FullBackup.bak';

執行交易日誌備份:
在執行 BACKUP LOG 之前,確保先執行了完整資料庫備份。

BACKUP LOG MyDB TO DISK = 'C:\Path\To\Backup\MyDB_LogBackup.bak';

請注意,這只是一個簡單的範例,實際情況可能需要根據你的環境和需求進行調整。確保在執行備份操作之前,了解你的系統的備份策略和需求。

如果你確定已經執行了完整資料庫備份,但仍然遇到這個錯誤,可能需要檢查備份文件的路徑是否正確,以及是否有足夠的權限進行備份操作。

最後成功的指令


ALTER DATABASE MyDB SET RECOVERY FULL;
BACKUP DATABASE MyDB TO DISK = 'C:\Temp\MyDB_FullBackup.bak';
BACKUP LOG MyDB TO DISK = 'C:\Temp\MyDB_LogBackup.bak';
ALTER DATABASE MyDB SET RECOVERY SIMPLE;



********************************************************************************

(完)

相關

[研究] SQL Server 資料庫 的交易紀錄已滿,因為發生 'LOG_BACKUP'。

[研究] 資料庫 'xxx' 的交易記錄已滿,因為發生 'LOG_BACKUP'。

[研究] SQL Server 2016 刪除 .ldf 檔案

[研究]檢視 SQL Server Database Transaction Log File 資料庫交易記錄檔 (.ldf) 內容

[研究][ASP.NET]Elmah寄信通知「資料庫...的交易記錄已滿,因為發生 'LOG_BACKUP'」https://shaurong.blogspot.com/2022/04/aspnetelmah-logbackup.html

[研究]檢視 SQL Server Database Transaction Log File 資料庫交易記錄檔 (.ldf) 內容https://shaurong.blogspot.com/2022/04/sql-server-database-transaction-log.html

[研究]縮小 SQL Server Database Transaction Log File 資料庫交易記錄檔 (.ldf) 大小https://shaurong.blogspot.com/2022/04/sql-server-database-transaction-log_14.html


沒有留言:

張貼留言