MySQL全量备份/增量备份脚本

#!/bin/bash

mysql物理备份脚本

每周日进行全量备份,周一到周六进行增量备份,7天为一个周期

备份路径、日志路径

1
2
3
4
5
6
backup_dir="/backup"
log_dir="/backup/log"
full_backup_dir="/backup/full"
inc_backup_dir="/backup/inc"

log_date=$(date "+%F-%T")

数据库用户、密码

1
2
MY_USER=root
MY_PASS=P@ssword1

判断日志、备份路径是否存在

1
2
3
4
[ -d $backup_dir ] || mkdir $backup_dir
[ -d $log_dir ] || mkdir $log_dir
[ -d $full_backup_dir ] || mkdir $full_backup_dir
[ -d $inc_backup_dir ] || mkdir $inc_backup_dir

全量备份函数

1
2
3
4
5
6
7
8
9
full_backup(){
# 全量备份命令
innobackupex --user=$MY_USER --password=$MY_PASS $full_backup_dir
if [ $? -eq 0 ];then
echo "${log_date} full backup!!!" >> $log_dir/back.log
else
echo "${log_date} full failed!!" >> $log_dir/err.log
fi
}

获取上周日的时间,以%Y-%m-%d格式显示

1
sunday=$(date -d "last sunday" +%F)

获取前一天的时间,以%Y-%m-%d格式显示

1
yesterday=$(date -d "yesterday" +%F)

增量备份函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
inc_backup(){
# 判断当前时间是否为周一(周一需要去找全量备份,周二到周六找前一天的备份)
if [ $week_date -eq 1 ];then
# 查找全量备份的文件路径
local full_backup_dir=$(find $backup_dir -name ${sunday}*)
innobackupex --user=$MY_USER --password=$MY_PASS --incremental ${inc_backup_dir} --incremental-basedir=${full_backup_dir}
# 判断命令是否执行成功,写入日志文件
if [ $? -eq 0 ];then
echo "${log_date} inc backup!!!" >> $log_dir/back.log
else
echo "${log_date} inc failed!!" >> $log_dir/err.log
fi
else
# 查找前一天的文件路径
local yesterday_backup_dir=$(find $backup_dir -name ${yesterday}*)
innobackupex --user=$MY_USER --password=$MY_PASS --incremental ${inc_backup_dir} --incremental-basedir=${yesterday_backup_dir}
# 判断命令是否执行成功,写入日志文件
if [ $? -eq 0 ];then
echo "${log_date} inc backup!!!" >> $log_dir/back.log
else
echo "${log_date} inc failed!!" >> $log_dir/err.log
fi
fi
}

查看当前是周几

1
week_date=$(date +%u)

判断当前是周几,周日则执行全量备份,周一到周六执行增量备份

1
2
3
4
5
if [ $week_date -eq 7 ];then
full_backup
else
inc_backup
fi

MySQL全量备份/增量备份脚本
http://example.com/2025/01/07/MySQL全量备份-增量备份脚本/
作者
Mr.xu
发布于
2025年1月7日
许可协议