我有一个 shell 脚本,如果手动运行或通过 Cron 运行,则可以正常执行并使用 sqlldr 将分隔文件成功加载到数据库。
然而,通过 Autosys 脚本执行时,sqlldr 说它成功了,然而数据实际上从未加载到数据库中。
有谁在使用 sqlldr/Autosys 组合时遇到过这种情况吗?如果有,知道解决方法/修复方法吗?
答案1
原因可能有很多。我遇到的一个问题是,在执行批处理作业时,其中一个启动脚本被绕过,LANG 环境变量未设置,这影响了数据库连接的语言设置,包括默认日期格式/语言,这意味着记录会因为日期无效而被拒绝。
不太明显的问题可能与路径有关(找不到数据文件、控制文件)或与安全有关(数据库功能可能尝试记录终端)。
SQLLDR 应该生成一个 LOG 文件和一个包含被拒绝记录的 BAD 文件,这可能会给出提示
答案2
这是脚本
!/bin/sh
PATH=$PATH:/usr/local/bin/:/usr/java/jre1.6.0_17/bin/
export ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_2
export ORACLE_SID=orcl
export ORAENV_ASK=NO
. oraenv
sqlldr system/123456@orcl control=test.ctl,DATA=test.dat,ERRORS=100000000,MULTITHREADING=true,BAD=test.bad
cat test.bad >> rejected.txt
答案3
.oraenv 行中点缀的“oraenv”在哪里。从 autosys 运行时,pwd 会有所不同吗?
尝试在脚本中的 !/bin/sh 后面放置“set -x”。
那不应该是 !#/bin/sh 而不是 !/bin/sh
Autosys 应该能够生成一些 STDERR/STDOUT 日志。您可以发布这些日志吗?
答案4
这是通过 CRONTAB 或任何其他 sqlldr 调度系统运行的正确语法
导出 LD_LIBRARY_PATH=/oracle/ora9/lib:$LD_LIBRARY_PATH 导出 ORACLE_HOME=/oracle/ora9 导出 PATH=/oracle/ora9/bin:$PATH
sqlldr userid=user/password@db \ control=/Path/to/control/file.ctl \ data=/give/datafile/path/datfile \ log=same for log \ bad=same for bad errors=999