首页 > 数据库 >使用shell脚本xtrabackup自动恢复MySQL数据库

使用shell脚本xtrabackup自动恢复MySQL数据库

时间:2024-01-16 15:01:30浏览次数:34  
标签:-% INFO 12 recovery 17 MySQL shell xtrabackup mysql

【背景说明】

按照安全的一些要求,需要定期对数据库进行恢复演练操作

【环境说明】

MySQL 5.7 的xtrabackup全库xbstream的加密备份(如果不是流备份跟加密,去掉相关参数)

【脚本说明】

v_backupdir="/mysqlbackup/recovery/yiyuan" 备份文件的目录路径
v_dir="/mysqlbackup/recovery/yiyuan"       恢复数据库的数据文件路径
v_recovery_dir="${v_dir}/mysql"            恢复数据库的数据文件路径的子路径为mysql
v_cnf="/etc/my.13309.cnf"                  数据库的配置文件,可以自己修改名称跟端口信息,参数内容可以根据源库的配置修改相关信息,这里只添加常见参数
v_xbfile=`find ${v_backupdir} -name *fullbackup_cloud.xbstream`   匹配备份文件的名称格式,可以根据备份情况定义格式匹配
v_encrypt_key="XXXXXrDFVx6UAsRb88uLVbAVWbK+Yzfs"                  加密备份时候的密文
v_parallel="8"                             数据库恢复时候的并行度,提升恢复速度,根据主机配置调整参数
startup_recover_mysql                      函数部分可以根据实际情况方式修改自己想要启动MySQL

 

vim  auto_recovery_xb.sh 
######################################################################
# This script is mysql xtrabackup recovery
# Author CZT
######################################################################
#!/bin/sh
. ~/.bash_profile
v_backupdir="/mysqlbackup/recovery/yiyuan"
v_dir="/mysqlbackup/recovery/yiyuan"
v_recovery_dir="${v_dir}/mysql"
v_cnf="/etc/my.13309.cnf"
v_date=`date +%Y-%m-%d`
v_xbfile=`find ${v_backupdir} -name *fullbackup_cloud.xbstream`
v_encrypt_key="XXXXXrDFVx6UAsRb88uLVbAVWbK+Yzfs"
v_parallel="8"
v_date_info=`date '+%Y-%m-%d %H:%M:%S' `

echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Auto recovery mysql"
if [ ! -f "$v_xbfile" ]; then
  echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Not found Recovery xbfile. Please check the xbstream files"
  exit 1
else
  echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Recovery xbfile: $v_xbfile"
  echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Encrypt key: $v_encrypt_key"
  echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Recovery directory: $v_recovery_dir"
  echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Mysql config: $v_cnf"
fi

echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Add mysql config: /etc/my.13309.cnf"
cat > /etc/my.13309.cnf << EOF
[mysql]

[client]
port               = 13309
socket             = /tmp/mysql_13309.sock

[mysqld]
user               = mysql
port               = 13309
socket             = /tmp/mysql_13309.sock
datadir            = ${v_recovery_dir}
tmpdir             = ${v_recovery_dir}
pid-file           = ${v_recovery_dir}/mysql_13309.pid
log-error          = ${v_dir}/logs/mysqld.log
server-id          = 13309
character_set_server      = utf8
lower_case_table_names    = 1
sql_mode                  = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
log_timestamps            = SYSTEM

max_binlog_size           = 500M
binlog_format             = row
log_bin                   = ${v_dir}/binlog/mysql-bin
relay-log                 = ${v_dir}/relaylog/mysql-relay
relay_log_info_repository = TABLE
relay-log-recovery        = 0
log_slave_updates         = ON
gtid_mode                 = ON
enforce-gtid-consistency  = ON
skip-slave-start
master_info_repository    = TABLE


EOF
echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Add mysql config completed OK! Please check /etc/my.13309.cnf"

