误操作phpMyAdmin后数据库丢失,含ibd文件如何恢复?
恢复误操作后丢失的InnoDB数据库(基于.ibd文件)
先停掉MySQL服务,避免操作过程中数据损坏,不同系统命令不一样:
# Ubuntu/Debian 系统 sudo systemctl stop mysql # CentOS/RHEL 系统 sudo systemctl stop mysqld # Windows 系统 net stop MySQL
重要:先把当前所有相关文件(包括系统库、剩余的.ibd文件)备份到安全位置,别在没备份的情况下瞎操作。
有.frm文件的情况(表结构定义文件还在)
如果原来的数据库目录里还能找到.frm文件,按以下步骤来:
- 新建和原数据库同名的空库,然后在库内新建和原表结构完全一致的空表(可以用.frm文件导出结构,或者凭记忆/备份的结构重建)。
- 进入MySQL命令行,执行命令丢弃空表的表空间:
ALTER TABLE 你的表名 DISCARD TABLESPACE; - 把备份的原.ibd文件复制到新创建的数据库目录下,修改文件权限为MySQL运行用户(一般是mysql:mysql):
sudo chown mysql:mysql /var/lib/mysql/你的数据库名/你的表名.ibd sudo chmod 660 /var/lib/mysql/你的数据库名/你的表名.ibd - 回到MySQL命令行,导入表空间:
ALTER TABLE 你的表名 IMPORT TABLESPACE; - 执行
SELECT * FROM 你的表名;看看数据有没有回来。
只有.ibd文件的情况(找不到.frm)
这种情况得先从.ibd里扒出表结构:
- 用MySQL自带的
ibd2sdi工具提取表的序列化字典信息:ibd2sdi /path/to/你的表名.ibd > table_structure.txt - 打开生成的
table_structure.txt,从中找出CREATE TABLE语句,注意修正字符集、存储引擎这些参数,确保和原表一致。 - 新建同名数据库和对应表,之后重复上面的步骤2-5:丢弃空表空间→复制原.ibd→改权限→导入表空间。
踩坑提醒
- 必须保证当前MySQL版本和原数据库用的版本完全一致,版本不匹配大概率恢复失败。
- 如果
IMPORT TABLESPACE报错,检查新表的结构是不是和原表完全一样,包括字段类型、索引、字符集、主键这些细节。 - 要是上面的方法都没用,可以试试Percona的InnoDB恢复工具,但这个需要点技术功底,别瞎试。
- 恢复成功后立刻全量备份数据库,别再犯同样的错。
内容的提问来源于stack exchange,提问作者Егор Белобородов
相关产品推荐
相关产品推荐

