[MySQL-MM] 生产环境自动恢复MM中一台M2库的过程,分享从零开始写的自动化重建脚本以及思路 (转)

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

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

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

[python] view plain copy print?

  1. #!/bin/bash
  2. set -x
  3. set -e
  4. set -u
  5. #(1)准备好目录以及全局变量
  6. BACKUP_FOLDER=/mysqldata/shared/backup2
  7. TEMP_SETUP_FOLDER=/tmp/sharding_setup_1
  8. MYSQL_EXEC=/opt/mysql/product/mysql/bin/mysql
  9. #(2)设置参数,$1是要修复的M2库,$2是正在运行良好的M1库
  10. db1=$2
  11. db2=$1
  12. #(3)在这里设置好一些所必用的环境变量,比如备份用户,备份用户密码,以及复制帐号密码,甚至一些super帐号
  13. BACKUP_USER="backupuser"
  14. BACKUP_PASSWORD="#xx$"
  15. AGENT_PASSWORD=‘#xx$‘
  16. REPLICATION_USER=replication
  17. REPLICATION_PASSWORD=‘#xx$‘
  18. REPLICA_PASSWORD=‘#xx$‘
  19. MONITOR_PASSWORD=‘#xx$‘
  20. WRITER_ETH=‘eth0‘
  21. SUPER_USER=backupuser
  22. SUPER_PASSWORD=‘#xx$‘
  23. #(4)由于磁盘空间所限,建立这些目录,如果目录已经存在,则清空这些目录。
  24. ssh -t $db1 "rm -rf $TEMP_SETUP_FOLDER && mkdir -p $TEMP_SETUP_FOLDER && chmod 777 $TEMP_SETUP_FOLDER"
  25. ssh -t $db2 "rm -rf $TEMP_SETUP_FOLDER && mkdir -p $TEMP_SETUP_FOLDER && chmod 777 $TEMP_SETUP_FOLDER"
  26. #(5)将在线备份脚本 create_hot_backup.sh copy到即将要进行在线备份的M1库上面,并且调用此脚本进行在线备份,此备份用来去另一个M2库上进行恢复。
  27. echo "Taking hotbackup on db1..."
  28. scp create_hot_backup.sh $db1:$TEMP_SETUP_FOLDER/create_hot_backup.sh
  29. ssh -t $db1 "sudo -u mysql mkdir -p $BACKUP_FOLDER"
  30. ssh -t $db1 "sudo -i -u mysql $TEMP_SETUP_FOLDER/create_hot_backup.sh ‘$BACKUP_FOLDER‘ ‘$BACKUP_USER‘ ‘$BACKUP_PASSWORD‘ N Y"
  31. #(6)停止M2的MySQL服务
  32. echo "Hotbackup completed. Now restore the hotbackup on db2..."
  33. ssh -t $db2 "sudo /etc/init.d/mysql stop"
  34. #(7)将restore_hot_backup.sh脚本copy到M2库上,并调用此脚本在M2库上面进行恢复操作。
  35. scp restore_hot_backup.sh $db2:$TEMP_SETUP_FOLDER/restore_hot_backup.sh
  36. ssh -t $db2 "sudo -i -u mysql $TEMP_SETUP_FOLDER/restore_hot_backup.sh ‘$BACKUP_FOLDER‘ ‘$BACKUP_USER‘ ‘$BACKUP_PASSWORD‘ ‘$TEMP_SETUP_FOLDER‘ Y"
  37. #(8)恢复完,启动M2库。
  38. ssh -t $db2 "sudo /etc/init.d/mysql start"
  39. echo "Restore completed. Now rebuild replication between db1 and db2..."
  40. #(9)建立M2上面的复制功能,M1为master,M2为slave;
  41. echo "Setup replication from db1 to db2"
  42. echo "Setup replication from db1 to db2"
  43. scp $db2:$TEMP_SETUP_FOLDER/xtrabackup_binlog_info.master xtrabackup_binlog_info.db1
  44. binlog_filename=`cat xtrabackup_binlog_info.db1 | awk ‘{print $1}‘`
  45. binlog_pos=`cat xtrabackup_binlog_info.db1 | awk ‘{print $2}‘`
  46. $MYSQL_EXEC -h$db2 -ummm_agent -p"$AGENT_PASSWORD" -e "SLAVE STOP;"
  47. $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;"
  48. $MYSQL_EXEC -h$db2 -ummm_agent -p"$AGENT_PASSWORD" -e "SLAVE START;"
  49. #(10)Check M2库的复制功能状态,是否搭建成功
  50. echo "Check db2 replication status."
  51. if ! $MYSQL_EXEC -h$db2 -ummm_agent -p"$AGENT_PASSWORD" -e "SHOW SLAVE STATUS\G" | grep "Slave_SQL_Running: Yes"
  52. then
  53. echo "[ERROR] Cannot start slave on db2!"
  54. exit -1
  55. fi
  56. #(11)建立M1上面的复制功能,M2为master,M1为slave;
  57. echo "Setup replication from db2 to db1"
  58. ./build_replication.sh $db2 $db1
  59. #(12)Check M1库的复制功能状态,是否搭建成功
  60. echo "Check db1 replication status."
  61. if ! $MYSQL_EXEC -h$db1 -ummm_agent -p"$AGENT_PASSWORD" -e "SHOW SLAVE STATUS\G" | grep "Slave_SQL_Running: Yes"
  62. then
  63. echo "[ERROR] Cannot start slave on db1!"
  64. exit -1
  65. fi
  66. #(13)清除临时目录的备份文件,释放磁盘空间
  67. echo "Clean up the shared storage folder and tmp folder."
  68. ssh -t $db1 "rm -rf $TEMP_SETUP_FOLDER"
  69. ssh -t $db2 "rm -rf $TEMP_SETUP_FOLDER"
  70. ssh -t $db1 "sudo -u mysql rm -rf $BACKUP_FOLDER"
  71. echo ‘Rebuild secondary done!‘

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

