效率较高的Oracle数据库之间数据同步(非dblink)

在Oracle数据库之间不能建立数据链路情况下,该代码用于数据库之间数据同步。 操作系统环境:AIX

#!/usr/bin/bash
#created by lubinsu
#2015
source ~/.bash_profile
echo "读取配置信息"
connectstr=`cat ${etl_dispatch}/db_constr.txt`
proc_id=$1
l_date=$2
data_dir="/int_file/lubinsu/etl_data"
log_path=${etl_dispatch}/etl_log/${l_date}_db_2_db_$$.log
base_info=`${etl_dispatch}/get_info_from_db.sh "${connectstr}" "SELECT s.src_db, s.target_db, s.target_tb FROM shell_proc_db_2_db_cfg s WHERE s.proc_id = ${proc_id};"`

#get infos
src_db=`echo ${base_info} | awk '{print $1}'`
target_db=`echo ${base_info} | awk '{print $2}'`
target_tb=`echo ${base_info} | awk '{print $3}'`
field_list=`${etl_dispatch}/get_info_from_db.sh "${connectstr}" "SELECT NVL(s.field_list,field_list_auto) FROM shell_proc_db_2_db_cfg s WHERE s.proc_id = ${proc_id};"`

echo "${field_list}" > ${data_dir}_${target_tb}_${l_date}$$
${etl_dispatch}/clearspace.sh ${data_dir}_${target_tb}_${l_date}$$
field_list=`cat ${data_dir}_${target_tb}_${l_date}$$`
rm -f ${data_dir}_${target_tb}_${l_date}$$

${etl_dispatch}/get_info_from_db.sh "${connectstr}" "INSERT INTO shell_proc_db_2_db_log(proc_id, run_msg, status) VALUES(${proc_id},to_char(SYSDATE, 'yyyy/mm/dd hh24:mi:ss') || ' 读取数据抽取语句', '2');"
src_sql=`${etl_dispatch}/get_info_from_db.sh "${connectstr}" "SELECT s.src_sql FROM shell_proc_db_2_db_cfg s WHERE s.proc_id = ${proc_id};"`

echo ${src_sql} > ${data_dir}/$$.sql

src_db_connectstr=`sed -n /${src_db}=/p ${etl_dispatch}/connectorCfg | awk -F= '{print $2}'`
${etl_dispatch}/get_info_from_db.sh "${connectstr}" "UPDATE shell_proc_db_2_db_log o SET o.modify_dt = SYSDATE, o.run_msg = o.run_msg || CHR(13) || to_char(SYSDATE, 'yyyy/mm/dd hh24:mi:ss') || ' 获取源数据库信息' WHERE o.proc_id = ${proc_id};"
echo "${etl_dispatch}|${src_db_connectstr}|${data_dir}/$$.dat|${data_dir}/$$.sql" >> ${log_path}
${etl_dispatch}/sqluldr2_aix64_9208.bin USER=${src_db_connectstr} sql=${data_dir}/$$.sql head=no FILE=${data_dir}/$$.dat field='^' log=${etl_dispatch}/etl_log/${l_date}_db_2_db_$$.log
if [ $? -eq '0' ]
then
${etl_dispatch}/get_info_from_db.sh "${connectstr}" "UPDATE shell_proc_db_2_db_log o SET o.modify_dt = SYSDATE, o.run_msg = o.run_msg || CHR(13) || to_char(SYSDATE, 'yyyy/mm/dd hh24:mi:ss') || ' 生成数据文件' WHERE o.proc_id = ${proc_id};"
else
${etl_dispatch}/get_info_from_db.sh "${connectstr}" "UPDATE shell_proc_db_2_db_log o SET o.modify_dt = SYSDATE, o.status = 3, o.run_msg = o.run_msg || CHR(13) || to_char(SYSDATE, 'yyyy/mm/dd hh24:mi:ss') || ' 数据文件生成出错' WHERE o.proc_id = ${proc_id};"
exit 1
fi

echo "unrecoverable" > ${data_dir}/$$.ctl
echo "load data" >> ${data_dir}/$$.ctl
echo "CHARACTERSET ZHS16GBK" >> ${data_dir}/$$.ctl
echo "infile '${data_dir}/$$.dat'">> ${data_dir}/$$.ctl
echo "INTO TABLE ${target_tb}" >> ${data_dir}/$$.ctl
echo "TRUNCATE" >> ${data_dir}/$$.ctl
echo "fields terminated by '^'" >> ${data_dir}/$$.ctl
echo "trailing nullcols" >> ${data_dir}/$$.ctl
echo "(" >> ${data_dir}/$$.ctl
echo ${field_list} >> ${data_dir}/$$.ctl
echo ")" >> ${data_dir}/$$.ctl

${etl_dispatch}/get_info_from_db.sh "${connectstr}" "UPDATE shell_proc_db_2_db_log o SET o.modify_dt = SYSDATE, o.run_msg = o.run_msg || CHR(13) || to_char(SYSDATE, 'yyyy/mm/dd hh24:mi:ss') || ' 生成控制文件完成' WHERE o.proc_id = ${proc_id};"
target_db_connectstr=`sed -n /${target_db}=/p ${etl_dispatch}/connectorCfg | awk -F= '{print $2}'`
sqlldr ${target_db_connectstr} control=${data_dir}/$$.ctl log=${etl_dispatch}/etl_log/${l_date}_db_2_db_$$.log direct=y 
if [ $? -eq '0' ]
then
${etl_dispatch}/get_info_from_db.sh "${connectstr}" "UPDATE shell_proc_db_2_db_log o SET o.modify_dt = SYSDATE, o.status = 0, o.run_msg = o.run_msg || CHR(13) || to_char(SYSDATE, 'yyyy/mm/dd hh24:mi:ss') || ' 目标数据抽取完成' WHERE o.proc_id = ${proc_id};"
else
${etl_dispatch}/get_info_from_db.sh "${connectstr}" "UPDATE shell_proc_db_2_db_log o SET o.modify_dt = SYSDATE, o.status = 3, o.run_msg = o.run_msg || CHR(13) || to_char(SYSDATE, 'yyyy/mm/dd hh24:mi:ss') || ' SQLLDR数据入库出错' WHERE o.proc_id = ${proc_id};"
fi
rm ${data_dir}/$$.dat
rm ${data_dir}/$$.ctl

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值