迁移背景:
将部署架构相同的源端/目标端kadb集群,使用gpbackup、gprestore命令进行数据迁移的脚本
#!/bin/bash
#****************************************************
#获取源端及目标端主机名和数据目录
#*************************************************
echo "Get source hostname and datadir..."
psql postgres -t -c "select hostname||'|'||datadir from gp_segment_configuration where role in ('m','p') order by dbid" | sed '/^$/d' > source.out
echo "Source hostname and datadir"
cat source.out
echo
echo "Get destination hostname and datadir..."
psql -hmdw2 postgres -t -c "select hostname||'|'||datadir from gp_segment_configuration where role in ('m','p') order by dbid" | sed '/^$/d' > dest.out
echo "Destination hostname and datadir"
cat dest.out
echo
psql postgres -t -c "select distinct(hostname) from gp_segment_configuration where role in ('m','p') " | sed '/^$/d' > host.out
#cat host.out
array=`cat host.out`
num_host=(({#array[@]}-1))
#echo $num_host
#****************************************************
#源端开始备份,获取备份时间戳用于目标端恢复
#*************************************************
echo "Source gpbackup begin... `date`"
echo
gpbackup --data-only --dbname postgres --include-table-file table.lst --jobs 2 --leaf-partition-data > backup.info 2>&1
cat backup.info
#****************************************************
#源端备份成功,获取备份时间戳用于恢复,并行拷贝备份数据到目标端各个节点
#*************************************************
if [ $? -eq 0 ]; then
echo "Source gpbackup end... `date`"
echo
timestamp=`grep 'Backup Timestamp' backup.info | cut -d'=' -f 2`
i=1
while read LINE #对每个实例循环拷贝备份数据
do
hostname_s=${LINE%|*}
datadir_s=${LINE#*|}
echo "source hostname:$hostname_s" #源端主机名
echo "source datadir:$datadir_s" #源端数据目录
hostname_d=`sed -n "${i}p" dest.out | cut -d'|' -f1`
datadir_d=`sed -n "${i}p" dest.out | cut -d'|' -f2`
echo "目标端主机名:$hostname_d"
echo "目标端数据目录:$datadir_d"
echo
#echo ssh hostname_s "scp -r {datadir_s}/backups {hostname_d}:{datadir_d}"
echo "远程拷贝{hostname_s}主机数据至{hostname_d}的${datadir_d}目录"
echo
nohup ssh hostname_s scp -r {datadir_s}/backups {hostname_d}:{datadir_d} >/dev/null 2>&1 &
#nohup ssh $hostname_s "ls -l" &
echo "远程拷贝主机${hostname_s}数据调度完成"
echo
i=((i+1))
done < source.out #source.out:源端主机名及数据目录
#****************************************************
#检测数据拷贝进度,拷贝完成后开始目标端恢复
#*************************************************
echo "在主机${array[@]}上检查scp进程是否完成"
echo
for hostname in "${array[@]}" #对源端主机逐一检测scp进程
do
echo "检查$hostname主机拷贝进度"
echo
i=0
while true #每个主机检查3次,确认scp命令完成
do
ssh $hostname 'ps -ef | grep scp | grep -v grep > /dev/null'
if [ $? -ne 0 ];then #没有grep到scp进程,拷贝完成
echo "There aren't scp process in $hostname"
i=((i+1))
if [ $i -eq 3 ]; then #检查3次完成,检查下一个主机
echo "$hostname check scp finish,continue check next host ..."
echo
break
fi
else
echo "There ars scp processes in $hostname"
sleep 2
i=1
fi
done
#如果检查到最后一个主机,每一个主机的scp都完成,开始目标端恢复
if [ "hostname" = "{array[${num_host}]}" ]; then
echo "Begin restor `date`"
echo
ssh mdw2 "gprestore --timestamp $timestamp"
if [ $? -eq 0 ]
then
echo "gpresotre finished `date`"
echo
else
echo "gpresotre error,check gprestor log"
echo
fi
fi
done
else
echo "gpbackup error"
fi