【实用脚本】数据库备份巡检自动还原脚本

TangLu 未命名 2022-08-30 671 0

脚本作用

公司有多个网络环境、数十个实例,每个实例每天都会有备份任务(Xtrabackup物理备份),该脚本可以根据用户输入的信息去寻找对应环境下最新的备份文件然后自动启动实例进行还原,可以节约人工还原的时间

#!/bin/bash
while true
do
	read -p "请输入需要还原的数据库备份环境[pre|dev|test]": MYSQL_ENV
	if [ $MYSQL_ENV != 'pre' ] && [ $MYSQL_ENV != 'dev' ] && [ $MYSQL_ENV != 'test' ] ;then
	    echo "请输入正确的备份环境"
	    continue 
        fi

	array=`ls /data/backup/mysql_backup_from_${MYSQL_ENV}`                                                                                                                            
	echo "该环境下存在以下数据库实例:${array[*]}"
	read -p "请输入需要还原的实例简称,如[public|qixin|wp]": MYSQL_INSTANCE
	mysql_instance_dir=/data/backup/mysql_backup_from_${MYSQL_ENV}/${MYSQL_INSTANCE}

	echo "需要还原的数据库实例:${MYSQL_ENV}环境 ${MYSQL_INSTANCE}实例"
	sleep 1

	if [ `ls -t $mysql_instance_dir 2>/dev/null | awk '$0~/xbstream/' | wc -l 2>/dev/null` -eq 0 ];then
	  echo "该目录不存在备份文件,请重新输入" 
	else
	  latest_bak=`ls -t $mysql_instance_dir | awk '$0~/xbstream/' | awk 'NR==1'`
	  echo "需要还原的数据库备份文件:${latest_bak}"
	  sleep 1
	  break
	fi
done

start_time=`date +%s`


cat << EOF
------------------------
| 数据库备份还原测试   |
| 即将恢复最新1次备份  |
------------------------
EOF
sleep 1
echo "" 
echo "" 


echo "STEP 1-------------------->" 
echo "`date +%F\ %T`: 即将对${MYSQL_ENV}环境 ${MYSQL_INSTANCE}实例进行还原测试,备份集 ${latest_bak}"  
sleep 1
echo "" 
echo "" 

echo "STEP 2-------------------->"
rm -rf /data/restore_mysql/* && echo "`date +%F\ %T` : 清空备份还原目录"  
sleep 1
echo "" 
echo "" 

echo "STEP 3-------------------->" 
echo "`date +%F\ %T`: 开始解压备份文件" 
/usr/local/mysql/bin/lz4_decompress $mysql_instance_dir/$latest_bak /data/restore_mysql/auto_restore_mysql_lz4
echo "" 
echo "" 

echo "STEP 4-------------------->" 
echo "`date +%F\ %T`: 开始解压流备份" 
xbstream -x < /data/restore_mysql/auto_restore_mysql_lz4 -C /data/restore_mysql/
if [ $? -eq 0 ];then
  echo "`date +%F\ %T`: 解压完成,删除lz4文件" 
  rm -rf /data/restore_mysql/auto_restore_mysql_lz4
else
  echo "`date +%F\ %T`: 备份文件删除失败,脚本退出" 
  exit 1
fi
echo "" 
echo "" 


echo "STEP 5-------------------->" 
netstat -ntulp | grep 3333 &> /dev/null
if [ $? -eq 0 ];then
  echo "`date +%F\ %T`: 数据还原实例正在运行,将停止服务" 
  /usr/local/mysql/bin/mysqladmin -udba -pHzdba666#@888 -S /tmp/mysql3333.sock shutdown &> /dev/null
  if [ $? -eq 0 ];then
    echo "`date +%F\ %T`: 数据还原实例已停止,将继续进行数据恢复" 
    rm -rf /data/mysql3333/data/* && echo "`date +%F\ %T`: 已清空数据还原实例目录" 
  else
    echo "数据还原实例停止失败" 
    exit 1
  fi
else
  echo "`date +%F\ %T`: 数据还原实例未运行,将继续进行数据恢复" 
  rm -rf /data/mysql3333/data/* && echo "`date +%F\ %T`: 已清空数据还原实例目录" 
fi
echo "" 
echo "" 

echo "STEP 6-------------------->" 
/bin/xtrabackup --defaults-file=/etc/my3333.cnf --prepare --target-dir=/data/restore_mysql/ 
if [ $? -eq 0 ];then
  echo "`date +%F\ %T`: 备份文件日志应用完成" 
else
  echo "`date +%F\ %T`: 备份文件日志应用失败"
  exit 1
fi
echo "" 
echo "" 

echo "STEP 7-------------------->" 
/bin/xtrabackup --defaults-file=/etc/my3333.cnf --move-back --target-dir=/data/restore_mysql/ 
if [ $? -eq 0 ];then
  echo "`date +%F\ %T`: 备份文件还原完成" 
else
  echo "`date +%F\ %T`: 备份文件还原失败" 
  exit 1
fi
echo "" 
echo "" 

echo "STEP 8-------------------->" 
if [ -d /data/mysql3333/log ];then
  mkdir -p mkdir /data/mysql3333/{log,data,tmp}  && touch /data/mysql3333/log/error.log && mkdir /data/mysql3333/log/{slowlog,binlog,relaylog} -p
  chown -R mysql. /data/mysql3333
fi


/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my3333.cnf &
sleep 300

netstat -ntulp | grep 3333 &> /dev/null
if [ $? -eq 0 ];then
  echo "`date +%F\ %T`: 备份文件已成功还原,数据还原实例已启动" 
else
  echo "`date +%F\ %T`: 数据还原实例启动失败,请检查" 
  exit 1
fi
echo "" 
echo "" 
end_time=`date +%s`
count_time=$[ $end_time - $start_time ]
echo "本次恢复耗时:$count_time 秒" 

sleep 10


评论