DPC重新部署,从旧DPC集群迁移数据到新DPC集群中,业务停机10小时,在此时间内需要迁移100T的数据。方法说明:
通过SED 的一些用法,将TABLEDEF的表结构修改为通用的表结构:
#更新一级分区的列存表
sed -i '/LEVEL 5/d'
sed -i 's/"//g'
sed -i '/^PARTITION DMHASHP/d'
sed -i '/^ COMPRESS (/d'
sed -i -e '/PARTITION BY HASH/{n;d}'
sed -i -e '/PARTITION BY HASH/{n;d}'
sed -i 's/^PARTITION BY HASH.*/& PARTITIONS DEFAULT;/g'
#更新二级分区的列存表
update huge2
sed -i '/LEVEL 5/d'
sed -i 's/"//g'
sed -i '/^ COMPRESS (/d'
sed -i '/^SUBPARTITIONS 2/d'
sed -i 's/) STORAGE(HASHPARTMAP(1), STAT ASYNCHRONOUS, WITH DELTA, SECTION(65536), INITIAL 2, FILESIZE(32), ON TS_[0-9][0-9][0-9])/);/g'
sed -i 's/ STORAGE(INITIAL 2, FILESIZE(32), ON TS_[0-9][0-9][0-9]) //g'
sed -i 's/SUBPARTITION TEMPLATE/SUBPARTITIONS DEFAULT/g'
#更新非分区表
sed -i 's/"//g'
sed -i 's/ STORAGE(ON TS_[0-9][0-9][0-9], CLUSTERBTR) //g'
#更新一级分区表
sed -i 's/"//g'
sed -i '/^PARTITION DMHASHP/d'
sed -i -e '/PARTITION BY HASH/{n;d}'
sed -i -e '/PARTITION BY HASH/{n;d}'
sed -i 's/^PARTITION BY HASH.*/& PARTITIONS DEFAULT;/g'
#更新二级分区表
sed -i 's/"//g'
sed -i '/^SUBPARTITIONS 2/d'
sed -i 's/) STORAGE(HASHPARTMAP(1), ON TS_[0-9][0-9][0-9], CLUSTERBTR) ;/);/g'
sed -i 's/ STORAGE(ON TS_[0-9][0-9][0-9], CLUSTERBTR) //g'
sed -i 's/SUBPARTITION TEMPLATE/SUBPARTITIONS DEFAULT/g'
dmfldr导出导入数据的脚本:
#!/bin/bash
curr=$(cd "$(dirname "$0")";pwd)
user_id_out="USER1"
user_pw_out="123456789"
user_id_in="USER2"
user_pw_in="123456789"
ip_out="10.10.16.142:6231"
ip_in="192.168.10.42:5231"
tablefile=$1
if [ -z "$tablefile" ]; then
exit 1
fi
logpath="$curr/${tablefile}_log"
logfile="${logpath}/${tablefile}.log"
mkdir -p ${logpath}
dm_bin="/home/dmdba/dm8_dpc/bin"
export LD_LIBRARY_PATH=$dm_bin:$LD_LIBRARY_PATH
dmfldr_parain="LAN_MODE=TRUE IGNORE_AIMLESS_DATA=TRUE LOG_LEVEL=0 LOB_AS_VARCHAR=TRUE APPEND_OPTION=0 READ_ROWS=1000000 BUFFER_NODE_SIZE=50 BDTA_SIZE=10000 ROW_SEPERATOR='@!@' CHARACTER_CODE='UTF-8' FIELD_SEPERATOR='@|@' MODE='IN' COMMIT_OPTION=1 SINGLE_FILE=TRUE SILENT=FALSE"
dmfldr_paraout="LAN_MODE=TRUE IGNORE_AIMLESS_DATA=TRUE LOG_LEVEL=0 LOB_AS_VARCHAR=TRUE APPEND_OPTION=0 READ_ROWS=1000000 BUFFER_NODE_SIZE=50 BDTA_SIZE=10000 ROW_SEPERATOR='@!@' CHARACTER_CODE='UTF-8' FIELD_SEPERATOR='@|@' MODE='OUT' COMMIT_OPTION=1 SINGLE_FILE=TRUE SILENT=FALSE"
echo "------file: "${tablefile}" start time "`date +"%Y-%m-%d %H:%M:%S"` >>${logfile}
echo "" >>${logfile}
while read -r line
do
echo "---table: "$line >>${logfile}
echo "loadout start: "`date +"%Y-%m-%d %H:%M:%S"` >>${logfile}
tablename=`echo ${line}`
tabledir=${logpath}/${tablename}
mkdir -p ${tabledir}
mkdir -p ${tabledir}/data ${tabledir}/bad ${tabledir}/log
${dm_bin}/dmfldr userid=${user_id_out}/${user_pw_out}@$ip_out data=\'${tabledir}/data/${tablename}\' log=\'${tabledir}/log/${tablename}_out.log\' TABLE=${tablename} $dmfldr_paraout
echo "loadout over: "`date +"%Y-%m-%d %H:%M:%S"` >>${logfile}
cat ${tabledir}/log/${tablename}_out.log|grep "time used" >>${logfile}
cat ${tabledir}/log/${tablename}_out.log|grep "rows exported success" >>${logfile}
echo "filesize: `du -csh ${tabledir}/data|tail -n 1`" >>${logfile}
wait
sleep 1
echo "select count(*) ${tablename};" >>${logpath}/0count.sql
echo "loadin start: "`date +"%Y-%m-%d %H:%M:%S"` >>${logfile}
${dm_bin}/dmfldr userid=${user_id_in}/${user_pw_in}@$ip_in data=\'${tabledir}/data/${tablename}*\' log=\'${tabledir}/log/${tablename}_in.log\' badfile=\'${tabledir}/bad/${tablename}.bad\' TABLE=${tablename} $dmfldr_parain
wait
echo "loadin over: "`date +"%Y-%m-%d %H:%M:%S"` >>${logfile}
cat ${tabledir}/log/${tablename}_in.log|grep "time used" >>${logfile}
cat ${tabledir}/log/${tablename}_in.log|grep "loaded success" >>${logfile}
sleep 1
echo "">>${logfile}
rm -rf ${tabledir}/data/${tablename}*
done < $curr/${tablefile}
echo "------file: "${tablefile}" over time "`date +"%Y-%m-%d %H:%M:%S"` >>${logfile}
一、0d2d.sh 用于不同达梦数据库间的数据迁移。 使用方法: 1. 修改d2d.sh中的数据库连接信息,及dm_bin目录 2. 编辑个文本文件,指定表名,如vi testa table1 table2 table3 3. 运行sh d2d.sh testa 脚本会自动从ip_out库中将table1的表数据导出为文本,然后再将该文本导入ip_in库中,完成后删除table1的文本;再依次进行table2 table3表。
文章
阅读量
获赞
