[MySQL-MM] 生产环境自动恢复MM中一台M2库的过程,分享从零开始写的自动化重建脚本以及思路 (转)
必须是MM架构,而且一台主库M1是完好无损的,一台主库M2可以根据M1主库来进行重建;如果MS架构,自己可以稍微做一下脚本修改动作,也能使用,架构如下图所示:
3 总体思路,建立主脚本a_build_rep.sh
思路分为13个步骤,如a_build_rep.sh脚本中的备注
- #!/bin/bash
- set -x
- set -e
- set -u
- #(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_file")
- 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]//' <<<"$master_pos")
- #(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!
[MySQL-MM] 生产环境自动恢复MM中一台M2库的过程,分享从零开始写的自动化重建脚本以及思路 (转)的更多相关文章
- mysql在生产环境下有大量锁表,又不允许重启的情况下的处理办法
mysql在生产环境下有大量锁表,又不允许重启的情况下的处理办法 满头大汗的宅鸟该怎么办呢? mysql -u root -e "show processlist"|grep -i ...
- MySql在生产环境中是用mysqldump还是xtrabackup备份和恢复数据
如题,究竟该使用mysqldump还是xtrabackup,要说用,两个都能备份,都支持热备,但是生产环境我们要考虑的是效率,就是不管备份还是恢复,都要快,要稳定. 之前我在维护mysql数据库的时候 ...
- 单例模式在生产环境jedis集群中的应用
背景:不久前单位上线一款应用,上了生产环境之后,没过多久,便吃掉了服务器所有的内存,最后导致网站服务挂了. 在解决了这一问题之后,我发现这其实是典型的一单例模式,现分享一下. 之前存在问题的老代码如下 ...
- 生产环境下实践DDD中的规约模式
最近的开发工作涉及到两个模块“任务”和“日周报”.关系是日周报消费任务,因为用户在写日周报的时候,需要按一定的规则筛选当前用户的任务,作为日周报的一部分提交.整个项目采用类似于Orchard那种平台加 ...
- 网络中两台主机的通信过程(TCP)
两台主机通信有两种情况:1.在同一网段中 2.不在同一网段中 (1.)在同一网段的通信过程 主机在应用层上的操作: TCP/IP协议上tcp的端口对应的各种应用程序,客户机要访问某个应用程序就会要求打 ...
- 利用Xtrabackup备份集合恢复一台从库的过程
1 time tar -xvf Open..tarx.gz real 35m22.502s user 10m16.499s sys 1m28.578s You have new m ...
- shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计
shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计 shell中的数组的用法: shell数组中的下标是从0开始的 array=("Allen" & ...
- 一种简单的生产环境部署Node.js程序方法
最近在部署Node.js程序时,写了段简单的脚本,发觉还挺简单的,忍不住想与大家分享. 配置文件 首先,本地测试环境和生产环境的数据库连接这些配置信息是不一样的,需要将其分开为两个文件存储 到conf ...
- .NET持续集成与自动化部署之路第三篇——测试环境到生产环境的一键部署策略(Windows)
Jenkins测试环境到生产环境的一键部署策略(Windows) 一.前言 前面我们已经初步实现了开发集成环境.测试环境的持续集成(自动化构建.自动化测试.自动化部署).但生产环境自动化部署迟 ...
随机推荐
- android开发之如何将一般应用变身系统级应用【转】
本文转载自:https://blog.csdn.net/zanelove/article/details/43953743 前提: ROOT过的手机 1,把代码编写好后,打包导出apk,copy到手机 ...
- HDU 5183 Negative and Positive (NP) (hashmap+YY)
学到了以邻接表方式建立的hashmap 题意:给你一串数a和一个数k,都有正有负,问知否能找到一对数(i,j)(i<=j)保证a [i] - a [i+1] + a [i+2] - a [i+3 ...
- table-layout 属性
最近被测试提了一个bug,表单的某个字段有1300的字数限制,测试填了1300字,提交后,表格上的呈现丑爆了,那个字段的所在的列撑满了整个表格,其他列被压缩的很小. 后来知道了table-layout ...
- QT 使用QUdpSocket QUdpServer UDP 建立客户端与服务器端
1. 模拟天气监控,每隔两秒从Server发送天气信息到Client. 2. 示例代码 --------------------------- Server 端 ------------------- ...
- QT QDockWidget锚接部件 和 QTreeWidget 树形部件 构成树形选择项
1. 如图,在mainwindow中 添加DockWidget到右侧,里面镶嵌TreeWidget. 2. QTreeWidget *treeWidget = new QTreeWidget; // ...
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) D. Generating Sets 贪心+优先队列
D. Generating Sets time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- codeforces 798C.Mike and gcd problem 解题报告
题目意思:给出一个n个数的序列:a1,a2,...,an (n的范围[2,100000],ax的范围[1,1e9] ) 现在需要对序列a进行若干变换,来构造一个beautiful的序列: b1,b2, ...
- 数据链路层--PPP协议
数据链路层使用的信道主要有两种类型:点对点信道和广播信道. 点对点 路由器在转发分组时只使用了下面的三层. 链路是从一个结点到相邻结点的一段物理线路,中间没有其他交换结点. 必须有一些必要的通信协议来 ...
- Microsoft SQL Server for Linux安装和配置
虽说mssql for linux早已经出来了,但原本没有打算这么早就去尝试的,无奈之下还是得先尝试用了,这里分几篇介绍我在用mssql for linux时遇到的问题,不得不说作为先吃螃蟹的人总是要 ...
- DH03-单一职责原则
模式简介 就一个类而言,应该仅有一个引起它变化的原因.不要存在多于一个导致类变更的原因.遵循单一职责原则.分别建立两个类T1和T2,使T1完成P1功能,T2完成P2功能.当修改T1时,不会使职责P2发 ...