温馨提示×

如何恢复丢失的MariaDB数据

小樊
36
2025-12-12 11:19:04
栏目: 云计算

MariaDB数据恢复实用指南

一、先判断场景与准备

  • 明确丢失类型:是误删库/表/行数据目录损坏误改结构,还是完全无备份
  • 立刻保护现场:对当前实例做只读或停止写入;对磁盘做只读快照(LVM/ZFS/云盘快照);备份现有数据目录错误日志二进制日志与配置文件。
  • 确认环境与版本:记录MariaDB版本存储引擎(InnoDB/MyISAM)、是否启用log_binserver-id、数据目录(如**/var/lib/mysql**)。
  • 如无备份,优先尝试从物理文件binlog挽回;若有备份,优先用备份恢复,再用日志做时间点补齐。

二、有备份时的恢复

  • 逻辑备份恢复(mysqldump)
    • 全库/多库:mysql < backup.sql;单库:mysql -u 用户 -p 数据库名 < backup.sql。
    • 导入前建议临时关闭二进制日志避免重复记录:SET sql_log_bin=OFF; 导入完成后 SET sql_log_bin=ON;。
  • 时间点恢复(全备 + Binlog)
    • 全备建议带位点信息:mysqldump -A --master-data=2 --single-transaction -F > backup.sql,备份文件中会包含类似:-- CHANGE MASTER TO MASTER_LOG_FILE=‘binlog.000001’, MASTER_LOG_POS=2638793;。
    • 恢复步骤:先恢复全备,再用 mysqlbinlog 回放增量到“误删前”的位置或时间:
      • 按位置:mysqlbinlog --start-position=2638793 --stop-position=目标位置 /var/lib/mysql/binlog.000001 | mysql -u 用户 -p
      • 按时间:mysqlbinlog --start-datetime=“2025-12-12 10:00:00” --stop-datetime=“2025-12-12 10:05:00” /var/lib/mysql/binlog.000001 | mysql -u 用户 -p
    • 导入增量前同样建议 SET sql_log_bin=OFF; 完成后 SET sql_log_bin=ON;。
  • 物理备份恢复(mariabackup/Percona XtraBackup)
    • 准备阶段:mariabackup --prepare --target-dir=/backup/full
    • 恢复阶段:停库,清空/移走原数据目录,mariabackup --copy-back --target-dir=/backup/full,修正权限(如 chown -R mysql:mysql /var/lib/mysql),再启动服务。

三、无备份时的恢复

  • InnoDB页损坏或实例无法启动
    • 查看错误日志定位损坏点(如 InnoDB checksum 错误)。
    • 在配置中逐步设置 innodb_force_recovery=1…6 启动,能启动后立刻逻辑导出全部可用数据(mysqldump),然后重建实例并导入。仅在万不得已时逐层提高级别,恢复后立即重建库,不要长期运行在强制恢复模式。
  • 数据目录文件仍在但实例异常
    • 准备同版本/相近版本的 MariaDB,停库后将目标库的数据库目录与关键系统文件(如 ibdata1、ib_logfile0、ib_logfile1 等)拷贝到新实例数据目录,修正权限(如 chown -R mysql:mysql,文件权限 660),启动后先做全量导出备份,再迁移到正式环境。
  • 无任何备份且文件已被删除
    • 立刻停止写入并做磁盘镜像;尝试从文件系统/块层恢复工具找回 .frm/.MYD/.MYI/ibdata1 等文件,再按“文件仍在”的流程尝试启动与导出;成功率依赖文件系统与删除时机,必要时寻求专业数据恢复服务。

四、常见恢复场景与命令清单

场景 关键前提 核心命令/步骤
误删表/库,有全备+binlog 已启用 log_bin,全备含位点 1) mysql < full.sql 2) 从备份文件读取 MASTER_LOG_FILE/POS 3) mysqlbinlog --start-position=… --stop-position=…
时间点恢复到某时刻 有全备与连续binlog 1) 全备恢复 2) mysqlbinlog --start-datetime=“YYYY-MM-DD HH:MM:SS” --stop-datetime=“…” binlog.00000N
仅SQL文本备份(.sql/.dump) 备份文件可用 mysql -u 用户 -p 数据库名 < file.sql;或 mysqlimport/mariadb-restore 处理 .dump
物理文件可用但实例崩溃 数据文件完整 拷贝数据库目录与 ib* 文件至新实例数据目录→修正权限→启动→导出→重建→导入
无法启动(InnoDB损坏) 错误日志可见损坏 my.cnf 中设 innodb_force_recovery=1→能启动即 mysqldump 全量导出→重建实例→导入

五、恢复后的校验与加固

  • 校验:核对表数量/行数、关键业务校验和/抽样对比、主外键与触发器、视图/存储过程可用性。
  • 加固:
    • 启用并定期轮转 binlog,全备时记录位点(–master-data),保留足够历史以便点位恢复。
    • 制定定期全备+增量/差异策略;重要系统建议配合物理备份(mariabackup)。
    • 变更流程引入变更窗口、审批与回滚预案;生产操作前先在预备环境演练
    • 关键目录与备份做权限最小化异地/离线留存;启用监控告警定期恢复演练

0