"データベース '(データベース名)' のファイル '(データベース名)_log' の自動拡張をユーザーが取り消したか、30020 ミリ秒でタイムアウトしました。ALTER DATABASE を使用して、このファイルの FILEGROWTH の値の設定を小さくするか、または新しいファイル サイズを明示的に設定してください。" がログに表示されレコードの追加や編集ができない - SQL Server

「データベース '(データベース名)' のファイル '(データベース名)_log' の自動拡張をユーザーが取り消したか、30020 ミリ秒でタイムアウトしました。ALTER DATABASE を使用して、このファイルの FILEGROWTH の値の設定を小さくするか、または新しいファイル サイズを明示的に設定してください。」 のメッセージが表示され、データベースにレコードの追加や編集ができなくなることがあります。

原因

SQL Serverはトランザクションログがいっぱいになると自動的にログのサイズを拡張します。設定を変更していない場合はデフォルトで10%づつ容量を拡張します。トランザクションログの圧縮やバックアップをしない場合、トランザクションログのサイズは10%づつ増え続けます、やがて、10%の拡張に必要な時間がタイムアウト値を超えてしまい、上記のメッセージがログに記録されます。
トランザクションログがいっぱいになっているため、レコードの追加や編集はできなくなります。

解決方法

トランザクションログの拡張にかかる時間がタイムアウト値より長いことが原因です
  • 明示的にトランザクションログのサイズを設定する
  • トランザクションログの自動拡張のサイズを小さくする
  • トランザクションログを圧縮する / トランザクションログをバックアップし切り詰める
  • I/Oが高速なサーバーに交換する
  • 完全復旧モデルをやめる
といった対策があります。

明示的にトランザクションログのサイズを設定する

明示的にトランザクションログのサイズを設定することで上記の現象を回避できます。ただし、レコードの追加や変更が起きるとトランザクションログのサイズは増え、空き領域が徐々に減りますので、一時的な対策となります。

トランザクションログの自動拡張のサイズを小さくする

トランザクションログの自動拡張をデフォルトの10%から1%などに下げる、または明示的に指定したサイズ(1000MBなど)で自動拡張することで、タイムアウト時間以内でログの自動拡張が終わるように設定を変更し問題を回避できます。この対策を実施した場合でもレコードの追加や変更が続けば、トランザクションログのサイズは増え続け、いずれ同じ現象が発生します。

  • トランザクションログが100MBのとき→10%の自動拡張 = 10MB : 時間内に拡張が終わる
  • トランザクションログが500GBのとき→10%の自動拡張 = 50GB : 時間内に拡張が終わらない(容量が大きすぎる)
となってしまうため、
  • トランザクションログが500GBのとき→500MBの自動拡張 = 500MB : 時間内に拡張が終わる。
または
  • トランザクションログが500GBのとき→1%の自動拡張 = 5GB : 時間内に拡張が終わる。
のように変更します。

トランザクションログを圧縮する / トランザクションログをバックアップし切り詰める

トランザクションログを圧縮すると、トランザクションログファイルの空き容量が増えます。また、トランザクションログのバックアップでもトランザクションログの空き領域を増やすことができます。定期的にバックアップを取ることでトランザクションログのサイズを小さく保つことができます。手順についてはこちらの記事を参照してください。

I/Oが高速なサーバーに交換する

高速なサーバーに交換し、タイムアウト値より短い時間でトランザクションログの拡張ができるようにする方法もあります。

完全復旧モデルをやめる

完全復旧できなくなりますが、トランザクションログの管理が不要になります(ログ領域が再利用されるため)。
復旧モデルの変更手順は「SQL Server データベースの復旧モデルを変更する (SQL Server Tips)」の記事を参照してください。
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
最終更新日: 2014-12-22
作成日: 2012-12-14
iPentec all rights reserverd.