注册
10小时迁移100TB数据
技术分享/ 文章详情 /

10小时迁移100TB数据

2022/11/19 2799 2 0

迁移方法

DPC重新部署,从旧DPC集群迁移数据到新DPC集群中,业务停机10小时,在此时间内需要迁移100T的数据。方法说明:

  1. 通过TABLEDEF 将集群中的所有表定义拿到约1.7万张表,并导出到一个TXT 文本中,TXT文本约200MB.
  2. 通过sed之类的命令,将表定义修改成通用的,如删除storeage之类的。
  3. 在新DPC集群上创建同样的表结构,其中优化了1.2万张表的分布方式。
  4. 通过dmfdlr工具,从旧集群导出表的文本数据后,即导入到新集群的同名表中。
  5. 通过6台服务器,启动6个dmfdlr工具,并行执行。根据表的大小人工调度并行任务,在不同表间实现并行导入。dmfdlr不支持同一张表的并行导入。
  6. 对比迁移后数据。

迁移表结构

通过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表。
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服