一.备份脚本
环境需求
编辑/etc/my.cnf文件添加在[mysqld]版块下添加如下变量,添加后重启服务
#开启,并且可以将mysql-bin改为其它的日志名
log-bin=mysql-bin
#添加id号,如果做主从,就不能一样
server-id=1
#超过200M将生产新的文件,最大和默认值是1GB
max_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/data
bak_dir=/ops/bak
log_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.txt
if
[[ $?
-ne 0
]];then
-
/usr/bin/echo "time:$(date %F-%H-%M-%S) info:登陆命令错误"
>> ${log_dir}
-
/usr/bin/cat /tmp/info_error.txt #如果错误则显示错误信息
exit 1
fi
#移动到目录
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}.sql
if
[[ $?
-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 1
else
bin_dian=`tail -n 1 ${binlog_dir}/mysql-bin.index`
echo "${bin_dian}"
> ${bak_time}-binlog.txt
fi
#压缩
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.txt
if
[[ $?
-ne 0
]];then
-
/usr/bin/echo "time:$(date %F-%H-%M-%S) error:压缩失败"
>> ${log_dir}
exit 1
fi
#删除sql文件
/usr/bin/rm -irf mybak-all-${bak_time}.sql ${bak_time}-binlog.txt
if
[[ $?
-ne 0
]];then
-
/usr/bin/echo "time:$(date %F-%H-%M-%S) info:删除sql文件失败"
>> ${log_dir}
exit 1
fi
#整理压缩的日志文件
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
fi
done
#结束
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}