数据无价,谨慎操作,风险自担。
在MySQL日常管理中,需要快速的创建数据库副本进行DBA的工作。因此阅读xtrabackup等参考手册,编写以下脚本,提升了生产力。引以为抛转,如有更好,可分享。
脚本正文:
#!/bin/bash
#xtrabackup流式热备份,恢复,并开启重库复制
#注意此脚本请在空白数据库服务器上执行
#软件平台:centos7.6 mysql5.7.25
#应用工具:xtrabackup2.4.12
#预配置SSH免密码登陆并确认通过
#version 1.0
#by jyx 2019-09-05
#远程IP及账户等基础信息
REMOTE_HOST="xxx"
REMOTE_HOST_SSH_PORT="xxx"
REMOTE_HOST_USERNAME="xxx"
REMOTE_DB_USERNAME="xxx"
REMOTE_DB_PASSWORD="xxx"
REMOTE_DB_PORT="xxx"
#本地IP及账户等基础信息
LOCAL_HOST="xxx"
LOCAL_HOST_SSH_PORT="xxx"
LOCAL_HOST_USERNAME="xxx"
LOCAL_DB_USERNAME="xxx"
LOCAL_DB_PASSWORD="xxx"
LOCAL_DB_PORT="xxx"
#本地DB默认路径
MYSQL_PATH="/var/lib/mysql"
#或指定DB路径
#MYSQL_PATH="/mnt/mysql"
#本地xtrabackup流式备份数据库暂存路径
BACKUP_PATH="/home/xtrabak"
###在远程服务器流式备份表空间,传送本地服务器
#SSH远程服务器
ssh -p${REMOTE_HOST_SSH_PORT} ${REMOTE_HOST} &> /dev/null << eof
#在远程服务器用xtrabackup流式备份,传送本地服务器
innobackupex --user=${REMOTE_DB_USERNAME} --password='${REMOTE_DB_PASSWORD}' --stream=xbstream ./ | ssh -p${LOCAL_HOST_SSH_PORT} ${LOCAL_HOST} "xbstream -x -C ${BACKUP_PATH}"
exit
eof
###在本地服务器准备流式备份文件等
innobackupex --apply-log ${BACKUP_PATH}
chown -R mysql:mysql ${BACKUP_PATH}
###在本地服务器停止MySQL服务
systemctl stop mysqld
###在本地服务器清空MySQL目录
rm -rf ${MYSQL_PATH}/*
###在本地服务器移动备份到mysql的schema目录
mv ${BACKUP_PATH}/${DB_NAME} ${MYSQL_PATH}
###在本地检查并分析导入的数据库
mysql_upgrade -u${LOCAL_DB_USERNAME} -p${LOCAL_DB_PASSWORD} --force
mysqlcheck -u${LOCAL_DB_USERNAME} -p${LOCAL_DB_PASSWORD} -a --auto-repair
###在本地重启数据库
systemctl restart mysqld
###配置从库连接信息等,然后自动加入从库复制
#GTID编号变量
GTID_SN=$(awk '{print $3}' ${BACKUP_PATH}/xtrabackup_binlog_info)
#BINLOG_FILE_NAME文件名变量
BINLOG_FILE_NAME=$(awk '{print $1}' ${BACKUP_PATH}/xtrabackup_binlog_info)
#POS_SN编号变量
POS_SN=$(awk '{print $2}' ${BACKUP_PATH}/xtrabackup_binlog_info)
#在本地登陆数据库
mysql -u${LOCAL_DB_USERNAME} -p${LOCAL_DB_PASSWORD} -e "
#重设所有从库信息
stop slave;
reset master;
reset slave all;
#设置GTID全局变量
set global gtid_purged = '${GTID_SN}';
#授权到主库的复制链接,引用相应参数变量
CHANGE MASTER TO MASTER_HOST='${REMOTE_HOST}',MASTER_PORT=${REMOTE_DB_PORT},MASTER_USER='${REMOTE_DB_USERNAME},MASTER_PASSWORD='${REMOTE_DB_PASSWORD}',master_log_file='${BINLOG_FILE_NAME}',master_log_pos=${POS_SN} FOR CHANNEL 'master:${REMOTE_HOST}';
#启动从库复制
start slave;
#退出数据库登陆
exit "
#清除备份目录以节省空间
#rm -rf ${BACKUP_PATH}
###检查MySQL日志,查看重库复制等
脚本结束