您的位置:首页 > 数据库 > Oracle

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

2015-07-12 12:09 477 查看
在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Oracle shell ETL aix 数据库