xtra+binlog增量备份脚本(中)

2021-06-10 11:21:46 浏览数 (1)

三.添加脚本

全量备份

创建备份目录 mkdir -p /root/bin mkdir -p /bak/mysql-xback

编写脚本,要指定备份命令的账号和密码 vim /root/bin/mybak-all.sh

  1. #!/bin/bash
  2. #全量备份,只备份一次
  3. #指定备份目录
  4. backup_dir="/bak/mysql-xback"
  5. #检查
  6. [[ -d ${backup_dir} ]] || mkdir -p ${backup_dir}
  7. if [[ -d ${backup_dir}/all-backup ]];then
  8. echo "全备份已存在"
  9. exit 1
  10. fi
  11. #命令,需要设置
  12. innobackupex --defaults-file=/etc/my.cnf --user=back --password='123456' --no-timestamp ${backup_dir}/all-backup &> /tmp/mysql-backup.log
  13. tail -n 1 /tmp/mysql-backup.log | grep 'completed OK!'
  14. if [[ $? -eq 0 ]];then
  15. echo "all-backup" > /tmp/mysql-backup.txt
  16. else
  17. echo "备份失败"
  18. exit 1
  19. fi

增量备份

编写脚本,要指定备份目录 vim /root/bin/mybak-section.sh

  1. #!/bin/bash
  2. #增量备份
  3. #备份目录
  4. backup_dir="/bak/mysql-xback"
  5. #新旧备份
  6. old_dir=`cat /tmp/mysql-backup.txt`
  7. new_dir=`date %F-%H-%M-%S`
  8. #检查
  9. if [[ ! -d ${backup_dir}/all-backup ]];then
  10. echo "还未全量备份"
  11. exit 1
  12. fi
  13. #命令
  14. /usr/bin/innobackupex --user=back --password='123456' --no-timestamp --incremental --incremental-basedir=${backup_dir}/${old_dir} ${backup_dir}/${new_dir} &> /tmp/mysql-backup.log
  15. tail -n 1 /tmp/mysql-backup.log | grep 'completed OK!'
  16. if [[ $? -eq 0 ]];then
  17. echo "${new_dir}" > /tmp/mysql-backup.txt
  18. else
  19. echo "备份失败"
  20. exit 1
  21. fi

binlog

创建备份目录 mkdir -p /bak/mysql-binback

