提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
使用sqlldr导入dat文件,导出请移步oracle数据导出dat文件和ctl文件(使用shell脚本)
一、单表导入
1.创建配置文件
- 创建database.cfg
#中间库数据源
DataBaseMid=abc/\"abc\"@127.0.0.1:1521/orcl
2.编写脚本
创建testLoad.sh
#!/bin/bash
if [ ! -n "$1" ];then
echo "可执行程序输入不规范,输入样式 sh load.sh 文件名 数据源"
exit 0
fi
#需要装载的文件名称
fileName=$1
if [ ! -n "$2" ];then
. ~/cfg/database.cfg
DATABASE=$DataBaseMid
else
DATABASE=$2
fi
#logFile文件,输出当前执行日志
logFile=~/logs/loadlog
#开始时间
startTime=`date +%F |sed 's/-//g' ``date +%T | sed 's/://g'`
#日志输出
echo "--->bin--->load--->TABLENAME="$fileName"---BEGIN--->TIME="$startTime >>$logFile/loadLog.log
#移动至数据文件当前目录下准备执行数据装载
if [ ! -n "$3" ];then
cd ~/data/oldData
else
cd $3
fi
#fileCtl控制文件,控制数据装载的字段顺序
fileCtl=${fileName/%dat/ctl}
#fileBad文件,记录数据生成
fileBad=${fileName/%dat/bad}
#fileLog文件,记录当前文件的执行日志
fileLog=${fileName/%dat/log}
#lineCounts,记录当前文件含有多少条记录
lineCounts=$(sed -n '$=' $fileName)
#日志输出
echo "文件为"$fileName",文件行数为"$lineCounts >>$logFile/fileLoad.log
#开始实施数据装载
sqlldr $DATABASE control=$fileCtl bad=$logFile"/"$fileBad log=$logFile"/"$fileLog >>$logFile/load.log errors=10000000 rows=10000 readsize=104857600 bindsize=104857600
#结束时间
endTime=`date +%F |sed 's/-//g' ``date +%T | sed 's/://g'`
#日志输出
echo "--->bin--->load--->TABLENAME="$fileName"---END--->Time"=$endTime >>$logFile/loadLog.log
3.执行
sh testLoad.sh 文件名 数据源
二、多表导入
多表导出主要逻辑是通过脚本循环调用上面的testLoad.sh
1.编写脚本
编写testNewImpl.sh
#!/bin/bash
PATH=/usr/java/jdk1.8.0_181/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/openssh-8.6p1/bin:/usr/local/sbin:/home/zyb/bin:/home/zyb/bin:/u01/app/oracle/product/11.2.0/client_1/patch:/u01/app/oracle/product/11.2.0/client_1/bin
export PATH
. ~/cfg/database.cfg
######################数据库导入开始#########################
#数据文件路径
newPath=~/data/newData
echo "请再一次确认,导入地址是否正确,当前地址为:${DATABASE_SRC}!!!!!!,重要的事情提示三遍!!!"
echo "请再一次确认,导入地址是否正确,当前地址为:${DATABASE_SRC}!!!!!!,重要的事情提示三遍!!!"
echo "请再一次确认,导入地址是否正确,当前地址为:${DATABASE_SRC}!!!!!!,重要的事情提示三遍!!! 按回车继续"
read helloworld
rm -rf $Path/*
#导入数据
filePath=$(ls $newPath)
echo "" > testNewImp.log
for pathName in $filePath
do
#测试环境并发效率不高,暂去除并发
{
if [[ $fileName == *.dat ]];then
echo "执行:::::"$fileName
echo "执行:::::"$fileName >> testNewImp.log
sh testLoad.sh $fileName $DATABASE_RET $newPath/$pathName
fi
}&
done
sleep 2
if [ $? == 0 ];then
echo "-----------end $pathName success------------------"
echo "-----------end $pathName success------------------" >> testNewImp.log
else
echo "-----------end $pathName fail---------------------"
echo "-----------end $pathName fail---------------------" >> testNewImp.log
fi
done
M=`whoami`
num=$(ls /home/$M/logs/loadlog/*.bad | wc -l)
if [ $num == 0 ];then
echo "生产数据加载导入无错误文件,移植过程完成!"
exit 0
else
echo "生产数据加载导入有错误文件,请检查!!!"
exit 1
fi
2.执行脚本
sh testNewImpl.sh
总结
以上脚本可能测试不充分,如有问题可私信