IBM Support

[Db2] 大量の行を削除または更新する時のログ量を減らす方法

Question & Answer


Question

表から大量のデータを削除または更新する必要がありますが、一度に実行するとログ・フル (SQL0964C) になってしまいます。ログ・スペースを拡張せずに実行する方法はありますか。

Answer

  1. 表に含まれる行をすべて削除する場合
    • Db2 9.7 以降
      TRUNCATE ステートメントを使って該当表に含まれるすべての行を削除できます。
      例:
      db2 "TRUNCATE TABLE <表名> IMMEDIATE"
    • Db2 9.5 以前
      該当の表に対して空データを REPLACE オプションで IMPORT して行をすべて削除できます。
      LOAD コマンドでも同様に削除できますが、LOAD COPY の扱いなどを考慮しなくてよい IMPORT を推奨します。
      例:
      db2 "IMPORT FROM /dev/null of del REPLACE INTO <表名>"
      注: Windows の場合は /dev/null の代わりに NUL を指定します。
  2. 表に含まれる行の一部の行のみを削除または更新する場合
    • 一時的にログを取得しない方法
      NOT LOGGED INITIALLY (NLI) を活動化すると、そのトランザクションではログを生成しません。NLI は次の COMMIT または ROLLBACK で自動的に非活動化されますが、ROLLBACK すると該当表は DROP しかできなくなります。
      例:
      db2 +c "ALTER TABLE <表名> ACTIVATE NOT LOGGED INITIALLY"
      db2 "DELETE FROM <表名> WHERE <条件>"
      ※ コマンド・ライン・プロセッサー (CLP) ではデフォルトで自動コミットがオンになっているため、そのまま実行すると ALTER TABLE ステートメント自体がコミットされてしまい NOT LOGGED INITIALLY が有効になりません。+c オプションを指定して自動コミットされないようにしてください。
      また、削除操作が失敗した場合、対象表へのアクセスはできなくなり、以後その表は DROP しかできなくなります。
    • 一度に削除または更新する行数を限定する方法
      FETCH FIRST n ROWS ONLY を指定して一度に処理する行数を限定します。
      例:指定された条件の行を <行数> だけ削除
      db2 "DELETE FROM (SELECT * FROM <表名> WHERE <条件> FETCH FIRST <行数> ROWS ONLY)"
      例:指定された条件の行を <行数> だけ更新
      db2 "UPDATE <表名> SET <列名>=<値> WHERE <条件> AND <列名>!=<値> FETCH FIRST <行数> ROWS ONLY"
      ※ 処理すべき行がなくなるまで繰り返してください。処理すべき行がなくなると SQL0100W が返ります。
      この場合、出力されるログの総量は削減できませんが、ログ・スペースの範囲内でその都度コミットすることにより、ログ・スペースを拡張せずに削除できます。

運用上の考慮点
FETCH FIRST n ROWS ONLY を使った手法を除いてログを生成しないため、ログを使った回復 (ROLLFORWARD など) はできません。作業前にあらかじめバックアップを取得されることをお勧めします。

関連情報
IMPORT コマンド
TRUNCATE ステートメント
ALTER TABLE ステートメント
NOT LOGGED INITIALLY パラメーターによるロギングの低減

[Db2] パスポート・アドバンテージによく寄せられる質問
[Db2] トランザクション・ログがフル (SQL0964C) になったときの対応
 
お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PmcAAE","label":"Recovery-\u003ELogging"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
15 August 2023

UID

swg21575531