[python] view plain copy print?

  1. #!/bin/bash
  2. set -x
  3. set -e
  4. # !!! This file need to be run in mysql !!!
  5. #(1)设置一些基本参数,$1:备份文件;$2:备份用户名;$3:备份用户名密码;$4:是否需要安全模式备份; $5:是否需要rsync信息
  6. BACKUP_FOLDER=$1
  7. HOTBACKUP_USER=$2
  8. HOTBACKUP_PASSWORD=$3
  9. NEED_SAFE_SLAVE=$4
  10. NEED_RSYNC=$5
  11. #(2)参数验证,如果需要,则在接下来的备份命令中加上--safe-slave-backup或者--rsync参数
  12. INNOBACKUP_OPT=""
  13. if [[ $NEED_SAFE_SLAVE == "Y" ]]
  14. then
  15. INNOBACKUP_OPT=$INNOBACKUP_OPT" --safe-slave-backup"
  16. fi
  17. if [[ $NEED_RSYNC == "Y" ]]
  18. then
  19. INNOBACKUP_OPT=$INNOBACKUP_OPT" --rsync"
  20. fi
  21. #(3)开始执行备份命令
  22. echo "Run xtrabackup to take hotbackup..."
  23. export MYSQL_HOME=/opt/mysql/product/mysql
  24. innobackupex $INNOBACKUP_OPT --user=$HOTBACKUP_USER --password=$HOTBACKUP_PASSWORD $BACKUP_FOLDER

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