用于单点,备份binlog,要指定备份目录位置和其它变量 vim /root/bin/mybak-binlog.sh

  1. #!/bin/bash
  2. #
  3. # 注意:执行脚本前修改脚本中的变量
  4. # 功能:cp方式增量备份
  5. #
  6. # 适用:centos6
  7. # 语言:中文
  8. #
  9. #使用:./xx.sh -uroot -p'123456',将第一次增量备份后的binlog文件名写到/tmp/binlog-section中,若都没有,自动填写mysql-bin.000001
  10. #过程:增量先刷新binlog日志,再查询/tmp/binlog-section中记录的上一次备份中最新的binlog日志的值
  11. # cp中间的binlog日志,并进行压缩。再将备份中最新的binlog日志写入。
  12. #恢复:先进行全量恢复,再根据全量备份附带的time-binlog.txt中的记录逐个恢复。当前最新的Binlog日志要去掉有问题的语句,例如drop等。
  13. #[变量]
  14. #mysql这个命令所在绝对路径
  15. my_sql="/usr/local/mysql/bin/mysql"
  16. #mysqldump命令所在绝对路径
  17. bak_sql="/usr/local/mysql/bin/mysqldump"
  18. #binlog日志所在目录
  19. binlog_dir=/usr/local/mysql/data
  20. #mysql-bin.index文件所在位置
  21. binlog_index=${binlog_dir}/mysql-bin.index
  22. #备份到哪个目录
  23. bak_dir=/bak/mysql-binback
  24. #这个脚本的日志输出到哪个文件
  25. log_dir=/tmp/mybak-binlog.log
  26. #保存的天数,4周就是28天
  27. save_day=10
  28. #[自动变量]
  29. #当前年
  30. date_nian=`date %Y-`
  31. begin_time=`date %F-%H-%M-%S`
  32. #所有天数的数组
  33. save_day_zu=($(for i in `seq 1 ${save_day}`;do date -d -${i}days " %F";done))
  34. #开始
  35. /usr/bin/echo >> ${log_dir}
  36. /usr/bin/echo "time:$(date %F-%H-%M-%S) info:开始增量备份" >> ${log_dir}
  37. #检查
  38. ${my_sql} $* -e "show databases;" &> /tmp/info_error.txt
  39. if [[ $? -ne 0 ]];then
  40. /usr/bin/echo "time:$(date %F-%H-%M-%S) info:登陆命令错误" >> ${log_dir}
  41. /usr/bin/cat /tmp/info_error.txt #如果错误则显示错误信息
  42. exit 1
  43. fi
  44. #移动到目录
  45. cd ${bak_dir}
  46. bak_time=`date %F-%H-%M`
  47. bak_timetwo=`date %F`
  48. #刷新
  49. ${my_sql} $* -e "flush logs"
  50. if [[ $? -ne 0 ]];then
  51. /usr/bin/echo "time:$(date %F-%H-%M-%S) error:刷新binlog失败" >> ${log_dir}
  52. exit 1
  53. fi
  54. #获取开头和结尾binlog名字
  55. last_bin=`cat /tmp/binlog-section`
  56. next_bin=`tail -n 1 ${binlog_dir}/mysql-bin.index`
  57. echo ${last_bin} |grep 'mysql-bin' &> /dev/null
  58. if [[ $? -ne 0 ]];then
  59. echo "mysql-bin.000001" > /tmp/binlog-section #不存在则默认第一个
  60. last_bin=`cat /tmp/binlog-section`
  61. fi
  62. #截取需要备份的binlog行数
  63. a=`/usr/bin/sort ${binlog_dir}/mysql-bin.index | uniq | grep -n ${last_bin} | awk -F':' '{print $1}'`
  64. b=`/usr/bin/sort ${binlog_dir}/mysql-bin.index | uniq | grep -n ${next_bin} | awk -F':' '{print $1}'`
  65. let b--
  66. #输出最新节点
  67. /usr/bin/echo "${next_bin}" > /tmp/binlog-section
  68. #创建文件
  69. rm -rf mybak-section-${bak_time}
  70. /usr/bin/mkdir mybak-section-${bak_time}
  71. for i in `sed -n "${a},${b}p" ${binlog_dir}/mysql-bin.index | awk -F'./' '{print $2}'`
  72. do
  73. if [[ ! -f ${binlog_dir}/${i} ]];then
  74. /usr/bin/echo "time:$(date %F-%H-%M-%S) error:binlog文件${i} 不存在" >> ${log_dir}
  75. exit 1
  76. fi
  77. cp -rf ${binlog_dir}/${i} mybak-section-${bak_time}/
  78. if [[ ! -f mybak-section-${bak_time}/${i} ]];then
  79. /usr/bin/echo "time:$(date %F-%H-%M-%S) error:binlog文件${i} 备份失败" >> ${log_dir}
  80. exit 1
  81. fi
  82. done
  83. #压缩
  84. if [[ -f mybak-section-${bak_time}.tar.gz ]];then
  85. /usr/bin/echo "time:$(date %F-%H-%M-%S) info:压缩包mybak-section-${bak_time}.tar.gz 已存在" >> ${log_dir}
  86. /usr/bin/rm -irf mybak-section-${bak_time}.tar.gz
  87. fi
  88. /usr/bin/tar -cf mybak-section-${bak_time}.tar.gz mybak-section-${bak_time}
  89. if [[ $? -ne 0 ]];then
  90. /usr/bin/echo "time:$(date %F-%H-%M-%S) error:压缩失败" >> ${log_dir}
  91. exit 1
  92. fi
  93. #删除binlog文件夹
  94. /usr/bin/rm -irf mybak-section-${bak_time}
  95. if [[ $? -ne 0 ]];then
  96. /usr/bin/echo "time:$(date %F-%H-%M-%S) info:删除sql文件失败" >> ${log_dir}
  97. exit 1
  98. fi
  99. #整理压缩的日志文件
  100. for i in `ls | grep "^mybak-section.*tar.gz$"`
  101. do
  102. echo $i | grep ${date_nian} &> /dev/null
  103. if [[ $? -eq 0 ]];then
  104. a=`echo ${i%%.tar.gz}`
  105. b=`echo ${a:(-16)}` #当前日志年月日
  106. c=`echo ${b%-*}`
  107. d=`echo ${c%-*}`
  108. #看是否在数组中,不在其中,并且不是当前时间,则删除。
  109. echo ${save_day_zu[*]} |grep -w $d &> /dev/null
  110. if [[ $? -ne 0 ]];then
  111. [[ "$d" != "$bak_timetwo" ]] && rm -rf $i
  112. fi
  113. else
  114. #不是当月的,其他类型压缩包,跳过
  115. continue
  116. fi
  117. done
  118. #结束
  119. last_time=`date %F-%H-%M-%S`
  120. /usr/bin/echo "begin_time:${begin_time} last_time:${last_time}" >> ${log_dir}
  121. /usr/bin/echo "time:$(date %F-%H-%M-%S) info:增量备份完成" >> ${log_dir}
  122. /usr/bin/echo >> ${log_dir}

