1. ホーム
  2. sql-server

[解決済み] データベースのトランザクションログが満杯です。ログの領域が再利用できない理由を調べるには、sys.databases の log_reuse_wait_desc カラムを参照してください。

2022-02-07 07:47:31

質問

1回の削除クエリで355447レコードを削除しようとすると、次のエラーが発生します。

データベースのトランザクションログが満杯です。ログ内の領域を再利用できない理由を調べるには、sys.databases の log_reuse_wait_desc 列を参照してください。

以下の方法を試してみましたが、やはりdelete文は同じエラーを出します。

DBCC SHRINKFILE(DBname_Log, 2)
BACKUP LOG gis_sync WITH TRUNCATE_ONLY
DBCC SHRINKFILE(DBname_Log, 2)

どうか解決してください...。 ありがとうございます。

どのように解決するのですか?

Damienさんがおっしゃるように、ログが大きくなっている原因を突き止める必要があります。こちらの記事で解説しています。 トランザクションログ再利用待ち

これだけのレコードを削除すると、それだけでかなりのログ容量が必要になるので、ログファイルの容量を確保できない場合は、これらの行をいくつかの小さなステップに分けて削除しなければならないかもしれません。もしフルリカバリを使用している場合、各ステップの後にログのバックアップを取る必要があります。

余談ですが、BACKUP LOG ... WITH TRUNCATE_ONLYは、一般的に非常に悪いアイデアです。もし、あなたがフルリカバリーモードであれば、この方法はバックアップチェーンを破壊し、ポイントインタイムリストアを行うことを妨げます。ポイントインタイム・リカバリーが必要ない場合は、リカバリー設定 "simple"を代わりに使用してください。そうでない場合は、実際のログバックアップを取り、他のバックアップファイルと一緒に保存してください。

ログファイルに対するDBCC SHRINKFILEは、縮小するデータベースに対して何の役にも立ちません。ドライブ上の他のDBのためのスペースを確保するために使用することはできますが、再利用可能なスペースしか削除できないので、現在のデータベースのためのスペースを確保することはできません。つまり、この処理によって解放されたスペースは、いずれにせよトランザクションに使用された可能性があるということです。