我们平时都用sqlldr进行将文本数据加载到数据库,但是有时候由于数据问题导致入库率不能达到100%,因此我们要检测是否存在不能入库的数据记录。以下shell脚本就是统计文本中记录数和数据库中记录数是否一致。此脚本仅供大家参考,仍需要完善,各位请多多指教。
#!/bin/sh #定义参数 data_path="/home/oracle/txtdata" conf_file="/home/oracle/config" log_file="/home/oracle/log" date=`date +"%Y%m%d"` #统计此次导入的文件中个文件的行数 file_cout=0 #切换到data_path路径下 cd ${data_path} #检查是否有txt文件 file_cout=`ls -A *.txt |wc -l` #清空txtdata.conf文件 echo ''>${conf_file}/txtdata.conf #判断当期是否有要进行sqlldr文件 if [ ${file_cout} -eq 0 ]; then echo "此次没有要进行sqlldr的文本!清检查FTP是否执行!" else #统计各文本行数并放到配置文件中 for var in `ls -A *.txt|awk '{print $NF}'|sort -u`; do wc -l $var >>${conf_file}/tempfile.conf done fi #切换到配置文件路径下 cd ${conf_file} #将.txt替换掉 sed 's/.txt/|/g' tempfile.conf|uniq > txtdata.conf #删除空行 #sed '/^$/d' txtdata.conf #用|替换空格 sed 's/[[:space:]]/|/g' txtdata.conf |uniq >tempfile2.conf #登录数据库 sqlplus -s oradev/oracle <<EOF set echo off; set feedback off; set verify off; set term off; set trimspool on; set heading off; set newpage none; spool '/home/oracle/config/dbdata.conf' select count(1) as num,'|','user_tables' from user_tables; spool off; exit; EOF #拼接文件 paste tempfile2.conf dbdata.conf > sumfile.conf #比较数据条数 awk -F'|' ' {if($2==$4 && $1==$3) { print $2":数据行数匹配,可以进行下一步操作" } else { print $2":数据行数不匹配,请检查sqlldr日志!" } }' sumfile.conf >>${log_file}/check${date}.log #删除临时文件 rm tempfile.conf rm tempfile2.conf #退出 exit 0