【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のマニュアルは解りやすくならないな…
この記事が気に入ったらサポートをしてみませんか?