IBM Support

[DB2 LUW] 大量の行を削除する時のログ量を減らす方法

技術情報(FAQs)


質問

表から大量のデータを削除する必要がありますが、削除を実行するとログがフルになってしまいます。ログサイズを拡張しないで削除する方法はありますか。

回答

1. 表に含まれる行をすべて削除する場合
1-a. V9.5 以前
該当の表に対して空のデータを REPLACE オプションによって IMPORT することで行をすべて削除できます。
LOAD コマンドでも同様に削除できますが、LOAD COPY の扱いなどを考慮しなくてよい IMPORT を推奨します。

例:
db2 "IMPORT FROM /dev/null of del REPLACE INTO 表名"

注: Windows の場合は /dev/null の代わりに NUL を指定します。

1-b. V9.7 以降
TRUNCATE ステートメントを使って該当表に含まれるすべての行を削除できます。

例:
db2 "TRUNCATE TABLE 表名 IMMEDIATE"


2. 表に含まれる行の一部の行のみを削除する場合

2-a. 一時的にログを取得しない方法
ALTER TABLE ACTIVATE NOT LOGGED INITIALLY ステートメントによって、同一トランザクション内に限ってログを取得させないようにできます。NOT LOGGED は次の COMMIT または ROLLBACK で自動的に非活動化されますが、ROLLBACK の場合、該当表は DROP しかできなくなります。

例:
db2 +c "ALTER TABLE 表名 ACTIVATE NOT LOGGED INITIALLY"
db2 "DELETE FROM 表名 WHERE 条件"

※ コマンド・ライン・プロセッサー (CLP) ではデフォルトで自動コミットがオンになっているため、そのまま実行すると ALTER TABLE ステートメント自体がコミットされてしまい NOT LOGGED INITIALLY が有効になりません。+c オプションを指定して自動コミットされないようにしてください。
また、削除操作が失敗した場合、対象表へのアクセスはできなくなり、以後その表は DROP しかできなくなります。

2-b. 一度に削除する行数を限定する方法
FETCH FIRST n ROWS ONLY を指定して一度に削除する行数を限定します。

例:
db2 "DELETE FROM (SELECT * FROM 表名 WHERE 条件 FETCH FIRST 件数 ROWS ONLY)"

※ 削除すべき行がすべて削除されるまで繰り返してください。
この場合、トータルのログ出力量は削減できませんが、ログサイズの範囲内でその都度コミットすることにより、ログサイズを拡張せずに削除できます。

運用上の考慮点
2-b を除き、削除時にログを取得しないため、ログを使った回復 (ROLLFORWARD など) はできません。作業前にあらかじめバックアップを取得されることをお勧めします。

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

[DB2 LUW] パスポート・アドバンテージによく寄せられる質問
[DB2 LUW] トランザクション・ログがフル (SQL0964C) になったときの対応

お問合せ先
技術的な内容に関して、サービス契約のもと IBM サービス・ラインにお問い合わせください。
IBM サービス・ライン

Document information

More support for: DB2 for Linux, UNIX and Windows
OTHER - Uncategorised

Software version: 9.5, 9.7, 10.1, 10.5, 11.1

Operating system(s): AIX, HP-UX, Linux, Solaris, Windows

Reference #: 1575531

Modified date: 10 July 2016


Translate this page: