Linux 下 MariaDB 数据恢复实用指南
一 场景与准备
- 明确备份类型:
- 逻辑备份(如 mysqldump 生成的 .sql 文件),适合跨版本迁移与单库/多库恢复。
- 物理备份(如 mariabackup/Percona XtraBackup 拷贝的 datadir 与 InnoDB 日志),适合同版本快速全量恢复。
- 二进制日志 Binlog(记录 DML/DDL),用于时间点恢复 PITR与误删回滚。
- 准备与检查:
- 确认 MariaDB 版本一致(物理恢复强烈建议同版本),并准备同架构的 Linux 环境。
- 确认 datadir(如 /var/lib/mysql)、log_bin 路径、是否启用 gtid 等配置。
- 恢复前停止写入,避免增量变更干扰;必要时先对当前环境做一次快照或备份。
二 逻辑备份恢复 mysqldump
- 全量恢复(所有库):
- 建议先停写并临时关闭二进制日志:
mysql -uroot -p -e “SET sql_log_bin=0;”
- 执行导入:
mysql -uroot -p < /backup/all_2025-12-20.sql
- 如有 GTID,导入后按需重置 GTID 执行历史:
mysql -uroot -p -e “SET GLOBAL gtid_purged=‘uuid:N’;”(将 uuid:N 替换为备份中记录的 GTID 集合)
- 单库/单表恢复:
- 方法 A:mysql -uroot -p 目标库 < db.sql
- 方法 B:登录后 source /backup/db.sql
- 要点:
- 使用 mysqldump 时建议加上 –single-transaction --routines --triggers --hex-blob --set-gtid-purged=OFF/AUTO 等选项,保证一致性并控制 GTID 写入。
- 恢复期间关闭 binlog 可避免把恢复过程本身记入日志。
三 时间点恢复 PITR 基于 Binlog
- 前提:你已有一次“全量/基础备份”,并且开启了 log_bin。
- 步骤:
- 从全量备份中找到恢复起点:
- 若备份用 –master-data=2,在备份 SQL 中查找类似:
– CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000001’, MASTER_LOG_POS=328;
- 或用 SQL:SHOW MASTER STATUS; 查看当前文件与位置。
- 导出增量区间的 Binlog:
mysqlbinlog --start-position=328 /var/lib/mysql/mysql-bin.000001 > /backup/inc.sql
如有多个文件:mysqlbinlog mysql-bin.000002 >> /backup/inc.sql
- 执行恢复:
mysql -uroot -p -e “SET sql_log_bin=0;”
mysql -uroot -p < /backup/all_2025-12-20.sql
mysql -uroot -p < /backup/inc.sql
- 时间窗口恢复:
mysqlbinlog --start-datetime=“2025-12-20 10:00:00” --stop-datetime=“2025-12-20 10:05:00” /var/lib/mysql/mysql-bin.000001 | mysql -uroot -p
- 误删表/库回滚技巧:
- 先用 mysqlbinlog 导出到文件,在编辑器中注释/删除 DROP/TRUNCATE 语句,再导入增量。
四 物理备份恢复 mariabackup XtraBackup
- 全量恢复(同版本优先):
- 准备阶段(回放 redo,使备份一致):
mariabackup --prepare --target-dir=/backup/full_2025-12-20
- 停止数据库并清空/备份原 datadir:
systemctl stop mariadb
mv /var/lib/mysql /var/lib/mysql.bak_$(date +%F)
- 拷贝回数据(保持权限一致):
mariabackup --copy-back --target-dir=/backup/full_2025-12-20
chown -R mysql:mysql /var/lib/mysql
- 启动并验证:
systemctl start mariadb
- 增量恢复:先 prepare 全量,再按顺序 prepare 各增量,最后 copy-back。
- 要点:
- 物理恢复要求 MariaDB 版本尽量一致,且恢复前后 innodb_log_file_size 等配置保持一致。
- 若使用 XtraBackup,流程与 mariabackup 基本一致(命令名不同)。
五 仅文件损坏或误删表的文件级恢复
- 适用:数据目录中个别库/表文件损坏或误删,但 ibdata1、系统库(mysql/performance_schema) 等关键文件仍在。
- 步骤:
- 准备同版本实例并停止服务;
- 将完好的库目录(如 /var/lib/mysql/mydb)与必要的 ibdata1 等系统文件拷贝到目标 datadir;
- 修正权限:
chown -R mysql:mysql /var/lib/mysql/mydb /var/lib/mysql/ibdata1
chmod -R 660 /var/lib/mysql/mydb /var/lib/mysql/ibdata1
- 启动实例并立即导出该库为逻辑备份,再在新环境导入;
- 如为 MyISAM,常见文件为 .frm/.MYD/.MYI;如为 InnoDB 且共享表空间(未启用 innodb_file_per_table),务必连同 ibdata1 一并恢复。
- 风险提示:文件级拷贝属于高风险操作,务必先做好当前环境备份。