0

0

[MySQL-MM] 生产环境自动恢复MM中一台M2库的过程,分享从零开始_MySQL

php中文网

php中文网

发布时间:2016-06-01 13:28:20

|

1037人浏览过

|

来源于php中文网

原创

bitsCN.com

[mysql-mm] 生产环境自动恢复mm中一台m2库的过程,分享从零开始写的自动化重建脚本以及思路
 

1  简介

有N0+组MM节点,如果每次都是手动修复,一次两次还好,次数多了难免有些无用功了,因为建立自动脚本,避免每次都在M库手动备份,手动copy,手动建立连接,手动设置复制信息的过程,我的目的,一个sh run command,所有的事情都准备妥当了,然后就泡一杯雀巢咖啡或者普洱茶,在一边静静的等待或者还可以借此小憩片刻,看着M2修复成功:

 

2  环境

必须是MM架构,而且一台主库M1是完好无损的,一台主库M2可以根据M1主库来进行重建;如果MS架构,自己可以稍微做一下脚本修改动作,也能使用,架构如下图所示:

 

[MySQL-MM] 生产环境自动恢复MM中一台M2库的过程,分享从零开始_MySQL

 

3  总体思路,建立主脚本a_build_rep.sh

思路分为13个步骤,如a_build_rep.sh脚本中的备注 

#!/bin/bash  

set -x  

set -e  

set -u  

  

Shrink.media
Shrink.media

Shrink.media是当今市场上最快、最直观、最智能的图像文件缩减工具

下载

#(1)准备好目录以及全局变量  

BACKUP_FOLDER=/mysqldata/shared/backup2  

TEMP_SETUP_FOLDER=/tmp/sharding_setup_1  

MYSQL_EXEC=/opt/mysql/product/mysql/bin/mysql  

  

#(2)设置参数,$1是要修复的M2库,$2是正在运行良好的M1库  

db1=$2  

db2=$1  

  

  

#(3)在这里设置好一些所必用的环境变量,比如备份用户,备份用户密码,以及复制帐号密码,甚至一些super帐号  

 BACKUP_USER="backupuser"  

 BACKUP_PASSWORD="#xx$"  

 AGENT_PASSWORD='#xx$'  

 REPLICATION_USER=replication  

 REPLICATION_PASSWORD='#xx$'  

 REPLICA_PASSWORD='#xx$'  

 MONITOR_PASSWORD='#xx$'  

 WRITER_ETH='eth0'  

 SUPER_USER=backupuser  

 SUPER_PASSWORD='#xx$'  

  

#(4)由于磁盘空间所限,建立这些目录,如果目录已经存在,则清空这些目录。  

ssh -t $db1 "rm -rf $TEMP_SETUP_FOLDER && mkdir -p $TEMP_SETUP_FOLDER && chmod 777 $TEMP_SETUP_FOLDER"  

ssh -t $db2 "rm -rf $TEMP_SETUP_FOLDER && mkdir -p $TEMP_SETUP_FOLDER && chmod 777 $TEMP_SETUP_FOLDER"  

  

  

#(5)将在线备份脚本 create_hot_backup.sh copy到即将要进行在线备份的M1库上面,并且调用此脚本进行在线备份,此备份用来去另一个M2库上进行恢复。  

echo "Taking hotbackup on db1..."  

scp create_hot_backup.sh $db1:$TEMP_SETUP_FOLDER/create_hot_backup.sh  

  

  

ssh -t $db1 "sudo -u mysql mkdir -p $BACKUP_FOLDER"  

ssh -t $db1 "sudo -i -u mysql $TEMP_SETUP_FOLDER/create_hot_backup.sh '$BACKUP_FOLDER' '$BACKUP_USER' '$BACKUP_PASSWORD' N Y"  

  

#(6)停止M2的MySQL服务  

echo "Hotbackup completed. Now restore the hotbackup on db2..."  

ssh -t $db2 "sudo /etc/init.d/mysql stop"  

#(7)将restore_hot_backup.sh脚本copy到M2库上,并调用此脚本在M2库上面进行恢复操作。  

scp restore_hot_backup.sh $db2:$TEMP_SETUP_FOLDER/restore_hot_backup.sh  