[python] view plain copy print?

  1. #!/bin/bash
  2. set -x
  3. set -e
  4. #(1)$1:备份数据存放的目录;$2:恢复用户;$3:恢复用户密码; $4:临时文件夹目录; $5:是否需要resync;
  5. SHARED_STORAGE_PATH=$1
  6. HOTBACKUP_USER=$2
  7. HOTBACKUP_PASSWORD=$3
  8. TEMP_SETUP_FOLDER=$4
  9. NEED_RSYNC=$5
  10. #(2)是否需要加上resync参数
  11. INNOBACKUP_OPT=""
  12. if [[ $NEED_RSYNC == "Y" ]]
  13. then
  14. INNOBACKUP_OPT="--rsync"
  15. fi
  16. #(3)把MYSQL_HOME放入环境变量中
  17. export MYSQL_HOME=/opt/mysql/product/mysql
  18. #(4)如果目录存在的话,删除这些数据库目录下的旧文件
  19. echo "Delete existing mysql instance..."
  20. rm -rf /mysqldata/data
  21. rm -rf /mysqldata/shared/restore
  22. rm -rf /mysqldata/binlog/*
  23. rm -rf /mysqldata/iblogs/*
  24. #(5)开始准备数据目录以及备份数据目录,如今不存在就新建,并且赋予linux系统帐号mysql的操作权限。
  25. echo "Apply and copy back backup files..."
  26. mkdir -p /mysqldata/data && chown -R mysql:mysql /mysqldata/data && chmod 700 /mysqldata/data
  27. mkdir -p /mysqldata/shared/restore
  28. backup_folder=$(ls -1 $SHARED_STORAGE_PATH | sort -rn | head -n1) #这个ls的找最新生成的文件的命令很实用,可以借鉴。
  29. #
    (6)如果为了安全起见可以备份文件数据目录copy到指定的恢复临时目录,然后在临时目录进行--apply-log以及--copy-back等操
    作,但是我为了效率,就去掉了copy的时间(copy时间大概需要1小时左右),直接在原来的备份数据目录进行--apply-log以及
    --copy-back操作
  30. # cp -r $SHARED_STORAGE_PATH/${backup_folder}/* /mysqldata/shared/restore/
  31. # innobackupex --user=$HOTBACKUP_USER --password=$HOTBACKUP_PASSWORD --ibbackup xtrabackup --apply-log /mysqldata/shared/restore/
  32. # innobackupex --user=$HOTBACKUP_USER --password=$HOTBACKUP_PASSWORD $INNOBACKUP_OPT --copy-back /mysqldata/shared/restore/
  33. innobackupex --user=$HOTBACKUP_USER --password=$HOTBACKUP_PASSWORD --ibbackup xtrabackup --apply-log $SHARED_STORAGE_PATH/${backup_folder}/
  34. innobackupex --user=$HOTBACKUP_USER --password=$HOTBACKUP_PASSWORD $INNOBACKUP_OPT --copy-back $SHARED_STORAGE_PATH/${backup_folder}/
  35. #(7)将原来的备份中的复制点信息copy到临时目录下,并赋予对copy后的文件赋予相应的权限。
  36. cp -f $SHARED_STORAGE_PATH/${backup_folder}/xtrabackup_binlog_info $TEMP_SETUP_FOLDER/xtrabackup_binlog_info.master
  37. chmod 644 $TEMP_SETUP_FOLDER/xtrabackup_binlog_info.master
  38. #(8)恢复成功后,删除原来的临时目录的备份数据,释放磁盘空间,如果你磁盘空间足够,这一步可以省略。
  39. echo "Remove backup files..."
  40. rm -rf $SHARED_STORAGE_PATH/${backup_folder}/

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

[python] view plain copy print?

  1. #!/bin/sh
  2. set -x
  3. set -u
  4. set -e
  5. #(1)$1:master主库服务器主机名或者IP地址; $2:slave主库服务器主机名或者IP地址;
  6. MASTER_SERVER=$1
  7. SLAVE_SERVER=$2
  8. MYSQL_CNF_DIR=‘/opt/mysql/product/mysql/etc‘
  9. MYSQL_EXEC=‘/opt/mysql/product/mysql/bin/mysql‘
  10. #(2)从$1主库上面获取复制点信息
  11. master_file=$(ssh -t $MASTER_SERVER "$MYSQL_EXEC -u$SUPER_USER -p$SUPER_PASSWORD -e ‘SHOW MASTER STATUS\G‘" | grep "File" | awk ‘{print $2}‘)
  12. master_file=$(sed -e ‘s/[\r\n]//‘ <<<"$master_file")
  13. master_pos=$(ssh -t $MASTER_SERVER "$MYSQL_EXEC -u$SUPER_USER -p$SUPER_PASSWORD -e ‘SHOW MASTER STATUS\G‘" | grep "Position" | awk ‘{print $2}‘)
  14. master_pos=$(sed -e ‘s/[\r\n]//‘ <<<"$master_pos")
  15. #(3)执行搭建复制sql命令操作:
  16. ssh -t $SLAVE_SERVER "$MYSQL_EXEC -u$SUPER_USER -p$SUPER_PASSWORD -e \"
  17. STOP SLAVE;
  18. RESET SLAVE;
  19. CHANGE MASTER TO master_host=‘$MASTER_SERVER‘, master_port=3306, master_user=‘$REPLICATION_USER‘,
  20. master_password=‘$REPLICATION_PASSWORD‘, master_log_file=‘$master_file‘, master_log_pos=$master_pos;
  21. START SLAVE;
  22. \""

7  执行操作

在根目录下,执行

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

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

[python] view plain copy print?

    1. [[email protected] xx]# tail -f rebuild.log
    2. + set -e
    3. + BACKUP_FOLDER=/mysqldata/shared/backup
    4. Run xtrabackup to take hotbackup...
    5. + HOTBACKUP_USER=backupuser
    6. + HOTBACKUP_PASSWORD=‘#xxx$‘
    7. + NEED_SAFE_SLAVE=N
    8. + NEED_RSYNC=Y
    9. + INNOBACKUP_OPT=
    10. + [[ N == \Y ]]
    11. + [[ Y == \Y ]]
    12. + INNOBACKUP_OPT=‘ --rsync‘
    13. + echo ‘Run xtrabackup to take hotbackup...‘
    14. + export MYSQL_HOME=/opt/mysql/product/mysql
    15. + MYSQL_HOME=/opt/mysql/product/mysql
    16. + innobackupex --rsync --user=user‘--password=#xxx$‘ /mysqldata/shared/backup
    17. .................................................................................
    18. ................................................................................
    19. Rebuild secondary done!
时间: 2024-11-10 13:55:30

[MySQL-MM] 生产环境自动恢复MM中一台M2库的过程,分享从零开始写的自动化重建脚本以及思路 (转)的相关文章

ansible+jenkins+svn实现生产环境自动发布

ansible+jenkins实战 1.部分机器信息:2.远程执行用户:(ansible机器并没有开通外网哦)3.ansible用到的两个重要角色 /etc/ansible/hosts #hosts文件定义主机与和执行权限 /etc/ansible/roles #roles是任务集合,可在roles下面新建多模块,如tomcat,jdk.yum源,防火墙等,分角色方便管理且灵活 ##Jenkins配置1.新建-自由分格项目项目名称:lbbsSvn配置:(这个svn地址也是内网哦)地址:svn:/

生产环境下实践DDD中的规约模式

最近的开发工作涉及到两个模块“任务”和“日周报”.关系是日周报消费任务,因为用户在写日周报的时候,需要按一定的规则筛选当前用户的任务,作为日周报的一部分提交.整个项目采用类似于Orchard那种平台加插件的架构,“任务”和“日周报”是两个独立的插件. “任务”已经由一位同事事先写好,周报中筛选任务的规则简单描述如下: 截止日期在周一之前,且未完成的任务(超期或待审核): 截止日期在周一至周日之间的所有任务: 开始日期在周一至周日之间的所有任务: 截止日期在周日之后,且未设置开始日期的所有任务(进

一次linux删除文件后又自动生成就是中木马的情况的解决过程

公司的内网某台linux服务器流量莫名其妙的剧增,用iftop查看有连接外网的情况.针对这种情况一般重点查看netstat连接的外网ip和端口. 用lsof -p pid可以查看到具体是那些进程,哪些文件.经查勘发现/root下有相关的配置conf.n hhe两个可疑文件,rm -rf后不到一分钟就自动生成了,由此推断是某个母进程产生的这些文件.所以找到母进程就是找到罪魁祸首. 查杀病毒最好断掉外网访问,还好是内网服务器,可以通过内网访问.断了内网,病毒就失去外联的能力,杀掉它就容易的多.怎么找

网络中两台主机的通信过程(TCP)

两台主机通信有两种情况:1.在同一网段中 2.不在同一网段中 (1.)在同一网段的通信过程 主机在应用层上的操作: TCP/IP协议上tcp的端口对应的各种应用程序,客户机要访问某个应用程序就会要求打开主机的这个固定的端口.而客户机自己会打开一个大于1024的随机端口用来跟对方的主机进行通信.用户使用应用程序编辑信息,一个单一的会话,实际上就是一个主机应用层之间的逻辑的软件连接. 主机在传输层的操作: 对数据分段(Segment),添加TCP报头(包含源端口,目的端口,顺序号等) 分段的原因:

一种简单的生产环境部署Node.js程序方法

最近在部署Node.js程序时,写了段简单的脚本,发觉还挺简单的,忍不住想与大家分享. 配置文件 首先,本地测试环境和生产环境的数据库连接这些配置信息是不一样的,需要将其分开为两个文件存储 到config目录下,比如: 开发环境配置文件config/development.js: module.exports = { port: 3001, mysql: { user: 'root' } }; 生产环境配置文件config/production.js: module.exports = { po

生产环境可用redis4.0.11安装全过程

生产环境可用redis4.0.11安装全过程操作系统版本为 centos6.5 先执行initialization.sh优化脚本 详情见 初始化脚本我们线上用的是redis-4.0.11.tar.gz根据日志内容进行优化 //后面会提现处理,我们这里可以先执行,不明白的同学,可以继续往后看. 优化1: [[email protected] conf]# echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf [[email p

openlayers从开发环境到生产环境

原文出处:http://www.blogjava.net/siriusfx/archive/2013/03/07/327853.html Openlayers项目开发完成后,需要将系统从开发环境转移到生产环境. 开发环境下,Openlayers框架由上百个独立的javascript程序文件组成,通过lib目录中的Openlayers.js动态加载,便于各个功能模块的开发调试.Openlayers是一个非常庞大的Web地图客户端应用框架,提供了很多功能模块,通常在开发过程中不会用到全部模块. 将系

Jenkins测试环境到生产环境的一键部署策略(Windows)

Jenkins测试环境到生产环境的一键部署策略(Windows) 一.前言 前面我们已经初步实现了开发集成环境.测试环境的持续集成(自动化构建.自动化测试.自动化部署).但生产环境自动化部署迟迟没有推进.其原因主要在以下几个方面: 尚未实现部署之前的自动化备份 尚未实现部署出现问题后的自动化回滚 由于之前采用FTP上传部署需要生产环境开放FTP端口存在安全性问题且FTP会因为各种的网速问题,导致站点瞬间挂掉 只要解决以上三个问题,我们就可以初步实现生产环境的自动化部署. 二.实现思路 利用Jen

node - 开发环境与生产环境

什么是开发环境与生产环境 ? 环境,就是指项目运行的地方,当项目处于开发阶段,项目运行在开发人员的电脑上,项目所处的环境就是开发环境.当项目开发完成以后,要将项目放到真实的网站服务器电脑中运行,项目所处的环境就是生产环境. 为什么要区分开发环境与生产环境 ? 因为在不同的环境中,项目的配置是不一样的,需要在项目代码中判断当前项目运行的环境,根据不同的环境应用不同的项目配置. 如何区分开发环境与生产环境 通过电脑操作系统中的系统环境变量区分当前是开发环境还是生产环境. 在系统中设置环境变量: NO