仕事中に調べたメモを簡単にまとめなおしたものです。そのため時間をかけて調べてまとめあげたという質のものではありません。要するに自分用のメモです。その手の性質のメモをQiitaに挙げるべきかどうか悩んだのですが、DB2のLOADコマンドについてドキュメントが少ないのも事実。ちょっとしたとっかかりになればうれしいです(´・ω・`)
基本文法
load from xxxxx.csv of del
modified by codepage=1208
replace into xxxxx_table
「とあるcsvファイル(文字コードはUTF-8)を特定のテーブルに読み込ませたい」という個人的によく遭遇する場面を実現するのが上記のサンプルです。なおLOADには多様なオプションや機能があるので、それを利用する場合には次のリンクを利用するのがよいでしょう: https://www.ibm.com/support/knowledgecenter/ja/SSEPEK_10.0.0/ugref/src/tpc/db2z_loadsyntax.html
LOADの進捗を監視したい
LOADコマンドはログを残さないという特質上、大量のデータをテーブルに投入する際利用されることが多いと思います。そこで気にかかるのが進捗具合。LOADコマンドがきわめて高速だとはいえ、数百万件数千万件単位のデータを投入するとなると時間がかかり、「いつ終わるのか」「途中で失敗していないか」「いったいどのぐらい進んでいるのか」ということが気になります――よね?
list utilities show detail
LOADの進捗状況はlist utilities
により確認することができます。またリアルタイムで監視したいというような場合にはシェルスクリプトと組み合わせることも可能です。
# 5秒ごとにLOADの進捗状況を確認したい。
while true; do
db2 "list utilities show detail"
sleep 5
done
LOAD Pendingの確認と解消方法
LOADを実行したテーブルに対して操作を行うと、SQLエラー「SQL0668N」が返却され、操作に失敗することがあります。これはそのテーブルがPending状態にある、要するにLOADコマンド中にエラーがあり、テーブルが事実上ロックされてしまっているということを示します。
まずはこの確認方法ですが、次のようなコマンドをたたくことによりPending状態かどうかを確認することができます。個人的な体感ですが、このコマンドを実行して結果が返るまで時間がかかるので、実行した場合は気長に待ちましょう。
select
tabschema,
tabname,
load_status,
no_load_restart
from sysibmadm.admintabinfo
where load_status <> 'NULL'
上記のコマンドの結果により、対象のテーブルがPendingにあることが分かった場合はLOADコマンドのterminateオプションを利用して、これを解消します。
load from test.del of del
messages msg.txt
terminate into xxxxx
このときxxxxx
はPending状態にあるテーブルを示します。またfrom句に指定するファイル名(サンプルではtest.del
)は何を指定しても構いません。Pendingの原因になったLOADコマンド実行時に指定したファイル名を指定する必要はなく、そもそも実在しないようなファイルを指定しても正常に動作します。
2017/07/19 追記:
この記事にはいくつかサンプルコードが提示されていますが、以下はそのサンプルをそれぞれ1行にまとめたものになります。なぜそのようなまとめを作っておくかというと――コピペしやすいから(´・ω・`)
Qiitaの記事は見知らぬ他にに向けて発信するのが本来ですが、この記事に関しては筆者本人がお仕事中に参照することが多く、しかもそのような場合には「サンプルコードをコピペして、ターミナルに直接貼り付けたい」ということがほとんど。要するに自分の需要を満たしたいということです。
load from xxxxx.csv of del modified by codepage=1208 replace into xxxxx_table
while true; do db2 "list utilities show detail"; sleep 5 ; done
select tabschema, tabname, load_status, no_load_restart from sysibmadm.admintabinfo where load_status <> 'NULL'
load from test.del of del messages msg.txt terminate into xxxxx