脚本逻辑:
- 基于mariabackup工具,使用crontab配置 0 */1 * * * /root/backup/backup.sh 实现每小时运行
- 脚本运行时,会检测当天是否已经有过备份,若否则进行一次全量备份并将备份路径写入config.ini文件中
- 脚本再次运行时,会从config.ini读取上一次的备份路径,并在上一次备份的基础上进行增量备份,同样在config.ini中记录路径
- 脚本在/root/backup目录下以 yyyyMMdd格式创建每天的任务,目录中会按顺序生成 full_hhmmss及incr_hhmmss格式的子目录,分别存放当天的第一次全量备份和后面的每一次增量备份
- 脚本生成的备份文件存放在本机上,应通过其它任务或工具定时将备份结果推送至其它机器,我公司使用群晖的Active Backup for Business套件定时将备份文件传输至备份主机上。
注:这个脚本是给一个小系统用的,脚本中没有单独判断是否执行成功。对RPO要求更高的,理论上可以进一步减少执行间隔。
备份时若想略过指定表,可在mariabackup 上使用 --databases-exclude=“example.table1 example.table2”,更多细节见:Mariabackup
#!/bin/bash
#####################################################################
# 备份频率:每天全量备份,每小时增量备份 #
#####################################################################
# 备份文件存放目录
base_dir="/root/backup"
# 用户名
backup_u="mariabackup"
# 用户密码
backup_p="mariabackup"
base_date="$(date +'%Y%m%d')"
if [ ! -d "$base_dir/$base_date" ]; then
echo "全量备份..."
# 当天第1次:全量备份
today_base="$base_dir/$base_date/full_$(date +'%H%M%S')"
mkdir -p "$today_base"
mariabackup -u"$backup_u" -p"$backup_p" --backup --target-dir="$today_base"
echo "$today_base" >> "$base_dir/$base_date/config.ini"
else
# 当天第N次:增量备份
last_dir=$(tail -n 1 "$base_dir/$base_date/config.ini")
incr_dir="$base_dir/$base_date/incr_$(date +'%H%M%S')"
mariabackup -umariabackup -pmariabackup --backup --target-dir="$incr_dir" --incremental-basedir="$last_dir"
echo "$incr_dir" >> "$base_dir/$base_date/config.ini"
echo "increm backup successful . based on $last_dir"
fi
# 删除7天以上的备份
find "$base_dir" -type d -mtime +3 | xargs rm -r
恢复第一步,还原每一次的增量备份(预处理):
-- 预恢复 full
mariabackup --prepare --target-dir=/root/backup/20231210/full_000000
-- 预恢复第一次增量(在全量备份的基础上)
mariabackup --prepare --target-dir=/root/backup/20231210/full_000000 --incremental-dir=/root/backup/20231210/incr_010000
-- 预恢复后续备份(在上一次增量的基础上)
mariabackup --prepare --target-dir=/root/backup/20231210/incr_010000 --incremental-dir=/root/backup/20231210/incr_020000
-- 有多少个增量就要按顺序执行多少次
恢复第二步,正式恢复
-- 停止服务
systemctl stop mysqld
-- 清空数据
mv -r /var/lib/mysql/ /var/lib/mysql_backup
mkdir /var/lib/mysql/
-- 正式恢复
mariabackup --copy-back --target-dir=/root/backup/20231210/full_000000
-- 恢复仅限
chown -R mysql:mysql /var/lib/mysql/
-- 重启服务
systemctl restart mysqld