DB2 「トランザクションログがいっぱい」


 テーブルのレコードを貯めすぎた場合、削除の際下記のメッセージが出力して
削除に失敗することがあります。(削除処理はロールバックされて戻ってしまいます。)

$ db2 delete from xxxxxtbl
DB21034E  The command was processed as an SQL statement because it was not a
valid Command Line Processor command.  During SQL processing it returned:
SQL0964C  The transaction log for the database is full.  SQLSTATE=57011

 削除する単位を小さくする以外の方法として下記があります。

トランザクションログが一杯になったという場合のしきい値は下記できまります。

(設定値の確認方法)
db2 get db cfg for <database name> | grep LOG

※変更時は、sysadm権限のあるOSユーザーにて実行する必要があります。

Log file size (4KB)                         (LOGFILSIZ) = 20000
Number of primary log files                (LOGPRIMARY) = 13
Number of secondary log files               (LOGSECOND) = 100
Path to log files                                       = /home/db2inst1/db2inst1/NODE0000/SQL00001
/SQLOGDIR/

 "Path to log files" に"Snnnnnn.LOG"と言ったファイルが連番で生成されますが、
これがトランザクション処理を行うと書き出されるファイルとなります。
このファイルのサイズは、LOGFILSIZ*4KBとなり、LOGPRIMARY+LOGSECOND個まで生成され
ます。必要に応じて、ファイルは生成または再利用されていきますが全てのファイルが
使用されてもまだトランザクション処理で書き出しが必要になった場合、掲題のエラー
が発生します。

 100万件程度の削除でも検証環境では、トータル1GBほど用意してやっと処理に成功しました。
細かくトランザクションを切れない場合は、それなりの量用意する必要がありそうです。

 パラメータ変更方法は

db2 updata db cfg for <database name> using <parameter name> <value>

(例)
db2 updata db cfg for sample using LOGFILSIZ 20000  
※81,920,000(20000*1024*4)かとおもったのですが、実際は81,928,192バイトでした。
ヘッダ情報などが含まれるのかもしれません。

 また、最大 LOGFILSIZ*4KB * (LOGPRIMARY+LOGSECOND ) の容量のファイル書き出しがある
可能性がありますので、空きディスクはこれより多く用意できていないと、ディスクフルが
発生します。






最終更新:2008年04月14日 18:21