DELETEやINSERT、UPDATEといった更新処理を行った際に、以下のエラーメッセージが返ることがあります。
エラーメッセージ
mysql> DELETE FROM lineorder;
ERROR 122 (HY000): CAL0002: Delete Failed: IDB-2008: The version buffer overflowed.
Increase VersionBufferFileSize or limit the rows to be processed.
ERROR 122 (HY000): CAL0002: Delete Failed: IDB-2008: The version buffer overflowed.
Increase VersionBufferFileSize or limit the rows to be processed.
このエラーは、「Version Buffer」というInfiniDBがトランザクション処理を行う際に使用するバッファ領域が不足している場合に発生します。
例えば、lineorderテーブルをDELETEした場合、その処理がコミットされるまではロールバックできるように変更前のデータを保持しておかないといけません。
このデータを保持しておくために、Version Bufferファイルが使用されますが、このファイルはデフォルトでは最大利用可能サイズが1GBに設定されています。そのため、1GB以上の領域が必要になるような大量データの更新を行うと、今回のエラーが発生します。
このエラーが発生した場合の対処方法は2つあります。
【対処方法1】該当の更新処理を複数回に分ける。
大量データを更新する際に、処理を複数回に分割することで、一度に更新するデータ量を絞ります。例えば、2013年の売上データをDELETEしようとしてこのエラーが発生した場合は、2013年1〜6月のデータをDELETEした後に、残りの7〜12月のデータをDELETEします。こうすることで、一回の処理に必要なVersion Bufferファイルのサイズを抑えることができます。
【対処方法2】Version Bufferファイルのサイズを拡張する。
Version Bufferファイルの利用可能サイズを拡張することで、一度に更新できるデータ量が増えます。Version Bufferファイルの利用可能サイズはconfigxml.shを使用して変更できます。対処方法2の詳細
1.InfiniDBがインストールされている環境にて、以下のコマンドを実行します。
1 2 3 4 |
# configxml.sh setconfig VersionBuffer VersionBufferFileSize XXGB ※「XXGB」には変更後の値を設定します。 ※デフォルトは1GBです。 |
2.以下のコマンドを実行し、手順1.の変更が反映されたことを確認します。
1 2 3 4 5 |
# configxml.sh getconfig VersionBuffer VersionBufferFileSize ※2GBに変更した場合の実行例 # configxml.sh getconfig VersionBuffer VersionBufferFileSize Current value of VersionBuffer / VersionBufferFileSize is 2GB |
3.以下のコマンドを実行し、InfiniDBを再起動します。
1 2 3 4 5 |
InfiniDBの停止 # cc shutdownsystem InfiniDBの起動 # cc startsystem |
Version Bufferファイルを大きくすると、一回の更新で処理できる量も増えますが、その分ロールバックにも時間がかかるようになります。また、設定を変更した場合はInfiniDBの再起動も必要です。
そのため、更新処理を分割できる場合は、【対処方法1】を採用した方が容易にエラーに対処することが可能です。