我们平时都用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