function innobackupex_fullrecovery(){
  echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Clear directory: $v_dir"
# rm -rf ${v_dir}
  echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Create directory: $v_recovery_dir"  
  if [ ! -d ${v_recovery_dir} ];then mkdir -p ${v_recovery_dir} ;fi
  mkdir -p ${v_dir}/logs
  mkdir -p ${v_dir}/binlog
  mkdir -p ${v_dir}/relaylog
  mkdir -p ${v_dir}/masterlog

  ###copy xbstream file
  echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Copy xbstream files"
  xbstream --parallel=${v_parallel} --decrypt=AES256 --encrypt-key=${v_encrypt_key}  --encrypt-threads=4 -x -C ${v_recovery_dir} < ${v_xbfile}
  if [ $? -ne 0 ]
  then
    echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Copy xbstream files failed! Please check directory $v_recovery_dir files"
    exit 1
  else
    echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Copy xbstream files completed OK! Please check directory $v_recovery_dir files"
  fi
  
  ###decompress xb file
  echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Decompress xb files"
  xtrabackup --parallel=${v_parallel} --decompress --remove-original --target-dir=${v_recovery_dir}  2> decompress.log
  v_decompress=`cat decompress.log |awk 'END {print}'|grep 'completed OK!'|wc -l`
  if [ "${v_decompress}" == "1" ];then
    echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Decompress xb files completed OK! Please check decompress.log"
  else
    echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Decompress xb files failed! Please check decompress.log"
    exit 1
  fi

  ###prepare mysql
  echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: prepare mysql"
  xtrabackup --defaults-file=${v_cnf} --parallel=${v_parallel} --prepare  --target-dir=${v_recovery_dir}  2> prepare.log
  v_prepare=`cat prepare.log |awk 'END {print}'|grep 'completed OK!'|wc -l`
  if [ "${v_prepare}" == "1" ];then
    echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: prepare mysql completed OK! Please check prepare.log"
  else
    echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: prepare mysql failed! Please check prepare.log"
    exit 1
  fi
}

function startup_recover_mysql(){
  ###chown mysql
  echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Chown mysql directory on $v_dir"
  touch ${v_dir}/logs/mysqld.log
  chown -R mysql:mysql ${v_dir}

  ###start mysql
  echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Start mysql"
  mysqld_safe --defaults-file=${v_cnf} --user=mysql &
  if [ $? -ne 0 ]
  then
    echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Start mysql failed! Please check ${v_dir}/logs/mysqld.log"
    exit 1
  else
    echo "`date '+%Y-%m-%d %H:%M:%S' ` [INFO]: Start mysql completed OK! Please check ${v_dir}/logs/mysqld.log"
  fi
}

innobackupex_fullrecovery;
startup_recover_mysql;

  

【执行脚本】

直接后台运行执行脚本

nohup sh auto_recovery_xb.sh &

查看恢复日志信息

ls -trl
total 6504
-rwxr-xr-x 1 mysql mysql    5012 Dec 12 17:25 auto_recovery_xb.sh 自动恢复的脚本文件
-rw-r--r-- 1 mysql mysql 6635956 Dec 12 17:26 decompress.log      解压缩日志文件
-rw-r--r-- 1 mysql mysql    6409 Dec 12 17:26 prepare.log         prepare阶段日志文件
-rw------- 1 mysql mysql    1580 Dec 12 17:26 nohup.out           恢复日志的步骤信息
cat nohup.out
2023-12-12 17:25:18 [INFO]: Auto recovery mysql
2023-12-12 17:25:18 [INFO]: Recovery xbfile: /mysqlbackup/recovery/yiyuan/20XXXXX_23-00-01_fullbackup_XXXXX.xbstream
2023-12-12 17:25:18 [INFO]: Encrypt key: XXXXXrDFVx6UAsRb88uLVbAVWbK+Yzfs
2023-12-12 17:25:18 [INFO]: Recovery directory: /mysqlbackup/recovery/yiyuan/mysql
2023-12-12 17:25:18 [INFO]: Mysql config: /etc/my.13309.cnf
2023-12-12 17:25:18 [INFO]: Add mysql config: /etc/my.13309.cnf
2023-12-12 17:25:18 [INFO]: Add mysql config completed OK! Please check /etc/my.13309.cnf
2023-12-12 17:25:18 [INFO]: Clear directory: /mysqlbackup/recovery/yiyuan
2023-12-12 17:25:18 [INFO]: Create directory: /mysqlbackup/recovery/yiyuan/mysql
2023-12-12 17:25:18 [INFO]: Copy xbstream files
2023-12-12 17:25:40 [INFO]: Copy xbstream files completed OK! Please check directory /mysqlbackup/recovery/yiyuan/mysql files
2023-12-12 17:25:40 [INFO]: Decompress xb files
2023-12-12 17:26:28 [INFO]: Decompress xb files completed OK! Please check decompress.log
2023-12-12 17:26:28 [INFO]: prepare mysql
2023-12-12 17:26:48 [INFO]: prepare mysql completed OK! Please check prepare.log
2023-12-12 17:26:48 [INFO]: Chown mysql directory on /mysqlbackup/recovery/yiyuan
2023-12-12 17:26:48 [INFO]: Start mysql
2023-12-12 17:26:48 [INFO]: Start mysql completed OK! Please check /mysqlbackup/recovery/yiyuan/logs/mysqld.log
2023-12-12T09:26:49.442971Z mysqld_safe Logging to '/mysqlbackup/recovery/yiyuan/logs/mysqld.log'.
2023-12-12T09:26:49.475630Z mysqld_safe Starting mysqld daemon with databases from /mysqlbackup/recovery/yiyuan/mysql

 

