xtrabackup每周增量备份MySQL-5.7的脚本
脚本内容:每周第一天全量备份,剩下六天增量备份,每周日进行归档压缩,并删除三周前的归档压缩包
脚本如下:
#!/bin/sh
## 定义连接变量
# mysql配置文件路径
file_conf=/home/database/mysql-5.7/conf
# mysql数据文件夹路径
datadir=/home/database/mysql-5.7/data
# mysql连接地址
host=172.30.0.1
# mysql端口
port=3306
# mysql备份账号名称
username=root
# mysql备份账号密码
password=abc1234
# 用于连接mysql的socket文件
socket=/home/database/mysql-5.7/data/mysql.sock
## 定义备份信息
time=`date +"%Y-%m-%d"` # 今天
today=`date +%w` # 今天周几
time_old=$( date +"%Y-%m-%d" -d "-24hour" ) # 昨天
BEGINTIME=`date +"%Y-%m-%d %H:%M:%S"` # 脚本开始时间
backdir=/home/mysql_backup # 备份总目录
new_backdir=/home/mysql_backup/$time # 今日备份目录文件
redo_backdir=/home/mysql_redofile # 留存目录, 保留的格式为 .tar.gz格式
mysql_info=/home/mysql_info # 日志保留文件夹
format_time=`date +"%Y-%m-%d_%H:%M"` # 日志输出时间, 精确到分
log_output=${mysql_info}/xtrabackup_log_$format_time # 备份输出日志
time_cost=${mysql_info}/xtrabackup_timecost.log # 记录花费时间日志
backupbin=/usr/bin # bin目录位置
# 假如不存在备份总目录 backdir 则创建
if [ ! -d ${backdir} ];
then
mkdir -p ${backdir}
fi
# 假如不存在留存目录 redo_backdir 则创建
if [ ! -d ${redo_backdir} ];
then
mkdir -p ${redo_backdir}
fi
# 假如不存在日志文件 xtrabackup_timecost.log 则创建
if [ ! -f "${time_cost}" ];
then
mkdir -p $mysql_info
touch ${time_cost}
fi
# 获取备份总目录文件数量
number=`ls -A ${backdir} | wc -l`
# 开始逻辑判断全量和增量备份
# 假如备份总目录为空, 即没有任何文件, 则全量备份
if [ $number -eq 0 ];then
echo "#####开始今日全量备份 at $BEGINTIME " >>$time_cost
${backupbin}/innobackupex --defaults-file=${file_conf} \
--datadir=${datadir} \
--host=${host} \
--port=${port} \
--user=${username} \
--password=${password} \
--socket=${socket} \
--no-timestamp \
"${new_backdir}"_full_"${number}" 1> $log_output 2>&1
# 假如备份总目录有文件, 则以备份总目录中最新的文件作为基础, 开始增量备份
elif [ $number -ne 0 ];then
echo "#####开始今日增量备份 at $BEGINTIME " >>$time_cost
# 获取最新的文件名
thelast_backfile=`ls -t ${backdir} | head -n 1 | awk '{print $0}'`
${backupbin}/innobackupex --defaults-file=${file_conf} \
--datadir=${datadir} \
--host=${host} \
--port=${port} \
--user=${username} \
--password=${password} \
--socket=${socket} \
--no-timestamp \
--incremental-basedir=${backdir}/${thelast_backfile} \
--incremental \
"${new_backdir}"_incr_"${number}" 1> $log_output 2>&1
fi
# 输出时间变量
b=`ls -t ${backdir} | head -n 1 | awk '{print $0}'`
ENDTIME=`date +"%Y-%m-%d %H:%M:%S"` # 备份结束时间
begin_data=`date -d "$BEGINTIME" +%s`
end_data=`date -d "$ENDTIME" +%s`
spendtime=`expr $end_data - $begin_data` # 计算花费时间
echo "耗时 $spendtime sec 用于创建备份文件 $b" >>$time_cost
# 假如今天是星期天, 则归档打包备份目录所有的文件
if [ "`date +%w`" == "0" ];then
# 将备份目录backdir下的所有文件, 打包压缩移动到留存目录redo_backdir中, 然后删除备份目录backdir目录下的所有文件
# 归档打包这周的全量和增量文件为一个压缩包
cd ${backdir}
tar -czvf redofile_${time}.tar.gz ./* >/dev/null 2>&1
mv redofile_${time}.tar.gz ${redo_backdir}
# 删除已归档的文件夹
rm -rf ${backdir}/*
fi
# 删除归档目录中第四个, 即21天前的也就是最旧的压缩包, 只保留3个, 也就是3周的压缩包, +mtime +20 为找到20天前的文件"
del_redofile=`find ${redo_backdir} -mtime +20 -name "redofile_*"`
if [ -n "${del_redofile}" ];then
echo "#####删除3周前的归档文件${del_redofile}">>$time_cost
rm -rf ${del_redofile}
fi
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!