一个KADB使用gpbackup迁移数据的脚本

迁移背景:

将部署架构相同的源端/目标端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

相关推荐
剩下了什么18 小时前
MySQL JSON_SET() 函数
数据库·mysql·json
山峰哥18 小时前
数据库工程与SQL调优——从索引策略到查询优化的深度实践
数据库·sql·性能优化·编辑器
较劲男子汉18 小时前
CANN Runtime零拷贝传输技术源码实战 彻底打通Host与Device的数据传输壁垒
运维·服务器·数据库·cann
java搬砖工-苤-初心不变18 小时前
MySQL 主从复制配置完全指南:从原理到实践
数据库·mysql
山岚的运维笔记20 小时前
SQL Server笔记 -- 第18章:Views
数据库·笔记·sql·microsoft·sqlserver
roman_日积跬步-终至千里21 小时前
【LangGraph4j】LangGraph4j 核心概念与图编排原理
java·服务器·数据库
汇智信科21 小时前
打破信息孤岛,重构企业效率:汇智信科企业信息系统一体化运营平台
数据库·重构
野犬寒鸦1 天前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
晚霞的不甘1 天前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d
市场部需要一个软件开发岗位1 天前
JAVA开发常见安全问题:纵向越权
java·数据库·安全