【DB2】load pending 状態になっちゃった

トリガー付きテーブルに大量データをimportしちゃった

テーブルに500万件くらいのデータを投入したくて
安易な気持ちでimportしたらコケてしまいました

その後はテーブルに対して何をしようとしても↓のメッセージが返るばかり

SQL0668N 理由コード "3" のため、表 "" に対する操作は許可されません。

そういえば、トリガーついてるからimportだと発動しちゃうよね、loadにすべきだよねーと頭の隅で思いながら、まぁいいやと、、やってしまったらやっぱり駄目だった💦
(そのまぁいいやがエンジニアとしてダメだ)

自分のあいまいな問題解析では…
import だとデータの投入1件ずつに対してトリガーが発動してしまい、そのためログフル・エラーが起きた模様(ログとっとけばよかったが…)

やばっ!っと冷汗はでたものの

DBサーバーが応答しなくなったなどの緊急事態ではなく
DB2コマンドは受け付けられるし
ほかのDBで実行中の処理には影響していなさそうなので
慌てずに・・・

まずは対象テーブルのLOAD STATUSを確認…

SELECT VARCHAR(TABSCHEMA,30) TABSCHEMA,VARCHAR(TABNAME,30) TABNAME, LOAD_STATUS, NO_LOAD_RESTART FROM SYSIBMADM.ADMINTABINFO WHERE LOAD_STATUS <> 'NULL'

⇒TABNAMEにLOADが失敗したテーブル名、LOAD_STATUSには"PENDING"とあり。
たしかにこの状態ではテーブルに対して何も操作ができないようです。
どうにかして中途半端なloadを終わらせる必要があります。

[DB2 LUW] ロード・ペンディングの回復方法

DB2のsupportページにあるとおり、回復方法は4つ。

自分の場合は、そもそも大量データの投入をトリガーの付いたテーブルに対してimportでやってしまったことが良くなかったと思われたため、a)のterminateを選ぶしかないと判断しました。

転載ここから

a) TERMINATE オプションを使用してロード操作を終了します。

TERMINATE オプションの場合、オリジナルの LOAD コマンドと表名だけは一致している必要があります。

  • 実行例 (入力ファイル名は検査されません。任意のものを使用できます) db2 "load from test.del of del messages msg.txt terminate into tab1"

転載ここまで

注意書きがすぐに理解できなかったんだけれども・・
つまりは

  • test.del、msg.txtといった、ファイル名は適当でいいよ

  • tab1のところはPENDING解除したいテーブル名を正しく入れてね

  • それ以外の構文はこの例のとおりにしてね

という意味だったんですね

はい、おかげさまで無事PENDING解除できました。。。よかった。
データ投入のsqlをimportからloadに修正して、無事データ投入も完了。

実は数年前にもやらかしたことがあって
その時は自分で解決できず、先輩に泣きついて直してもらったのですが
今回は自分で調べて解決できました~成長(涙)

それにしても
いつまでたってもDB2のマニュアルは解りやすくならないな…


この記事が気に入ったらサポートをしてみませんか?