mysqldump备份容灾脚本(中)

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

增量脚本

mybak-section.sh

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

二.备份策略

周日晚3点进行全量备份 周一到周六每天进行增量备份, 全量保存4周 增量保存近一周的每天数据

crontab -e 添加计划任务

  1. 1 3 * * 6 /bin/bash /root/bin/mybak-all.sh -uroot -p'123456'
  2. 1 2 * * * /bin/bash /root/bin/mybak-section.sh -uroot -p'123456'

0 人点赞