MariaDB自动备份落地方案
一 方案选型与准备
- 选型建议
- 逻辑备份:使用 mysqldump,适合跨版本迁移、单库/多库/全库导出,配合压缩与定时任务即可满足多数中小规模场景。
- 物理热备:使用 mariabackup(MariaDB 官方备份工具),支持 InnoDB 热备,适合大数据量、需要更高恢复效率与时间点恢复的场景。
- 备份账号与权限
- 建议创建最小权限备份账号:
- 逻辑备份:授予 SELECT、SHOW VIEW、LOCK TABLES、RELOAD、PROCESS、REPLICATION CLIENT(按需精简)。
- 物理备份:授予 RELOAD、PROCESS、LOCK TABLES、REPLICATION CLIENT 等。
- 示例:
- CREATE USER ‘buser’@‘localhost’ IDENTIFIED BY ‘StrongPass!’;
- GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON . TO ‘buser’@‘localhost’;
- FLUSH PRIVILEGES;
- 基础配置
- 物理备份建议开启 InnoDB 重做日志与(可选)二进制日志,便于恢复与时间点恢复:
- 在 my.cnf 的 [mysqld] 中配置:log-bin=mysql-bin;并确保 server-id 唯一。
二 方案一 mysqldump逻辑备份与定时任务
- 单库备份脚本示例(含压缩与保留策略)
- 保存为:/opt/scripts/mariadb_backup.sh
- 执行:chmod +x /opt/scripts/mariadb_backup.sh
- 示例:
- #!/bin/bash
DATE=$(date +%F_%H%M%S)
BACKUP_DIR=“/opt/backup/mysql”
DB=“mydb”
USER=“buser”
PASS=“StrongPass!”
mkdir -p “$BACKUP_DIR”
mysqldump -u"$USER" -p"$PASS" --single-transaction --routines --triggers --default-character-set=utf8mb4 “$DB”
| gzip > “$BACKUP_DIR/${DB}_${DATE}.sql.gz”
保留最近7天
find “$BACKUP_DIR” -name “${DB}_*.sql.gz” -mtime +7 -delete
- 全库备份(可选)
- 将 mysqldump 行替换为:mysqldump -u"$USER" -p"$PASS" --all-databases --single-transaction --routines --triggers --default-character-set=utf8mb4 | gzip > “$BACKUP_DIR/all_${DATE}.sql.gz”
- 定时任务
- 每天 02:00 执行:
- 0 2 * * * /opt/scripts/mariadb_backup.sh >> /var/log/mariadb_backup.log 2>&1
- 恢复示例
- gunzip < /opt/backup/mysql/mydb_2026-01-01_020000.sql.gz | mysql -u root -p[密码] mydb
- 全库:mysql -u root -p[密码] < /opt/backup/mysql/all_2026-01-01_020000.sql
三 方案二 mariabackup物理热备与定时任务
- 安装工具
- RHEL/CentOS:yum -y install MariaDB-backup
- 全量+增量策略(示例)
- 每天 01:10 执行全量;其余时间每小时增量(以“上一次备份目录”为基目录)。
- 备份脚本:/opt/scripts/mariabackup_inc.sh
-
#!/bin/bash
BASE_DIR=“/opt/backup/mariabackup”
LOG=“/var/log/mariabackup.log”
USER=“buser”
PASS=“StrongPass!”
DATE=$(date +%F)
mkdir -p “$BASE_DIR/$DATE”
LAST_FILE=“$BASE_DIR/last_backup”
当天是否已有全量
if [ ! -f “$LAST_FILE” ] || [ $(find “$LAST_FILE” -mtime +0 | wc -l) -gt 0 ]; then
TAG=“full_$(date +%H%M%S)”
TARGET=“$BASE_DIR/$DATE/$TAG”
mariabackup --backup --user=“$USER” --password=“$PASS” --target-dir=“$TARGET” >> “$LOG” 2>&1
if [ $? -eq 0 ]; then
echo “$TARGET” > “$LAST_FILE”
echo “$(date) 全量完成: $TARGET” >> “$LOG”
else
echo “$(date) 全量失败” >> “$LOG”
exit 1
fi
else
LAST_BASE=$(cat “$LAST_FILE”)
TAG=“incr_$(date +%H%M%S)”
TARGET=“$BASE_DIR/$DATE/$TAG”
mariabackup --backup --user=“$USER” --password=“$PASS” --target-dir=“$TARGET” --incremental-basedir=“$LAST_BASE” >> “$LOG” 2>&1
if [ $? -eq 0 ]; then
echo “$TARGET” > “$LAST_FILE”
echo “$(date) 增量完成: $TARGET” >> “$LOG”
else
echo “$(date) 增量失败” >> “$LOG”
exit 1
fi
fi
保留最近7天
find “$BASE_DIR” -mindepth 1 -maxdepth 1 -type d -mtime +7 -exec rm -rf {} ;
- 定时任务
- 全量:10 1 * * * /opt/scripts/mariabackup_inc.sh
- 增量:0 * * * * /opt/scripts/mariabackup_inc.sh
- 恢复要点(按顺序)
- 准备阶段(–prepare)
- mariabackup --prepare --target-dir=/opt/backup/mariabackup/2026-01-01/full_xxxxxx
- mariabackup --prepare --target-dir=/opt/backup/mariabackup/2026-01-01/full_xxxxxx --incremental-dir=/opt/backup/mariabackup/2026-01-01/incr_yyyyyy
- 如有更多增量,依次基于“上一次增量”执行
- 恢复阶段(–copy-back)
- systemctl stop mariadb
- mv /var/lib/mysql /var/lib/mysql.bak
- mkdir -p /var/lib/mysql
- mariabackup --copy-back --target-dir=/opt/backup/mariabackup/2026-01-01/full_xxxxxx
- chown -R mysql:mysql /var/lib/mysql
- systemctl start mariadb
四 远程备份与保留策略
- 远程拷贝
- rsync 示例(放到备份脚本末尾,或单独定时任务):
- rsync -avz --delete /opt/backup/mysql/ user@backup-server:/remote/backup/mysql/
- 或增量备份完成后立即同步,减少 RPO。
- 保留与校验
- 按时间保留(如 7 天)已在脚本中通过 find 实现;建议增加定期恢复演练与校验(如每周抽样解压导入到测试库验证可用性)。
- 安全建议
- 备份文件可加密:gpg -c /opt/backup/mysql/mydb_2026-01-01.sql.gz
- 凭据安全:脚本中避免明文密码,可使用配置文件(权限 600)或凭据文件/密钥管理工具。
五 常见注意事项
- 一致性
- mysqldump 加 –single-transaction 获取一致性快照(InnoDB);MyISAM 需配合 –lock-tables(会短暂锁表)。
- 字符集与兼容性
- 空间与性能
- 大库建议物理备份;压缩可显著节省空间但会增加 CPU 与时间开销。
- 监控与告警
- 将脚本退出码与日志接入监控系统;备份失败即时告警(邮件/企业微信/钉钉等)。
- 时间点恢复
- 需要时间点恢复时,务必开启 二进制日志,并妥善保存 binlog(与备份策略协同)。