ssh -t $db2 "sudo -i -u mysql $TEMP_SETUP_FOLDER/restore_hot_backup.sh '$BACKUP_FOLDER' '$BACKUP_USER' '$BACKUP_PASSWORD' '$TEMP_SETUP_FOLDER' Y"  

#(8)恢复完,启动M2库。  

ssh -t $db2 "sudo /etc/init.d/mysql start"  

echo "Restore completed. Now rebuild replication between db1 and db2..."  

#(9)建立M2上面的复制功能,M1为master,M2为slave;  

echo "Setup replication from db1 to db2"  

echo "Setup replication from db1 to db2"  

scp $db2:$TEMP_SETUP_FOLDER/xtrabackup_binlog_info.master xtrabackup_binlog_info.db1  

binlog_filename=`cat xtrabackup_binlog_info.db1 | awk '{print $1}'`  

binlog_pos=`cat xtrabackup_binlog_info.db1 | awk '{print $2}'`  

$MYSQL_EXEC -h$db2 -ummm_agent -p"$AGENT_PASSWORD" -e "SLAVE STOP;"  

$MYSQL_EXEC -h$db2 -ummm_agent -p"$AGENT_PASSWORD" -e "CHANGE MASTER TO MASTER_HOST='$db1', MASTER_PORT=3306, MASTER_USER='replication', MASTER_PASSWORD='$REPLICATION_PASSWORD', MASTER_LOG_FILE='$binlog_filename', MASTER_LOG_POS=$binlog_pos;"  

$MYSQL_EXEC -h$db2 -ummm_agent -p"$AGENT_PASSWORD" -e "SLAVE START;"  

  

#(10)Check M2库的复制功能状态,是否搭建成功  

echo "Check db2 replication status."  

if ! $MYSQL_EXEC -h$db2 -ummm_agent -p"$AGENT_PASSWORD" -e "SHOW SLAVE STATUS/G" | grep "Slave_SQL_Running: Yes"  

then  

    echo "[ERROR] Cannot start slave on db2!"  

    exit -1  

fi  

  

#(11)建立M1上面的复制功能,M2为master,M1为slave;  

echo "Setup replication from db2 to db1"  

./build_replication.sh $db2 $db1  

  

#(12)Check M1库的复制功能状态,是否搭建成功  

echo "Check db1 replication status."  

if ! $MYSQL_EXEC -h$db1 -ummm_agent -p"$AGENT_PASSWORD" -e "SHOW SLAVE STATUS/G" | grep "Slave_SQL_Running: Yes"  

then  

    echo "[ERROR] Cannot start slave on db1!"  

    exit -1  

fi  

  

#(13)清除临时目录的备份文件,释放磁盘空间  

echo "Clean up the shared storage folder and tmp folder."  

ssh -t $db1 "rm -rf $TEMP_SETUP_FOLDER"  

ssh -t $db2 "rm -rf $TEMP_SETUP_FOLDER"  

ssh -t $db1 "sudo -u mysql rm -rf $BACKUP_FOLDER"  

  

  

echo 'Rebuild secondary done!'  

 

 

 

4 分脚本(1),M1库上的在线备份脚本create_hot_backup.sh详情

#!/bin/bash  

set -x  

set -e  

  

# !!! This file need to be run in mysql !!!  

#(1)设置一些基本参数,$1:备份文件;$2:备份用户名;$3:备份用户名密码;$4:是否需要安全模式备份; $5:是否需要rsync信息  

BACKUP_FOLDER=$1  

HOTBACKUP_USER=$2  

HOTBACKUP_PASSWORD=$3  

NEED_SAFE_SLAVE=$4  

NEED_RSYNC=$5  

  

#(2)参数验证,如果需要,则在接下来的备份命令中加上--safe-slave-backup或者--rsync参数  

INNOBACKUP_OPT=""  

if [[ $NEED_SAFE_SLAVE == "Y" ]]  

then  

    INNOBACKUP_OPT=$INNOBACKUP_OPT" --safe-slave-backup"  

fi  

  

if [[ $NEED_RSYNC == "Y" ]]  

then  

    INNOBACKUP_OPT=$INNOBACKUP_OPT" --rsync"  

fi  

  

#(3)开始执行备份命令  

