MariaDB 在 Ubuntu 的备份与恢复策略
一 策略总览
- 备份方式选型
- 逻辑备份:使用 mysqldump 导出为 SQL,适合大多数场景,便于跨版本迁移、选择性恢复与审计。
- 物理/热备:使用 Percona XtraBackup 进行 InnoDB 热备,适合大库、低停机要求的场景。
- 备份内容
- 数据:全库或按库/表导出;InnoDB 建议一致性快照。
- 结构:建库、建表、视图、存储过程、触发器、事件等。
- 用户与权限:建议导出 mysql 库中的相关授权信息(谨慎操作)。
- 配置与密钥:如 server.cnf、SSL/TLS 证书、keyring 文件等。
- 频率与保留
- 全量:每日一次(如 02:00),保留 7–30 天。
- 增量:开启 二进制日志(binlog),按小时/天保留,用于点时间恢复(PITR)。
- 存储与传输
- 本地保留一份,异地/对象存储保留一份;使用 gzip 压缩与 scp/rsync 传输。
- 验证与演练
- 每周抽样恢复演练;校验 md5/sha256;记录恢复步骤与时长。
二 逻辑备份与恢复步骤
- 全量与按库备份
- 单库:
- mysqldump -u root -p mydb > mydb_$(date +“%F”).sql
- 多库:
- mysqldump -u root -p --databases db1 db2 > multi_$(date +“%F”).sql
- 全库:
- mysqldump -u root -p --all-databases > all_$(date +“%F”).sql
- 压缩备份:
- mysqldump -u root -p mydb | gzip > mydb_$(date +“%F”).sql.gz
- 远程传输
- scp mydb_2025-12-16.sql.gz user@remote:/backup/
- 或 rsync -avz mydb_2025-12-16.sql.gz user@remote:/backup/
- 恢复
- 单库:先建库(若不存在)再导入
- mysql -u root -p -e “CREATE DATABASE IF NOT EXISTS mydb;”
- mysql -u root -p mydb < mydb_2025-12-16.sql
- 多库/全库:
- mysql -u root -p < multi_2025-12-16.sql
- mysql -u root -p < all_2025-12-16.sql
- 定时任务
- 每天 2 点全量备份并压缩:
- 0 2 * * * mysqldump -u root mydb | gzip > /backup/mydb_$(date +%F).sql.gz
- 注意事项
- 大表建议按表导出/恢复;避免锁表影响业务。
- 恢复前确认目标库字符集/排序规则一致;必要时在 dump 文件中加入 –set-gtid-purged=OFF(如涉及 GTID)。
三 增量备份与点时间恢复
- 启用二进制日志
- 编辑配置文件(Ubuntu 常见路径:/etc/mysql/mariadb.conf.d/50-server.cnf 或 /etc/mysql/my.cnf)
- [mysqld] 下添加或取消注释:log_bin = /var/log/mysql/mysql-bin.log
- 重启服务:
- sudo systemctl restart mariadb
- 增量备份
- 按时间点拷贝 binlog(示例保留近 7 天)
- mysqladmin -u root -p flush-logs
- 将 mysql-bin.00000X 拷贝至备份目录(如 /backup/binlog/)
- 点时间恢复
- 全量恢复到最近一次全备:mysql -u root -p < all_2025-12-15.sql
- 回放增量(按时间顺序):
- mysqlbinlog --start-datetime=“2025-12-16 10:00:00”
–stop-datetime=“2025-12-16 10:15:00”
/backup/binlog/mysql-bin.00000X | mysql -u root -p
- 建议
- 定期清理过期 binlog;保留窗口与恢复目标相匹配。
四 物理热备与恢复步骤
- 适用场景
- 大容量 InnoDB 库、要求接近零停机的迁移/升级/恢复。
- 备份
- 安装工具:sudo apt-get update && sudo apt-get install percona-xtrabackup-24
- 完整备份:
- xtrabackup --backup --target-dir=/backup/full_2025-12-16
–user=root --password
- 准备与恢复
- 准备(回滚未提交事务,确保一致性):
- xtrabackup --prepare --target-dir=/backup/full_2025-12-16
- 传输到目标主机(如需要)
- tar czvf full_2025-12-16.tar.gz -C /backup/full_2025-12-16 .
- scp full_2025-12-16.tar.gz user@target:/backup/
- 在目标主机解压:tar xzvf full_2025-12-16.tar.gz -C /backup/full_2025-12-16
- 停库并拷贝回数据目录(示例默认 datadir:/var/lib/mysql)
- sudo systemctl stop mariadb
- sudo rm -rf /var/lib/mysql/*
- xtrabackup --copy-back --target-dir=/backup/full_2025-12-16
–datadir=/var/lib/mysql
- sudo chown -R mysql:mysql /var/lib/mysql
- sudo systemctl start mariadb
- 提示
- 增量热备可用 –incremental 与 –incremental-basedir;恢复时按顺序 prepare 与 copy-back。
五 自动化与运维实践
- 备份脚本示例(全量 + 压缩 + 远程)
- #!/usr/bin/env bash
set -e
USER=“root”; PASS=“”; HOST=“localhost”; DB=“mydb”
BACKUP_DIR=“/backup/mariadb”; DATE=$(date +“%F”)
mkdir -p “$BACKUP_DIR/binlog”
mysqldump -u “$USER” -p"$PASS" --single-transaction --routines --triggers --default-character-set=utf8mb4 “$DB”
| gzip > “$BACKUP_DIR/${DB}_${DATE}.sql.gz”
mysqladmin -u “$USER” -p"$PASS" flush-logs
cp /var/log/mysql/mysql-bin.* “$BACKUP_DIR/binlog/” 2>/dev/null || true
find “$BACKUP_DIR” -name “.sql.gz" -mtime +7 -delete
find “$BACKUP_DIR/binlog” -name "mysql-bin.” -mtime +7 -delete
- 校验与演练
- 校验:sha256sum mydb_2025-12-16.sql.gz;抽样导入测试库验证表数量与数据量。
- 演练:每季度执行一次 PITR 演练,记录 RPO/RTO 指标。
- 安全与合规
- 备份文件权限 600;传输使用 scp/rsync over SSH;异地/对象存储加密保存。
- 保留 审计日志 与备份清单;变更窗口内执行恢复演练并留痕。