记一次MySQL数据库恢复(附方案)

记一次MySQL数据库恢复(附方案)
最新回答
天生萌货

2021-12-26 10:35:39

MySQL数据库恢复方案

一、恢复步骤概要
  1. 备份关键文件:备份.frm(表结构)和.ibd(表数据)文件。
  2. 版本一致性:若MySQL版本变化,需安装回原版本。
  3. 创建新库:新建与原库同名、同字符集的数据库。
  4. 恢复表结构:通过.frm文件提取SQL并执行,重建空表。
  5. 卸载表空间:执行ALTER TABLE ... DISCARD TABLESPACE卸载表空间。
  6. 拷贝数据文件:将原.ibd文袜信件复制到新库的数据目录。
  7. 恢复表空间:执行ALTER TABLE ... IMPORT TABLESPACE加载数据。
  8. 配置还原:恢复用户权限、sql_mode等配置。
二、详细操作步骤1. 备份文件mkdir /usr/local/backupcp /var/lib/mysql/原数据库名/*.frm /usr/local/backup/cp /var/lib/mysql/原数据库名/*.ibd /usr/local/backup/2. 安装原版本MySQL
  • 卸载当前版本,下载并安装与告斗轮原库一致的MySQL版本(略,具体参考官方文档)。
3. 创建新库CREATE DATABASE 原数据库名 CHARACTER SET 原字符集 COLLATE 原排序规则;4. 恢复表结构
  • 安装dbsake工具:curl -s
    http://get.dbsake.net
    > dbsakechmod u+x dbsake
  • 提取表结构:./dbsake frmdump /usr/local/backup/表名.frm > 表结构.sql
  • 执行SQL文件:USE 原数据库名;SOURCE /path/to/表结构.sql;
5. 卸载表空间ALTER TABLE 表名 DISCARD TABLESPACE;6. 拷贝.ibd文件
  • 定位数据目录:SHOW VARIABLES LIKE 'datadir';
  • 复制文件:cp /usr/local/backup/表名.ibd /var/lib/mysql/原数据库名/chown mysql:mysql /var/lib/mysql/原数据库名/表名.ibd
7. 恢复表空间ALTER TABLE 表名 IMPORT TABLESPACE;8. 配置还原
  • 用户权限:从备份恢复或重新授权。
  • 全局配置:检查sql_mode、max_connections等参数是否与原库一致。
三、注意事项
  1. 版本兼容性:跨大版本恢复(如5.6→8.0)可能导致失败,建议使用相同版本。
  2. 文件权限:确保.ibd文件属主为mysql:mysql。
  3. 表结构验证:恢复后检查表是否存在数据(SELECT COUNT(*) FROM 表名)。
  4. 日志监控:恢复过程中观察MySQL错误日志(/var/log/mysql/error.log)。
四、常见问题处理
  • 错误:Tablespace is missing确认.ibd文件路径正确,且已执行DISCARD TABLESPACE。
  • 错误:InnoDB: Cannot find dictionary record表结构未正确恢复,重新执行.frm提取和建表步骤。
  • 字符集乱码:确保新库字符集与原库完全一致(如utf8mb4)。
五、总结

本方案通过物理文件(.frm+.ibd)和逻辑操作(表结构重建销罩)实现数据恢复,适用于误删表或数据库文件损坏的场景。关键点在于版本一致性、文件权限和操作顺序。建议恢复前在测试环境验证步骤。