echo "Run xtrabackup to take hotbackup..."  

export MYSQL_HOME=/opt/mysql/product/mysql  

innobackupex $INNOBACKUP_OPT --user=$HOTBACKUP_USER --password=$HOTBACKUP_PASSWORD $BACKUP_FOLDER  

 

 

 

 

5 分脚本(2)restore_hot_backup.sh,在M2库上进行数据恢复操作。

#!/bin/bash  

set -x  

set -e  

  

#(1)$1:备份数据存放的目录;$2:恢复用户;$3:恢复用户密码; $4:临时文件夹目录; $5:是否需要resync;  

  

SHARED_STORAGE_PATH=$1  

HOTBACKUP_USER=$2  

HOTBACKUP_PASSWORD=$3  

TEMP_SETUP_FOLDER=$4  

NEED_RSYNC=$5  

  

#(2)是否需要加上resync参数  

INNOBACKUP_OPT=""  

if [[ $NEED_RSYNC == "Y" ]]  

then  

    INNOBACKUP_OPT="--rsync"  

fi  

  

#(3)把MYSQL_HOME放入环境变量中  

export MYSQL_HOME=/opt/mysql/product/mysql  

  

#(4)如果目录存在的话,删除这些数据库目录下的旧文件  

echo "Delete existing mysql instance..."  

rm -rf /mysqldata/data  

rm -rf /mysqldata/shared/restore  

