LoginSignup
4
2

More than 5 years have passed since last update.

[DB2] Loadコマンドに関する自分用メモ(基本文法・進捗状況・Pending)

Last updated at Posted at 2017-04-23

仕事中に調べたメモを簡単にまとめなおしたものです。そのため時間をかけて調べてまとめあげたという質のものではありません。要するに自分用のメモです。その手の性質のメモを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の確認と解消方法

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

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
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2