mysqldump备份容灾脚本(上)

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

一.备份脚本

环境需求

编辑/etc/my.cnf文件添加在[mysqld]版块下添加如下变量,添加后重启服务

  1. #开启,并且可以将mysql-bin改为其它的日志名
  2. log-bin=mysql-bin
  3. #添加id号,如果做主从,就不能一样
  4. server-id=1
  5. #超过200M将生产新的文件,最大和默认值是1GB
  6. max_binlog_size=1G
  7. #此参数表示binlog使用最大内存的数,默认1M。
  8. max_binlog_cache_size=1M
  9. #此参数表示binlog日志保留的时间,默认单位是天。
  10. expire_logs_days=7

也可以用如下方式动态更改全局变量,连接mysql服务器后配置,不用重启服务器。 set GLOBAL expire_logs_days=7;

注意:设置之后并不会立即执行,需要如下条件 手动执行flush logs(注意,如果binlog文件过多会引发IO问题,并且flush 也不会同步到从库) 重新启动时(MySQL将会new一个新文件用于记录binlog)

全量脚本

mybak-all.sh,对脚本变量部分进行配置

  1. #!/bin/bash
  2. #使用:./xx.sh -uroot -p'123456',使用前修改脚本进行变量配置
  3. #过程:备份并刷新binlog,将最新的binlog文件名记录并整体压缩打包
  4. #恢复:先进行全量备份,再对根据tim-binlog.txt中的记录,进行逐个恢复
  5. #提示:最多每分钟执行一次,否则会覆盖同分钟内的文件,可以修改脚本来改善
  6. # 出现问题会退出,可以到指定的日志目录查看日志输出
  7. # 同年的tar包超过指定天数的会删除掉
  8. #[变量]
  9. begin_time=`date %F-%H-%M-%S`
  10. my_sql="/usr/local/mysql/bin/mysql"
  11. bak_sql="/usr/local/mysql/bin/mysqldump"
  12. binlog_dir=/usr/local/mysql/data
  13. bak_dir=/ops/bak
  14. log_dir=/ops/log/mybak-all.log
  15. #保存的天数,4周就是28天
  16. save_day=28
  17. #[自动变量]
  18. #当前年月
  19. date_nian=`date %Y-`
  20. #所有天数的数组
  21. save_day_zu=($(for i in `seq 1 ${save_day}`;do date -d -${i}days " %F";done))
  22. #开始
  23. /usr/bin/echo >> ${log_dir}
  24. /usr/bin/echo "time:$(date %F-%H-%M-%S) info:开始全备份" >> ${log_dir}
  25. #检查
  26. ${my_sql} $* -e "show databases;" &> /tmp/info_error.txt
  27. if [[ $? -ne 0 ]];then
  28. /usr/bin/echo "time:$(date %F-%H-%M-%S) info:登陆命令错误" >> ${log_dir}
  29. /usr/bin/cat /tmp/info_error.txt #如果错误则显示错误信息
  30. exit 1
  31. fi
  32. #移动到目录
  33. cd ${bak_dir}
  34. bak_time=`date %F-%H-%M`
  35. bak_timetwo=`date %F`
  36. #备份
  37. ${bak_sql} $* --all-databases --flush-privileges --single-transaction --flush-logs --triggers --routines --events --hex-blob > mybak-all-${bak_time}.sql
  38. if [[ $? -ne 0 ]];then
  39. /usr/bin/echo "time:$(date %F-%H-%M-%S) error:备份失败"
  40. /usr/bin/echo "time:$(date %F-%H-%M-%S) error:备份失败" >> ${log_dir}
  41. /usr/bin/cat /tmp/bak_error.txt #如果错误则显示错误信息
  42. exit 1
  43. else
  44. bin_dian=`tail -n 1 ${binlog_dir}/mysql-bin.index`
  45. echo "${bin_dian}" > ${bak_time}-binlog.txt
  46. fi
  47. #压缩
  48. if [[ -f mybak-all-${bak_time}.tar.gz ]];then
  49. /usr/bin/echo "time:$(date %F-%H-%M-%S) info:压缩包mybak-section-${bak_time}.tar.gz 已存在" >> ${log_dir}
  50. /usr/bin/rm -irf mybak-all-${bak_time}.tar.gz ${bak_sql}-binlog.txt
  51. fi
  52. /usr/bin/tar -cf mybak-all-${bak_time}.tar.gz mybak-all-${bak_time}.sql ${bak_time}-binlog.txt
  53. if [[ $? -ne 0 ]];then
  54. /usr/bin/echo "time:$(date %F-%H-%M-%S) error:压缩失败" >> ${log_dir}
  55. exit 1
  56. fi
  57. #删除sql文件
  58. /usr/bin/rm -irf mybak-all-${bak_time}.sql ${bak_time}-binlog.txt
  59. if [[ $? -ne 0 ]];then
  60. /usr/bin/echo "time:$(date %F-%H-%M-%S) info:删除sql文件失败" >> ${log_dir}
  61. exit 1
  62. fi
  63. #整理压缩的日志文件
  64. for i in `ls | grep .tar.gz$`
  65. do
  66. echo $i | grep "^mybak-all.*tar.gz$" &> /dev/null
  67. if [[ $? -eq 0 ]];then
  68. a=`echo ${i%%.tar.gz}`
  69. b=`echo ${a:(-16)}`
  70. c=`echo ${b%-*}`
  71. d=`echo ${c%-*}`
  72. #看是否在数组中,不在则删除
  73. echo ${save_day_zu[*]} |grep -w $d &> /dev/null
  74. if [[ $? -ne 0 ]];then
  75. [[ "$d" != "$bak_timetwo" ]] && rm -rf $i
  76. fi
  77. else
  78. #不是当月的,其他类型压缩包,跳过
  79. continue
  80. fi
  81. done
  82. #结束
  83. last_time=`date %F-%H-%M-%S`
  84. /usr/bin/echo "begin_time:${begin_time} last_time:${last_time}" >> ${log_dir}
  85. /usr/bin/echo "time:$(date %F-%H-%M-%S) info:全备份完成" >> ${log_dir}
  86. /usr/bin/echo >> ${log_dir}

0 人点赞