rm -rf /mysqldata/binlog/*  

rm -rf /mysqldata/iblogs/*  

  

#(5)开始准备数据目录以及备份数据目录,如今不存在就新建,并且赋予linux系统帐号mysql的操作权限。  

echo "Apply and copy back backup files..."  

mkdir -p /mysqldata/data && chown -R mysql:mysql /mysqldata/data && chmod 700 /mysqldata/data  

mkdir -p /mysqldata/shared/restore  

backup_folder=$(ls -1 $SHARED_STORAGE_PATH | sort -rn | head -n1) #这个ls的找最新生成的文件的命令很实用,可以借鉴。  

#(6)如果为了安全起见可以备份文件数据目录copy到指定的恢复临时目录,然后在临时目录进行--apply-log以及--copy-back等操作,但是我为了效率,就去掉了copy的时间(copy时间大概需要1小时左右),直接在原来的备份数据目录进行--apply-log以及--copy-back操作  

  

# cp -r $SHARED_STORAGE_PATH/${backup_folder}/* /mysqldata/shared/restore/  

# innobackupex --user=$HOTBACKUP_USER --password=$HOTBACKUP_PASSWORD --ibbackup xtrabackup --apply-log /mysqldata/shared/restore/  

# innobackupex --user=$HOTBACKUP_USER --password=$HOTBACKUP_PASSWORD $INNOBACKUP_OPT --copy-back /mysqldata/shared/restore/  

  

innobackupex --user=$HOTBACKUP_USER --password=$HOTBACKUP_PASSWORD --ibbackup xtrabackup --apply-log $SHARED_STORAGE_PATH/${backup_folder}/  

innobackupex --user=$HOTBACKUP_USER --password=$HOTBACKUP_PASSWORD $INNOBACKUP_OPT --copy-back $SHARED_STORAGE_PATH/${backup_folder}/  

  

#(7)将原来的备份中的复制点信息copy到临时目录下,并赋予对copy后的文件赋予相应的权限。  

cp -f $SHARED_STORAGE_PATH/${backup_folder}/xtrabackup_binlog_info $TEMP_SETUP_FOLDER/xtrabackup_binlog_info.master  

chmod 644 $TEMP_SETUP_FOLDER/xtrabackup_binlog_info.master  

  

#(8)恢复成功后,删除原来的临时目录的备份数据,释放磁盘空间,如果你磁盘空间足够,这一步可以省略。  

echo "Remove backup files..."  

rm -rf $SHARED_STORAGE_PATH/${backup_folder}/  

 

 

6 搭建M1上面的复制,M2为master,M1为slave,MM架构。

#!/bin/sh  

set -x  

set -u  

set -e  

#(1)$1:master主库服务器主机名或者IP地址; $2:slave主库服务器主机名或者IP地址;  

MASTER_SERVER=$1  

SLAVE_SERVER=$2  

  

MYSQL_CNF_DIR='/opt/mysql/product/mysql/etc'  

MYSQL_EXEC='/opt/mysql/product/mysql/bin/mysql'  

  

#(2)从$1主库上面获取复制点信息  

master_file=$(ssh -t $MASTER_SERVER "$MYSQL_EXEC -u$SUPER_USER -p$SUPER_PASSWORD -e 'SHOW MASTER STATUS/G'" | grep "File" | awk '{print $2}')  

master_file=$(sed -e 's/[/r/n]//'

master_pos=$(ssh -t $MASTER_SERVER "$MYSQL_EXEC -u$SUPER_USER -p$SUPER_PASSWORD -e 'SHOW MASTER STATUS/G'" | grep "Position" | awk '{print $2}')  

master_pos=$(sed -e 's/[/r/n]//'

  

#(3)执行搭建复制sql命令操作:  

ssh -t $SLAVE_SERVER "$MYSQL_EXEC -u$SUPER_USER -p$SUPER_PASSWORD -e /"  

STOP SLAVE;  

RESET SLAVE;  

CHANGE MASTER TO master_host='$MASTER_SERVER', master_port=3306, master_user='$REPLICATION_USER',  

    master_password='$REPLICATION_PASSWORD', master_log_file='$master_file', master_log_pos=$master_pos;  

START SLAVE;  

/""  

 

 

 

7  执行操作

在根目录下,执行 

[root@xx-control xx]# nohup /home/cc/a_build_rep.sh m2.xx.com m1-.xx.com .  >  rebuild.log &,放在后台执行,使用nohup以防止屏幕突然失效。

然后用 tail -f rebuild.log 查看进展:

[root@xx-control xx]# tail -f rebuild.log  

+ set -e  

+ BACKUP_FOLDER=/mysqldata/shared/backup  

Run xtrabackup to take hotbackup...  

+ HOTBACKUP_USER=backupuser  

+ HOTBACKUP_PASSWORD='#xxx$'  

+ NEED_SAFE_SLAVE=N  

+ NEED_RSYNC=Y  

+ INNOBACKUP_OPT=  

+ [[ N == /Y ]]  

+ [[ Y == /Y ]]  

+ INNOBACKUP_OPT=' --rsync'  

+ echo 'Run xtrabackup to take hotbackup...'  

+ export MYSQL_HOME=/opt/mysql/product/mysql  

+ MYSQL_HOME=/opt/mysql/product/mysql  

+ innobackupex --rsync --user=user'--password=#xxx$' /mysqldata/shared/backup  

.................................................................................  

................................................................................  

Rebuild secondary done!  

 

bitsCN.com

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

39

2026.02.06

java多线程方法汇总
java多线程方法汇总

本专题整合了java多线程面试题、实现函数、执行并发相关内容,阅读专题下面的文章了解更多详细内容。

17

2026.02.06

1688阿里巴巴货源平台入口与批发采购指南
1688阿里巴巴货源平台入口与批发采购指南

本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

289

2026.02.06

快手网页版入口与电脑端使用指南 快手官方短视频观看入口
快手网页版入口与电脑端使用指南 快手官方短视频观看入口

本专题汇总了快手网页版的最新入口地址和电脑版使用方法,详细提供快手官网直接访问链接、网页端操作教程,以及如何无需下载安装直接观看短视频的方式,帮助用户轻松浏览和观看快手短视频内容。

150

2026.02.06

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

11

2026.02.06

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

7

2026.02.06

JavaScript 异步编程与事件驱动架构
JavaScript 异步编程与事件驱动架构

本专题深入讲解 JavaScript 异步编程与事件驱动架构,涵盖 Promise、async/await、事件循环机制、回调函数、任务队列与微任务队列、以及如何设计高效的异步应用架构。通过多个实际示例,帮助开发者掌握 如何处理复杂异步操作,并利用事件驱动设计模式构建高效、响应式应用。

11

2026.02.06

java连接字符串方法汇总
java连接字符串方法汇总

本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

47

2026.02.05

java中fail含义
java中fail含义

本专题整合了java中fail的含义、作用相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 7.9万人学习

麻省理工大佬Python课程
麻省理工大佬Python课程

共34课时 | 5.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号