web-dev-qa-db-ja.com

単純復旧モデルのDBの「CHECKPOINT」が原因でトランザクションログがいっぱいです

SQL Server 2012 RTM上のDBの1つについて、

エラーが示すように、トラブルシューティングの手順をほとんど実行できませんでした。

「「CHECKPOINT」が原因でトランザクションログがいっぱいです

これはdevデータベースであり、そのバックアップは行われなかったため、それを使用することもできません。

ログファイルの圧縮を試みましたが、成功せず、エラーが発生しました:

ログがスペース不足です-'CHECKPOINT'のためにトランザクションログがいっぱいであるというカスケードエラーが発生しました

DBCC CHECKDBは、 'CHECKPOINT'が原因でトランザクションログがいっぱいになるため、ほとんどの場合エラーを出します。

復旧モデルを完全に変更できません-「CHECKPOINT」が原因でトランザクションログがいっぱいになるため、エラーが発生します

バックアップを取得できません:同じエラー:

別のサーバー(SQL Server 2012 RTM)でデタッチして再度アタッチしようとしたが、同じエラーが発生した。

DBで手動でCHECKPOINTを実行しようとしましたが、それでも同じエラー:

この投稿をすでにここで参照しています シンプルなモデルデータベーストランザクションログがいっぱいです 'CHECKPOINT'

そして

'XTP_CHECKPOINT'により、データベース 'database_name'のトランザクションログがいっぱいです ですが、成功しません。

注:現在のサーバーやデータベースにはレプリケーションが設定されていません。

私は根本的な原因を見つけてこれを修正することができないので助けてください!

ありがとう!

6
KASQLDBA

(これはコメントより長いので...回答として入力してください)

SQLサーバー2012 RTM上のDBの1つ。

これはあなたの問題です。 RTMビルド後の連続したCU/SP で導入された多くの修正がありました。

最新のSP2? を使用してSQLサーバーにパッチを適用できますか?パッチ適用後、問題が引き続き発生するかどうかを確認します。

あなたの問題は、あなたのMODELデータベースが単純な回復状態にあるかもしれないためかもしれません。

モデルデータベースがSIMPLE復旧モデルに設定されており、ユーザーデータベースがモデルデータベーステンプレートからの単純復旧モデルで作成されている場合、SQL Serverは想定したように自動的にログを切り捨てません(完全バックアップ後)。どういうわけか、SQL Serverは完全復旧モデルのように処理しているようです。

以下のログバックアップを実行できます(データベースが単純な回復状態にある場合でも、モデルが単純な回復状態にあるため、RTMの バグ により、SQLサーバー がそれを処理します完全に回復している

BACKUP LOG dbName
TO DISK = 'dbName_log_backup.trn'
GO

このKBを確認してください: 「モデル」データベースの復旧モデルを「シンプル」に設定した後、データベースはSQL Server 2012の単純復旧モデルの動作を実行しません

4
Kin Shah

念のため-ログファイルは固定サイズに設定されていますか?その場合は、データベースにセカンダリログファイルを追加してから、チェックポイントを実行してください。他のすべてが失敗した場合は、ログを再構築します。

ALTER DATABASE <database> set  EMERGENCY 
ALTER DATABASE <database> REBUILD LOG ON (NAME='<database>',FILENAME='<filename>')
ALTER DATABASE <database> set online
1
Spörri

SQL 2016でも同じ問題が発生しました。

私は以下を試しましたが、同じXTP_CHECKPOINTエラーでDBを変更することもできませんでした。

USE [<DBName>]  
GO  
-- Truncate the log by changing the database recovery model to SIMPLE.  
ALTER DATABASE [<DBName>] 
SET RECOVERY SIMPLE;  
GO  
-- Shrink the truncated log file to 1 MB.   
--checkpoint;
DBCC SHRINKFILE ('<LogName>', 5);
ALTER DATABASE [<DBName>] 
MODIFY file (NAME = '<LogName>', MAXSIZE = UNLIMITED, FILEGROWTH = 5MB);  
GO  
-- Reset the database recovery model.  
ALTER DATABASE [<DBName>] 
SET RECOVERY FULL;  
GO 

この状態から回復するには、新しいトランザクションログファイルを追加するしかありませんでした。

Add new transaction log file

追加したら、必要に応じて上記のクエリを使用してログファイルを圧縮できます。ただし、トランザクションログファイルが急増している理由については、根本的な原因を確認することをお勧めします。

ヒント:以下のクエリを使用して、すべてのデータベースのログの使用状況を確認してください。

DBCC SQLPERF(LOGSPACE);
0
Sen Jacob