标签:-%,INFO,12,recovery,17,MySQL,shell,xtrabackup,mysql
From: https://www.cnblogs.com/zetanchen/p/17967665

相关文章

  • docker mysql镜像
    https://hub.docker.com/_/mysql/dockerrun--namemysql\-eMYSQL_ROOT_PASSWORD=123456\--restart=always\-d\-p3306:3306\-eTZ=Asia/Shanghai\-eCHARACTER_SET_SERVER=utf8mb4\-eCOLLATION_SERVER=utf8mb4_unicode_ci\......
  • 【JMeter】jmeter 操作 mysql 数据库
    一、下载驱动包二、JDBC连接配置三、JDBCRequest1、单条查询语句2、多条查询语句3、增删改语句4、参数化sql语句5、占位符语句 本文内容基于如下测试环境:JMeter4.0版本Win7系统mysql-connector-java-5.1.7-bin.jar不同环境下可能会有不一致的地方。......
  • shell脚本检测mysql服务状态
    shell脚本检测mysql状态:通过多种方案实现方法一:netstat命令 方法二:ss命令 方法三:使用lsof监控端口 执行结果: ......
  • jmeter jdbc操作myql数据库及mysql驱动下载
     mysql驱动下载https://dev.mysql.com/downloads/connector/j/   1、先安装mysql的驱动mysql-connector-java-5.1.7-bin.jar配置jdbc的connectionconfigurationDatabaseUrl:jdbc:mysql://xxx.xxx.xxx.xxx:3306/test?allowMultiQueries=true&serverTimezone=UTC&c......
  • Go+Gin+GOrm+MySql实现基础的增删改查
    一、概述本节使用Gin+GOrm+MySql实现基础的增删改查。主要是做一下记录防止后面忘记了可以翻看博客查看主要有两个.go文件1.main.go用于注册gin路由及初始化gorm操作数据库2.Result.go用于封装服务端返回给客户端的响应体二、代码示例1.main.go//go_......
  • 一文让你对mysql索引底层实现明明白白
    开篇:图片是本人随笔画的,有点粗糙,望大家谅解,如有不妥之处,请联系我们,感谢一、索引到底是什么.索引是帮助mysql高效获取数据的排好序的数据结构.索引是存储在文件里的.数据结构:二叉树HASHBTREE   如果没有索引的话,循环一条一条的找,找一次就是一次IO,这样速度就会很慢......
  • 一文让你对mysql索引底层实现明明白白
    开篇:图片是本人随笔画的,有点粗糙,望大家谅解,如有不妥之处,请联系我们,感谢。一、索引到底底是什么.索引是帮助mysql高效获取数据的排好序的数据结构.索引是存储在文件里的.数据结构:二叉树HASHBTREE如果没有索引的话,循环一条一条的找,找一次就是一次IO,这样速度就会很慢我们知道数据库......
  • (2)Powershell开发工具
    (2)Powershell开发工具在上一节对Powershell进行了简单介绍,详细内容参考Powershell简介,这一节介绍Powershell的开发工具及其设置注意事项。本文包含以下知识点如何启动WindowsPowershell命令行开发工具WindowsPowershell命令行的简单设置如何启动WindowsPowershel......
  • (1)Powershell简介
    (1)Powershell简介本文会包含以下三个知识点什么是Powershell?学习Powershell有什么好处?学习Powershell需要哪些条件?什么是Powershell?Powershell(WindowsPowershell)是Microsoft为Windows设计的新的命令行程序,这个Windows内置的命令行shell包括交互式提示和脚本环......
  • mysql 中 utf8、utf16、utf32、utf8mb3、utf8mb4的区别
    UTF-8-“大小优化”:最适合基于拉丁字符的数据(或ASCII),每个字符只需1个字节,但大小相应增加符号种类(在最坏的情况下,每个字符最多可增加6个字节)UTF-16-“平衡”:每个字符至少需要2个字节,足以支持现有的主流语言集,并且具有固定的大小以便于字符处理(但是大小仍然可变,每个字符最多......