SQL * Loader作业意外退出并导致表被NOWAIT锁定

时间:2011-07-07 21:28:34

标签: oracle sql-loader

我有一个每周报告作业,我必须加载大约48个日志,每个日志中有大约750k行数据。为了实现这一点,我们一直在使用一个Java作业,它将SQL * Loader作为外部进程(使用ProcessBuilder)依次运行。然而,最近这个进程在加载期间异常终止,这导致了对表的锁定,并且基本上导致进程停止,直到我们可以与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

CONTROL FILE:

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个小时。

2 个答案:

答案 0 :(得分:0)

你什么意思'死'?日志中有什么东西吗?

如果必须让DBA终止会话,则意味着数据库会话仍处于活动状态。如果是这样,它会在发生错误后加载,等待或回滚。从DBA中了解它正在做什么。如果它正在回滚,你应该让它完整,以便可以返回错误。

我会查看外部表而不是SQL Loader。这些文件需要在数据库服务器上可访问,但它使SQL操作更简单,这可能意味着更好的错误处理。

答案 1 :(得分:0)

100000非常低,但请与您的DBA核实,您对所有这些插件都有足够的撤消权限。要求他们在运行流程时对其进行监控

logfile.log上还有什么内容吗?还要让您的DBA检查alert.log

此致