一.备份脚本
环境需求
编辑/etc/my.cnf文件添加在[mysqld]版块下添加如下变量,添加后重启服务
#开启,并且可以将mysql-bin改为其它的日志名log-bin=mysql-bin#添加id号,如果做主从,就不能一样server-id=1#超过200M将生产新的文件,最大和默认值是1GBmax_binlog_size=1G#此参数表示binlog使用最大内存的数,默认1M。max_binlog_cache_size=1M#此参数表示binlog日志保留的时间,默认单位是天。expire_logs_days=7
也可以用如下方式动态更改全局变量,连接mysql服务器后配置,不用重启服务器。
set GLOBAL expire_logs_days=7;
注意:设置之后并不会立即执行,需要如下条件 手动执行flush logs(注意,如果binlog文件过多会引发IO问题,并且flush 也不会同步到从库) 重新启动时(MySQL将会new一个新文件用于记录binlog)
全量脚本
mybak-all.sh,对脚本变量部分进行配置
#!/bin/bash#使用:./xx.sh -uroot -p'123456',使用前修改脚本进行变量配置#过程:备份并刷新binlog,将最新的binlog文件名记录并整体压缩打包#恢复:先进行全量备份,再对根据tim-binlog.txt中的记录,进行逐个恢复#提示:最多每分钟执行一次,否则会覆盖同分钟内的文件,可以修改脚本来改善# 出现问题会退出,可以到指定的日志目录查看日志输出# 同年的tar包超过指定天数的会删除掉#[变量]begin_time=`date %F-%H-%M-%S`my_sql="/usr/local/mysql/bin/mysql"bak_sql="/usr/local/mysql/bin/mysqldump"binlog_dir=/usr/local/mysql/databak_dir=/ops/baklog_dir=/ops/log/mybak-all.log#保存的天数,4周就是28天save_day=28#[自动变量]#当前年月date_nian=`date %Y-`#所有天数的数组save_day_zu=($(for i in`seq 1 ${save_day}`;do date -d -${i}days " %F";done))#开始/usr/bin/echo >> ${log_dir}/usr/bin/echo "time:$(date %F-%H-%M-%S) info:开始全备份">> ${log_dir}#检查${my_sql} $*-e "show databases;"&>/tmp/info_error.txtif[[ $?-ne 0]];then-
/usr/bin/echo "time:$(date %F-%H-%M-%S) info:登陆命令错误">> ${log_dir} -
/usr/bin/cat /tmp/info_error.txt #如果错误则显示错误信息 exit 1fi#移动到目录cd ${bak_dir}bak_time=`date %F-%H-%M`bak_timetwo=`date %F`#备份${bak_sql} $*--all-databases --flush-privileges --single-transaction --flush-logs --triggers --routines --events --hex-blob > mybak-all-${bak_time}.sqlif[[ $?-ne 0]];then-
/usr/bin/echo "time:$(date %F-%H-%M-%S) error:备份失败" -
/usr/bin/echo "time:$(date %F-%H-%M-%S) error:备份失败">> ${log_dir} -
/usr/bin/cat /tmp/bak_error.txt #如果错误则显示错误信息 exit 1elsebin_dian=`tail -n 1 ${binlog_dir}/mysql-bin.index`echo "${bin_dian}"> ${bak_time}-binlog.txtfi#压缩if[[-f mybak-all-${bak_time}.tar.gz ]];then-
/usr/bin/echo "time:$(date %F-%H-%M-%S) info:压缩包mybak-section-${bak_time}.tar.gz 已存在">> ${log_dir} -
/usr/bin/rm -irf mybak-all-${bak_time}.tar.gz ${bak_sql}-binlog.txt fi/usr/bin/tar -cf mybak-all-${bak_time}.tar.gz mybak-all-${bak_time}.sql ${bak_time}-binlog.txtif[[ $?-ne 0]];then-
/usr/bin/echo "time:$(date %F-%H-%M-%S) error:压缩失败">> ${log_dir} exit 1fi#删除sql文件/usr/bin/rm -irf mybak-all-${bak_time}.sql ${bak_time}-binlog.txtif[[ $?-ne 0]];then-
/usr/bin/echo "time:$(date %F-%H-%M-%S) info:删除sql文件失败">> ${log_dir} exit 1fi#整理压缩的日志文件for i in`ls | grep .tar.gz$`-
do echo $i | grep "^mybak-all.*tar.gz$"&>/dev/null-
if[[ $?-eq 0]];then a=`echo ${i%%.tar.gz}`b=`echo ${a:(-16)}`c=`echo ${b%-*}`d=`echo ${c%-*}`-
#看是否在数组中,不在则删除 echo ${save_day_zu[*]}|grep -w $d &>/dev/null-
if[[ $?-ne 0]];then -
[["$d"!="$bak_timetwo"]]&& rm -rf $i fi-
else -
#不是当月的,其他类型压缩包,跳过 -
continue fidone#结束last_time=`date %F-%H-%M-%S`/usr/bin/echo "begin_time:${begin_time} last_time:${last_time}">> ${log_dir}/usr/bin/echo "time:$(date %F-%H-%M-%S) info:全备份完成">> ${log_dir}/usr/bin/echo >> ${log_dir}


