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

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




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

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

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



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

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




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

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


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

    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.   
    9. MYSQL_CNF_DIR='/opt/mysql/product/mysql/etc'  
    10. MYSQL_EXEC='/opt/mysql/product/mysql/bin/mysql'  
    11.   
    12. #(2)从$1主库上面获取复制点信息  
    13. master_file=$(ssh -t $MASTER_SERVER "$MYSQL_EXEC -u$SUPER_USER -p$SUPER_PASSWORD -e 'SHOW MASTER STATUSG'" | grep "File" | awk '{print $2}')  
    14. master_file=$(sed -e 's/[ ]//' <<<"$master_file")  
    15. master_pos=$(ssh -t $MASTER_SERVER "$MYSQL_EXEC -u$SUPER_USER -p$SUPER_PASSWORD -e 'SHOW MASTER STATUSG'" | grep "Position" | awk '{print $2}')  
    16. master_pos=$(sed -e 's/[ ]//' <<<"$master_pos")  
    17.   
    18. #(3)执行搭建复制sql命令操作:  
    19. ssh -t $SLAVE_SERVER "$MYSQL_EXEC -u$SUPER_USER -p$SUPER_PASSWORD -e "  
    20. STOP SLAVE;  
    21. RESET SLAVE;  
    22. CHANGE MASTER TO master_host='$MASTER_SERVER', master_port=3306, master_user='$REPLICATION_USER',  
    23.     master_password='$REPLICATION_PASSWORD', master_log_file='$master_file', master_log_pos=$master_pos;  
    24. START SLAVE;  
    25. ""  




    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 查看进展:

      1. [root@xx-control 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! 
  • 相关阅读:
    【状压】孤岛营救问题
    【网络流】魔术球问题
    【状压】软件补丁问题
    [网络流]最大流
    [网络流]小M的作物
    简单版AC自动机
    KMP
    sql 检索字符串
    Mysql触发器 :当一个表发生插入或更新时,将数据同步到另一张表中
    sql server触发器 :当一个表发生插入或更新时,将数据同步到另一张表中
  • 原文地址:https://www.cnblogs.com/moss_tan_jun/p/5752489.html
Copyright © 2011-2022 走看看