sqlldrについて
Oracleのsqlldrユーティリティはファイルをテーブルにロードするときに使用します
sqlldrは標準出力に以下のような途中経過を出力するので、実行状況を確認することができます
しかし、ロード件数が多い場合は、あとどのくらいの時間でロードが完了するのか把握できません
SQL*Loader: Release 12.1.0.2.0 - Production on 木 1月 23 14:36:14 2020
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.
使用パス: 従来型
コミット・ポイントに達しました。 - 論理レコード件数64
コミット・ポイントに達しました。 - 論理レコード件数128
コミット・ポイントに達しました。 - 論理レコード件数192
コミット・ポイントに達しました。 - 論理レコード件数256
コミット・ポイントに達しました。 - 論理レコード件数320
コミット・ポイントに達しました。 - 論理レコード件数384
コミット・ポイントに達しました。 - 論理レコード件数448
コミット・ポイントに達しました。 - 論理レコード件数512
コミット・ポイントに達しました。 - 論理レコード件数576
そこで、Linuxのpvコマンドを利用して実行状況を監視できないかと考えました
pv コマンドについて
Linuxではpvコマンドが利用できます
pvコマンドはパイプでつながれたコマンドにはさんで実行し、全体のデータ量とパイプを通過したデータ量から現在の状況と完了までの予想時間を表示してくれる便利なツールです
たとえば、大きなファイルをgzipコマンドで圧縮する場合、
$ gzip bigfile
を実行すると、圧縮されたbigfile.gzができます
しかし、実行中は何のメッセージも出力しないので、いつ終わるのかがわかりません
そこで、pvコマンドを利用して、
$ pv bigfile | gzip -c > bigfile.gz
を実行すると、
$ pv bigfile | gzip -c > bigfile.gz
129MB 0:00:15 [92.8MB/s] [===========> ] 36% ETA 0:00:31
のように、全体量、経過時間、秒あたりの通過量、現在実行状況(ゲージと%)、残り時間が表示されます
このようにpvは非常に便利ですが、パイプを通過するデータ量を監視するので、パイプでつながれたコマンド形式にしか対応できません
sqlldrとpvをつなげる
前述のとおり、sqlldrは現在、何件ロードしたかを標準出力に書き出しています
この件数の部分だけをとりだして、pvにパイプで渡すことができれば、何とかなりそうです
実行状況がわかればいいので、ロードするバイト数ではなく、レコード件数で十分です
そこで、簡単なawkを実行するシェルスクリプト作成し、sqlldrの標準出力を読み取り、件数に相当する文字数を出力するようにしてみます
# !/bin/bash
awk -F'件数' '
BEGIN { SV = 0; }
NF==2{
for (i = 0; i < $2 - SV; i++) {
printf("1");
}
SV = $2;
}'
このスクリプトは実行可能にする必要があるので、エディタで保存後に実行権を与えます
$ chmod +x loadcount
処理内容は以下の通りです
・「件数」という文字列を区切りとして、フィールド数(NF)が2のとき(=xxx件数yyyとなっているとき)の「件数」の
後ろの文字列を取り出します($2)
・前回取り出した件数との差分の数だけ「1」という1バイトの文字を出力しています
つまり、sqlldrが1000レコードロードすると、「1」が1000個出力されます
pvコマンドは入力がパイプの場合、全体量がわからないので、その場合は-sオプションで全体量を指定することができます
この場合の全体量はロード対象ファイルのレコード件数になります
レコード件数(行数)はwcコマンドを使って得ることができます
$ wc -l ファイル名
最終形は以下のようになります
$ sqlldr USER/PASS@SID control=t1.ctl | ./loadcount | pv -p -t -e -s `cat t1.csv|wc -l` > /dev/null
0:00:20 [========> ] 17% ETA 0:01:33
・USER/PASS@SIDはOracleに接続するための記述子です
・t1.ctlはsqlldrの入力制御ファイルです
・t1.csvはロード対象のデータファイルです
うまくsqlldrの実行状況監視をすることができました