毎週レポート・ジョブを実行して、約48万のログをロードし、各ログに約750KBのデータをロードする必要があります。これを容易にするために、SQL * Loaderを外部プロセス(ProcessBuilderを使用)として順番に実行するJavaジョブを使用しています。しかし、最近では、このプロセスはテーブルのロックを引き起こしているロード中に異常終了しており、基本的にDBチームとチケットを開いてハングしたセッションを終了するまでプロセスを停止させています。 SQL * Loaderを使用するよりも、このアップロード・プロセスを処理するためのより良い方法があるのでしょうか、それとも恐ろしい死を犯さないようにコントロール・ファイルまたはコマンド行で変更できる変更がありますか?SQL * Loaderジョブが予期せず終了し、NOWAITでテーブルがロックされる
プロセスの開始時に、私は私がにロードし、次の制御ファイルで、このコマンドラインを実行していますテーブルを切り捨てる:
コマンドライン:
C:\Oracle\ora92\BIN\SQLLDR.EXE userid=ID/[email protected]_ID load=10000000 rows=100000 DIRECT=TRUE SKIP_INDEX_MAINTENANCE=TRUE control=ControlFile.ctl data=logfile.log
制御ファイル:
UNRECOVERABLE
Load DATA
INFILE *
Append
PRESERVE BLANKS
INTO TABLE MY_REPORT_TABLE
FIELDS TERMINATED BY ","
(
filler_field1 FILLER char(16),
filler_field2 FILLER char(16),
time TIMESTAMP 'MMDDYYYY-HH24MISSFF3' ENCLOSED BY '"',
partne ENCLOSED BY '"',
trans ENCLOSED BY '"',
vendor ENCLOSED BY '"' "SUBSTR(:vendor, 1, 1)",
filler_field4 FILLER ENCLOSED BY '"',
cache_hit_count,
cache_get_count,
wiz_trans_count,
wiz_req_size,
wiz_res_size,
wiz_trans_time,
dc_trans_time,
hostname ENCLOSED BY '"',
trans_list CHAR(2048) ENCLOSED BY '"' "SUBSTR(:trans_list, 1, 256)",
timeouts,
success ENCLOSED BY '"'
)
すべてのログのロードが完了したら、テーブルのインデックスを再構築してから、レポート処理を開始します。ランダムなログでちょうど死んでいるようですが、プロセスを再実行すると毎回違うポイントで失敗します。
UNRECOVERABLEとSKIP_INDEX_MAINTENANCEの理由は、読み込みを高速化するためです。それは、ログがロードされるまでに7〜12分かかることがありますが、ログがなくてもさらに悪化します。全体として、このプロセスが最初から最後まで実行されるのに約18時間かかります。