用于主从,备份relay-bin,要指定备份目录位置和其它变量

vim /root/bin/mybak-binlog.sh

  1. #!/bin/bash
  2. #
  3. # 注意:执行脚本前修改脚本中的变量
  4. # 功能:cp方式增量备份
  5. #
  6. # 适用:centos6
  7. # 语言:中文
  8. #
  9. #使用:./xx.sh -uroot -p'123456'
  10. #[变量]
  11. #mysql这个命令所在绝对路径
  12. my_sql="/usr/local/mysql/bin/mysql"
  13. #mysqldump命令所在绝对路径
  14. bak_sql="/usr/local/mysql/bin/mysqldump"
  15. #binlog日志所在目录
  16. binlog_dir=/usr/local/mysql/data
  17. #mysql-bin.index文件所在位置
  18. binlog_index=${binlog_dir}/mysql-bin.index
  19. #备份到哪个目录
  20. bak_dir=/bak/mysql-binback
  21. #这个脚本的日志输出到哪个文件
  22. log_dir=/tmp/mybak-binlog.log
  23. #保存的天数,4周就是28天
  24. save_day=10
  25. #[自动变量]
  26. #当前年
  27. date_nian=`date %Y-`
  28. begin_time=`date %F-%H-%M-%S`
  29. #所有天数的数组
  30. save_day_zu=($(for i in `seq 1 ${save_day}`;do date -d -${i}days " %F";done))
  31. #开始
  32. /usr/bin/echo >> ${log_dir}
  33. /usr/bin/echo "time:$(date %F-%H-%M-%S) info:开始增量备份" >> ${log_dir}
  34. #检查
  35. ${my_sql} $* -e "show databases;" &> /tmp/info_error.txt
  36. if [[ $? -ne 0 ]];then
  37. /usr/bin/echo "time:$(date %F-%H-%M-%S) info:登陆命令错误" >> ${log_dir}
  38. /usr/bin/cat /tmp/info_error.txt #如果错误则显示错误信息
  39. exit 1
  40. fi
  41. #移动到目录
  42. cd ${bak_dir}
  43. bak_time=`date %F-%H-%M`
  44. bak_timetwo=`date %F`
  45. #创建文件
  46. rm -rf mybak-section-${bak_time}
  47. /usr/bin/mkdir mybak-section-${bak_time}
  48. for i in `ls ${binlog_dir}| grep relay-bin`
  49. do
  50. cp -rf ${binlog_dir}/${i} mybak-section-${bak_time}/
  51. if [[ ! -f mybak-section-${bak_time}/${i} ]];then
  52. /usr/bin/echo "time:$(date %F-%H-%M-%S) error:binlog文件${i} 备份失败" >> ${log_dir}
  53. exit 1
  54. fi
  55. done
  56. #压缩
  57. if [[ -f mybak-section-${bak_time}.tar.gz ]];then
  58. /usr/bin/echo "time:$(date %F-%H-%M-%S) info:压缩包mybak-section-${bak_time}.tar.gz 已存在" >> ${log_dir}
  59. /usr/bin/rm -irf mybak-section-${bak_time}.tar.gz
  60. fi
  61. /usr/bin/tar -cf mybak-section-${bak_time}.tar.gz mybak-section-${bak_time}
  62. if [[ $? -ne 0 ]];then
  63. /usr/bin/echo "time:$(date %F-%H-%M-%S) error:压缩失败" >> ${log_dir}
  64. exit 1
  65. fi
  66. #删除binlog文件夹
  67. /usr/bin/rm -irf mybak-section-${bak_time}
  68. if [[ $? -ne 0 ]];then
  69. /usr/bin/echo "time:$(date %F-%H-%M-%S) info:删除sql文件失败" >> ${log_dir}
  70. exit 1
  71. fi
  72. #整理压缩的日志文件
  73. for i in `ls | grep "^mybak-section.*tar.gz$"`
  74. do
  75. echo $i | grep ${date_nian} &> /dev/null
  76. if [[ $? -eq 0 ]];then
  77. a=`echo ${i%%.tar.gz}`
  78. b=`echo ${a:(-16)}` #当前日志年月日
  79. c=`echo ${b%-*}`
  80. d=`echo ${c%-*}`
  81. #看是否在数组中,不在其中,并且不是当前时间,则删除。
  82. echo ${save_day_zu[*]} |grep -w $d &> /dev/null
  83. if [[ $? -ne 0 ]];then
  84. [[ "$d" != "$bak_timetwo" ]] && rm -rf $i
  85. fi
  86. else
  87. #不是当月的,其他类型压缩包,跳过
  88. continue
  89. fi
  90. done
  91. #结束
  92. last_time=`date %F-%H-%M-%S`
  93. /usr/bin/echo "begin_time:${begin_time} last_time:${last_time}" >> ${log_dir}
  94. /usr/bin/echo "time:$(date %F-%H-%M-%S) info:增量备份完成" >> ${log_dir}
  95. /usr/bin/echo >> ${log_dir}

