2011-07-07 15 views
0

毎週レポート・ジョブを実行して、約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時間かかります。

答えて

0

「死んでいる」とはどういう意味ですか?ログには何かありますか?

セッションを終了するためにDBAを取得する必要がある場合は、データベースセッションがまだアクティブであることを意味します。その場合は、エラーが発生した後、ロード中、待機中またはロールバック中のいずれかです。それが行っているDBAから調べてください。ロールバックしている場合は、エラーが返されるように完全にする必要があります。

私はSQLローダではなく外部テーブルを調べます。ファイルはDBサーバー上でアクセスできる必要がありますが、より簡単なSQL操作になり、エラー処理が改善される可能性があります。

0

100000はかなり低いですが、あなたは十分にすべてのそれらの挿入のために取り消しているあなたのDBAに確認してください。.. logfile.logにもプロセスに何かを

を実行している間、それが監視保つためにそれらを求めますか? DBAにアラートを確認させてください。

よろしくお願いします。

関連する問題