Question & Answer
Question
表から大量のデータを削除または更新する必要がありますが、一度に実行するとログ・フル (SQL0964C) になってしまいます。ログ・スペースを拡張せずに実行する方法はありますか。
Answer
- 表に含まれる行をすべて削除する場合
- 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 <表名>"
- Db2 9.7 以降
- 表に含まれる行の一部の行のみを削除または更新する場合
- 一時的にログを取得しない方法
NOT LOGGED INITIALLY (NLI) を活動化すると、そのトランザクションではログを生成しません。NLI は次の COMMIT または ROLLBACK で自動的に非活動化されますが、ROLLBACK すると該当表は DROP しかできなくなります。
例:db2 +c "ALTER TABLE <表名> ACTIVATE NOT LOGGED INITIALLY" db2 "DELETE FROM <表名> WHERE <条件>"
また、削除操作が失敗した場合、対象表へのアクセスはできなくなり、以後その表は 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"
この場合、出力されるログの総量は削減できませんが、ログ・スペースの範囲内でその都度コミットすることにより、ログ・スペースを拡張せずに削除できます。
- 一時的にログを取得しない方法
運用上の考慮点
FETCH FIRST n ROWS ONLY を使った手法を除いてログを生成しないため、ログを使った回復 (ROLLFORWARD など) はできません。作業前にあらかじめバックアップを取得されることをお勧めします。
関連情報
IMPORT コマンド
TRUNCATE ステートメント
ALTER TABLE ステートメント
NOT LOGGED INITIALLY パラメーターによるロギングの低減
[Db2] パスポート・アドバンテージによく寄せられる質問
[Db2] トランザクション・ログがフル (SQL0964C) になったときの対応
[{"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"}]
Was this topic helpful?
Document Information
Modified date:
15 August 2023
UID
swg21575531