重写备份

创建备份目录 mkdir -p /bak/xback

编写脚本,要指定备份目录位置 vim /root/bin/mybak-rewrite.sh

  1. #!/bin/bash
  2. #xbak备份脚本
  3. #每周六执行一次
  4. #10 4 * * 6 /bin/bash /root/bin/mybak-rewrite.sh
  5. #清理并备份
  6. [[ -d /bak/xback ]] || mkdir -p /bak/xback
  7. cd /bak/xback
  8. rm -rf *.tar.gz
  9. [[ -d bak/mysql-xback ]] || echo "bak-dir not found"
  10. cd /bak/mysql-xback
  11. tar -cf XtraBackup.tar.gz *
  12. mv XtraBackup.tar.gz /bak/xback
  13. rm -rf /bak/mysql-xback/*
  14. #全备份一次
  15. bash /root/bin/mybak-all.sh

备份周期

添加权限 chmod x /root/bin/*

先进行一次innobackupex全量备份,后面的增量均在全量的基础上备份。 bash /root/bin/mybak-all.sh

每天2点进行一次innobackupex增量备份 binlog日志备份 每周4点将之前的innobackupex备份打包,并启动新的全量备份 crontab -e

代码语言:javascript复制
30 2 * * * /bin/bash /root/bin/mybak-binlog.sh -uback -p'123456'
40 2 * * * /bin/bash /root/bin/mybak-section.sh10 
4 * * 6 /bin/bash /root/bin/mybak-rewrite.sh

0 人点赞