已测试版本:5.5.18
OS :RHEL 6.3
前提:数据库无法启动,无备份,ibd文件还在! ibd文件还在! ibd文件还在!
背景:升级失败,undrop-for-innodb 只能读取ibdata 中的表的信息。
1. 在其他服务器安装相同版本的MySQL,建立空库ybt
2. 在空库ybt中新建表 tdm_fws_module_recomment_server_ed
3. 在5.5 版本中,通过ibd文件来查看tablespace id
二进制的方式打开
vi tdm_fws_module_recomment_server_ed.ibd -b
在vi 下,输入 :%!xxd 转为16进制
0000000: 80b4 eafe 0000 0000 0000 0000 0000 0000 ................
0000010: 0000 0000 0037 b458 0008 0000 0000 0000 .....7.X........
0000020: 0000 0000 012a 0000 012a 0000 0000 0000 .....*...*......
0000030: 0006 0000 0040 0000 0000 0000 0004 0000 .....@..........
0000040: 0000 ffff ffff 0000 ffff ffff 0000 0000 ................
0000050: 0001 0000 0000 009e 0000 0000 009e 0000 ................
0000060: 0000 ffff ffff 0000 ffff ffff 0000 0000 ................
0000070: 0000 0000 0003 0000 0000 ffff ffff 0000 ................
0000080: ffff ffff 0000 0000 0001 0000 0002 0026 ...............&
其中,第三行的两个012a 为tablespace id
4. 备份已损坏库的ibd文件,并覆盖到新建库的ybt 对应目录下的ibd文件
5. 通过vi 打开拷贝后的ibd文件
在vi 下,输入 :%!xxd 转为16进制
将该ibd文件的两个 tablespace id 改为 012a
输入 :%!xxd -r 转换为二进制
输入 :wq! 保存
6. 修改innodb_force_recovery = 6,重启数据库
7. 导出数据
5.6 以后可以通过 以下sql 查询
mysql> select * from information_schema.INNODB_SYS_DATAFILES order by SPACE desc ;
+-------+---------------------------------------------------+
| SPACE | PATH |
+-------+---------------------------------------------------+
| 154 | ./test/sbtest2.ibd |
| 152 | ./test/#sql-ib161-1555929536.ibd |
| 146 | ./test/sbtest1.ibd |
| 141 | ./test/user.ibd |
重组表的时候,SPACE 会变