温馨提示×

mariadb在linux如何恢复数据

小樊
36
2025-12-20 09:02:17
栏目: 云计算

Linux 下 MariaDB 数据恢复实用指南

一 场景与准备

  • 明确备份类型:
    • 逻辑备份(如 mysqldump 生成的 .sql 文件),适合跨版本迁移与单库/多库恢复。
    • 物理备份(如 mariabackup/Percona XtraBackup 拷贝的 datadirInnoDB 日志),适合同版本快速全量恢复。
    • 二进制日志 Binlog(记录 DML/DDL),用于时间点恢复 PITR与误删回滚。
  • 准备与检查:
    • 确认 MariaDB 版本一致(物理恢复强烈建议同版本),并准备同架构的 Linux 环境。
    • 确认 datadir(如 /var/lib/mysql)、log_bin 路径、是否启用 gtid 等配置。
    • 恢复前停止写入,避免增量变更干扰;必要时先对当前环境做一次快照或备份。

二 逻辑备份恢复 mysqldump

  • 全量恢复(所有库):
    1. 建议先停写并临时关闭二进制日志:
      mysql -uroot -p -e “SET sql_log_bin=0;”
    2. 执行导入:
      mysql -uroot -p < /backup/all_2025-12-20.sql
    3. 如有 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
  • 步骤:
    1. 从全量备份中找到恢复起点:
      • 若备份用 –master-data=2,在备份 SQL 中查找类似:
        – CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000001’, MASTER_LOG_POS=328;
      • 或用 SQL:SHOW MASTER STATUS; 查看当前文件与位置。
    2. 导出增量区间的 Binlog:
      mysqlbinlog --start-position=328 /var/lib/mysql/mysql-bin.000001 > /backup/inc.sql

      如有多个文件:mysqlbinlog mysql-bin.000002 >> /backup/inc.sql

    3. 执行恢复:
      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

  • 全量恢复(同版本优先):
    1. 准备阶段(回放 redo,使备份一致):
      mariabackup --prepare --target-dir=/backup/full_2025-12-20
    2. 停止数据库并清空/备份原 datadir:
      systemctl stop mariadb
      mv /var/lib/mysql /var/lib/mysql.bak_$(date +%F)
    3. 拷贝回数据(保持权限一致):
      mariabackup --copy-back --target-dir=/backup/full_2025-12-20
      chown -R mysql:mysql /var/lib/mysql
    4. 启动并验证:
      systemctl start mariadb
  • 增量恢复:先 prepare 全量,再按顺序 prepare 各增量,最后 copy-back。
  • 要点:
    • 物理恢复要求 MariaDB 版本尽量一致,且恢复前后 innodb_log_file_size 等配置保持一致。
    • 若使用 XtraBackup,流程与 mariabackup 基本一致(命令名不同)。

五 仅文件损坏或误删表的文件级恢复

  • 适用:数据目录中个别库/表文件损坏或误删,但 ibdata1、系统库(mysql/performance_schema) 等关键文件仍在。
  • 步骤:
    1. 准备同版本实例并停止服务;
    2. 将完好的库目录(如 /var/lib/mysql/mydb)与必要的 ibdata1 等系统文件拷贝到目标 datadir;
    3. 修正权限:
      chown -R mysql:mysql /var/lib/mysql/mydb /var/lib/mysql/ibdata1
      chmod -R 660 /var/lib/mysql/mydb /var/lib/mysql/ibdata1
    4. 启动实例并立即导出该库为逻辑备份,再在新环境导入;
    5. 如为 MyISAM,常见文件为 .frm/.MYD/.MYI;如为 InnoDB 且共享表空间(未启用 innodb_file_per_table),务必连同 ibdata1 一并恢复。
  • 风险提示:文件级拷贝属于高风险操作,务必先做好当前环境备份。

0