各ログに約 750,000 行のデータを含む約 48 個のログをロードする必要がある場所で実行する週次レポート ジョブがあります。これを容易にするために、SQL*Loader を外部プロセスとして (ProcessBuilder を使用して) 次々に実行する Java ジョブを使用しています。ただし、最近、このプロセスはロード中に異常終了し、テーブルのロックを引き起こし、DB チームとチケットを開いてハングしているセッションを強制終了できるまで、基本的にプロセスが停止します。SQL*Loader を使用するよりも、このアップロード プロセスを処理するためのより良い方法はありますか、それとも制御ファイルまたはコマンド ラインのいずれかを変更して、制御ファイルまたはコマンド ラインを恐ろしい死に至らしめるのを防ぐ方法はありますか?
プロセスの開始時に、ロード先のテーブルを切り捨て、次の制御ファイルを指定してこのコマンド ラインを実行します。
コマンドライン:
C:\Oracle\ora92\BIN\SQLLDR.EXE userid=ID/PASS@DB_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 時間かかります。