3
回答
shell脚本中使用sqlldr导入数据失败
【腾讯云】校园拼团福利,1核2G服务器10元/月!>>>   
使用java从远程数据库中导出数据,再导入生产库中,如果直接使用jdbc导入的话,太慢了,需要时间很长,所以想到用sqlldr工具,
由于涉及多个表,所以使用多条命令分别对每个表的数据进行导入,数据文件与控制文件以及shell脚本如下示,
但是出现一个很奇怪的问题,我在java中使用Runtime.getRuntime().exec("/home/user/sqlldrs.sh")来执行脚本,
却只有第一条sqlldr命令执行成功了(生成了log文件),下面的都没有成功,程序也没有抛出什么异常,这是为什么呢?


还有一个问题是我尝试用linux中的crond定时器来执行这个脚本,在日志中看到了定时器已经起作用了,但脚本的执行似乎没有成功,
这让我很不解,而我直接手动来执行脚本的时候,脚本是可以成功运行的。这个问题也很让我头疼,希望各位帮忙看一下原因。


数据文件格式如下(第个文件的数据量大概是20万条左右) 
col1|*|col2|*|col3|*|col4|*|col5
100337030|*|7|*|766|*||*|
100337034|*|7|*|759|*||*|
100337035|*|7|*|759|*||*|
100337036|*|7|*|759|*||*|
100337063|*|7|*|200|*||*|


控制文件如下
load data 
CHARACTERSET UTF8 
infile '/home/user/data/20131216/a.txt' 
truncate into table a
fields terminated by '|*|' 
trailing nullcols 
(col1,col2,col3,col4,col5)


shell脚本如下
#!/bin/sh
dateStr=`date +%Y%m%d`;
datapath="/home/user/data/"$dateStr;
echo $datapath;
sqlldr userid=user/pwd@ORCL control=$datapath/a.ctl log=$datapath/a.log skip=1;
sqlldr userid=user/pwd@ORCL control=$datapath/b.ctl log=$datapath/b.log skip=1;
sqlldr userid=user/pwd@ORCL control=$datapath/c.ctl log=$datapath/c.log skip=1;
sqlldr userid=user/pwd@ORCL control=$datapath/d.ctl log=$datapath/d.log skip=1;
举报
共有3个答案 最后回答: 4年前

先检查你自己是否有使用crontab的权限 .如果是导入数据. 换成 append  试试..

 还有。 就是最好导入和导出分开来做。

--- 共有 5 条评论 ---
天涯明月稻@_crazy_ 这个是没问题的,我可以确定,之前不都说了,手动执行shell脚本是可以执行的,这样的话,脚本开头怎么可能出错呢? 4年前 回复
calvary回复 @天涯明月稻 : "#!/bin/sh" 看看你 shell脚本的开头。 如果其他的没问题的话。 估计就这了。 shell脚本 一般 有三种来解析。 bash / ksh / csh “sh”好像没见过。 4年前 回复
天涯明月稻首先,整个脚本手动可以执行,然后我按你说的把脚本中的sqlldr命令只留下一条,其他注释掉,再设置定时任务执行脚本,但还是没有执行到,在相关目录下并没有log文件的生成 4年前 回复
calvary回复 @天涯明月稻 : crontab没问题。单个test也没问题。 那.你shell脚本里有 四个导入的任务. 那么应该也要对应 四个ctl文件. 先单个的放入。试一遍。 然后看看log文件。会有详细的问题记录的。 4年前 回复
天涯明月稻权限是有的,任务已经在日志中打出来了,导入导出分开来做是指怎么分开? 4年前 回复
终于发现问题所在了,cron中调用脚本时,其环境变量与用户本地的环境变量有差异,所有有些命令执行不了,直接把本地用户配置的环境变量全部拷贝到shell脚本的开头就可以了。

你好!我现在开发一个功能用到在Linux下Java调用sqlldr shell脚本,碰到跟你差不多的情况,手工执行shell脚本导入数据没有问题,但同样是使用Runtime.getRuntime().exec("xx.sh"),后台打印sqlldr日志正常,但数据库中并没有导入任何记录,找了很久都没有找到问题,所以想向你请教一下详细解决办法,你上面写的解决方法没有看太明白,谢谢了

--- 共有 1 条评论 ---
天涯明月稻应该是环境变量问题,你的shell脚本里面是不是用到了一些命令不是系统本身的自带的,有可能是你自己安装的软件,这样的话,你会在/etc/profile或者是自己用户下面的.brash_profile中添加相关的环境变量,你把这些环境变量配置都拷到你的脚本开头,这样就可以解决环境变量的问题了 4年前 回复
顶部