【实用脚本】MySQL备份自动恢复脚本

TangLu 未命名 2021-04-14 2041 0

一、脚本背景

PWC审计有要求对数据库备份文件进行定期还原验证并留痕。使用该脚本对指定实例最新备份文件进行自动恢复并邮件通知

二、脚本内容

#!/bin/bash
mysql_instance_dir=/data/mysql_backup/dbapp
latest_bak=`ls -t $mysql_instance_dir | awk '$0~/xbstream/' | awk 'NR==1'`
restore_log=/tmp/restore_`date +%F`.log
start_time=`date +%s`

echo > $restore_log
echo "------------------------" >> $restore_log
echo "|数据库备份每周恢复验证|" >> $restore_log
echo "| 即将恢复最新一次备份 |" >> $restore_log
echo "------------------------" >> $restore_log
echo "" >> $restore_log
echo "" >> $restore_log

echo "--------------------STEP 1--------------------" >> $restore_log
echo "即将恢复最新备份,备份文件: $mysql_instance_dir/$latest_bak `date +%F\ %T`" >> $restore_log 
sleep 1
echo "" >> $restore_log
echo "" >> $restore_log

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

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

echo "--------------------STEP 4--------------------" >> $restore_log
echo "开始解压流备份 `date +%F\ %T`" >> $restore_log
xbstream -x < /data/restore_mysql/auto_restore_mysql_lz4 -C /data/restore_mysql/
echo "" >> $restore_log
echo "" >> $restore_log


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

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

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

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

echo "--------------------STEP 9--------------------" >> $restore_log
chown -R mysql. /data/mysql3333
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my3333.cnf &
sleep 10
netstat -ntulp | grep 3333 &> /dev/null
if [ $? -eq 0 ];then
  echo "备份文件已成功还原,数据还原实例已启动 `date +%F\ %T`" >> $restore_log
else
  echo "数据还原实例启动失败,请检查 `date +%F\ %T`" >> $restore_log
fi
echo "" >> $restore_log
echo "" >> $restore_log
end_time=`date +%s`
count_time=$[ $end_time - $start_time ]
echo "本次恢复耗时:$count_time 秒" >> $restore_log

#echo "--------------------STEP 10--------------------" >> $restore_log
#echo "已恢复数据库信息如下:" >> $restore_log
#/usr/local/mysql/bin/mysql -udba -pHzdba666#@888 -S /data/mysql3333/mysql.sock -e "show databases;" >> $restore_log
sleep 3
mail -s "数据库备份文件自动还原 `date +%F`" ops@huize.com lome@huize.com < $restore_log


评论