如何实现MariaDB数据备份自动化
导读:MariaDB 备份自动化落地方案 一 方案选型与准备 工具选择:使用 mariabackup(MariaDB 官方热备工具,支持 InnoDB 热备、增量备份、流备份),适合生产环境的在线备份与快速恢复。 备份用户与权限:创建最小权限备...
MariaDB 备份自动化落地方案
一 方案选型与准备
- 工具选择:使用 mariabackup(MariaDB 官方热备工具,支持 InnoDB 热备、增量备份、流备份),适合生产环境的在线备份与快速恢复。
- 备份用户与权限:创建最小权限备份账号,建议仅本地连接,授予 RELOAD、PROCESS、LOCK TABLES、REPLICATION CLIENT 等必要权限。
- 目录与日志:规划备份根目录(如 /opt/mysql_backup)、全量/增量子目录、以及日志文件(如 /var/log/mariadb_backup.log),并确保运行用户(如 mysql)对相关目录有读写权限。
- 保留策略:结合容量与合规设置保留天数(如 7/30 天),并配置周期性清理任务。
二 自动化脚本示例
- 策略说明:每天做 全量备份,其余时间基于“上一次备份目录”做 增量备份;通过状态文件记录“基准备份”,失败自动清理残留目录;按保留天数清理旧备份。
- 使用方式:修改脚本顶部的 MYSQL_USER/MYSQL_PASSWORD/BACKUP_DIR/FULL_BACKUP_INTERVAL/RETENTION_DAYS/LOG_FILE 后赋权并加入 crontab 定时执行。
#!/usr/bin/env bash
set -Eeuo pipefail
# ===== 用户配置 =====
MYSQL_USER="buser"
MYSQL_PASSWORD="tmrQ"
BACKUP_DIR="/opt/mysql_backup"
FULL_BACKUP_INTERVAL=7 # 全量间隔:天
RETENTION_DAYS=30 # 保留天数
LOG_FILE="/var/log/mariadb_backup.log"
# ===== 内部变量 =====
FULL_DIR="$BACKUP_DIR/full"
INCR_DIR="$BACKUP_DIR/incr"
LAST_FULL_FILE="$BACKUP_DIR/last_full_backup"
XBK="/usr/bin/mariabackup"
log() {
echo "[$(date '+%F %T')] $*" | tee -a "$LOG_FILE"
}
cleanup() {
local target="$1"
if [[ -d "$target" ]];
then
rm -rf "$target"
log "已清理临时目录: $target"
fi
}
check_db() {
if ! mysql -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "SELECT 1" &
>
/dev/null;
then
log "ERROR: 无法连接 MariaDB,请检查账号/网络/权限"
return 1
fi
}
full_backup() {
local ts
ts=$(date +"%Y%m%d_%H%M%S")
local target_dir="$FULL_DIR/full-$ts"
mkdir -p "$target_dir"
log "开始全量备份 ->
$target_dir"
if "$XBK" --backup \
--user="$MYSQL_USER" \
--password="$MYSQL_PASSWORD" \
--target-dir="$target_dir" >
>
"$LOG_FILE" 2>
&
1;
then
echo "$target_dir" >
"$LAST_FULL_FILE"
log "全量备份成功: $target_dir"
else
log "全量备份失败: $target_dir"
cleanup "$target_dir"
return 1
fi
}
incremental_backup() {
local base_dir
base_dir=$(cat "$LAST_FULL_FILE" 2>
/dev/null || true)
if [[ -z "$base_dir" || ! -d "$base_dir" ]];
then
log "未找到可用基准备份,回退执行全量备份"
full_backup
return $?
fi
local ts
ts=$(date +"%Y%m%d_%H%M%S")
local target_dir="$INCR_DIR/incr-$ts"
mkdir -p "$target_dir"
log "开始增量备份 ->
$target_dir(基于: $(basename "$base_dir"))"
if "$XBK" --backup \
--user="$MYSQL_USER" \
--password="$MYSQL_PASSWORD" \
--target-dir="$target_dir" \
--incremental-basedir="$base_dir" >
>
"$LOG_FILE" 2>
&
1;
then
log "增量备份成功: $target_dir"
else
log "增量备份失败: $target_dir"
cleanup "$target_dir"
return 1
fi
}
purge_old() {
log "清理超过 $RETENTION_DAYS 天的备份..."
find "$FULL_DIR" -mindepth 1 -type d -mtime "+$RETENTION_DAYS" -print -delete | while read d;
do
log "删除旧全备: $d"
done
find "$INCR_DIR" -mindepth 1 -type d -mtime "+$RETENTION_DAYS" -print -delete | while read d;
do
log "删除旧增备: $d"
done
}
main() {
log "===== 备份开始 ====="
check_db || exit 1
local need_full=false
if [[ ! -f "$LAST_FULL_FILE" ]];
then
need_full=true
elif [[ $(find "$LAST_FULL_FILE" -mtime "+$FULL_BACKUP_INTERVAL" | wc -l) -gt 0 ]];
then
need_full=true
fi
if $need_full;
then
full_backup
else
incremental_backup
fi
purge_old
log "===== 备份完成 ====="
}
main "$@"
- 定时任务示例(每天 04:00 执行):
0 4 * * * /usr/bin/bash /opt/scripts/mariadb_backup.sh - 如需按“每天全量、每小时增量”的节奏,可改为每小时执行,并在脚本内按“当天是否已全量”进行分支选择。
三 远程备份与传输
- rsync 方式(推荐,增量同步、断点续传):
# 本地脚本备份完成后执行 rsync -avz --delete -e ssh /opt/mysql_backup/ backup@10.0.0.111:/data/mysqlbak/ - 打包流 + SSH 方式(适合带宽一般或需压缩传输):
# 全量 mariabackup --backup --user=buser --password=tmrQ --stream=xbstream | \ gzip | ssh backup@10.0.0.111 "cat > /data/mysqlbak/full_$(date +%F_%H%M%S).xbstream.gz" # 增量(基于上一次备份目录) mariabackup --backup --user=buser --password=tmrQ \ --incremental-basedir=/opt/mysql_backup/full/full-YYYYMMDD_HHMMSS \ --stream=xbstream | gzip | \ ssh backup@10.0.0.111 "cat > /data/mysqlbak/incr_$(date +%F_%H%M%S).xbstream.gz" - 前置条件:打通 SSH 免密登录(ssh-keygen/ssh-copy-id),并在远端创建备份目录与合适的属主属组。
四 还原流程要点
- 准备阶段(Prepare)
- 全量准备(仅一次):
mariabackup --prepare --target-dir=/data/restore/base - 依次准备每个增量(按时间顺序,除最后一个增量外建议加 –apply-log-only):
mariabackup --prepare --apply-log-only --target-dir=/data/restore/base \ --incremental-dir=/data/restore/incr_YYYYMMDD_HHMMSS_01 mariabackup --prepare --apply-log-only --target-dir=/data/restore/base \ --incremental-dir=/data/restore/incr_YYYYMMDD_HHMMSS_02 # 最后一个增量可不加 --apply-log-only mariabackup --prepare --target-dir=/data/restore/base \ --incremental-dir=/data/restore/incr_YYYYMMDD_HHMMSS_NN
- 全量准备(仅一次):
- 恢复阶段(Copy Back)
systemctl stop mysqld mv /var/lib/mysql /var/lib/mysql.bak_$(date +%F_%H%M%S) mkdir -p /var/lib/mysql mariabackup --copy-back --target-dir=/data/restore/base chown -R mysql:mysql /var/lib/mysql systemctl start mysqld - 提示:若使用 –stream 方式备份,需先用 mbstream -x 解包到目录后再执行 prepare/copy-back。
五 监控校验与最佳实践
- 校验与留痕:脚本内统一 日志输出 与 错误退出码;定期校验备份可用(如随机抽取一次做“prepare 演练”),并将关键指标(成功/失败、耗时、备份大小)接入监控告警。
- 安全建议:避免在命令行中明文写密码,可使用 ~/.my.cnf 配置凭据或凭据管理工具;限制备份账号仅本地访问;备份文件与传输通道加密存储/传输。
- 保留与容量:按 容量与 RPO/RTO 设定全量/增量频率与保留天数;对历史备份做 定期归档与异地/离线 存放,降低单点风险。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 如何实现MariaDB数据备份自动化
本文地址: https://pptw.com/jishu/770912.html
