MySQL:如何从ibd文件中恢复数据

在使用独立表空间的情况下,如果不慎使得innodb存储引擎的元数据文件ibdata损坏,我们还可以挽救宝贵的数据.因为在innodb使用独立表空间的情况下,ibdata文件会记录每个innodb表的id,只要使得ibd中的表id和ibdata文件中记录的表id相同,就能够打开表,读取到数据.

#创建表

CREATETABLE`ibdtest`(
`id`int(11)NOTNULLAUTO_INCREMENT,
`fid`int(11)NOTNULLCOMMENT'表b中的id',
`content`char(255)NOTNULLCOMMENT'操作内容,系统生成',
`mark`char(255)NOTNULLCOMMENT'备注',
PRIMARYKEY(`id`)
)ENGINE=InnoDBDEFAULTCHARSET=utf8


#添加数据
INSERTibdtest(fid,content,mark)VALUES(1,'1','1'),(2,'2','2');

SELECT*FROMibdtest;

关闭mysql将ibdtest.ibd copy出来,放到其他数据库中来模拟灾难.


[root@localhost ~]#/opt/soft/mysql/bin/mysqladmin -p123456 shutdown

120130 18:31:50 mysqld_safe mysqld from pidfile /opt/soft/mysql/60137.localdomain.pid ended

[1]+Done /opt/soft/mysql/bin/mysqld_safe--defaults-file=/opt/soft/mysql/config/my.cnf --user=mysql

[root@localhost~]#cd/home/soft/mysql/data/test/
[root@localhosttest]#ll
total1296
-rw-rw----.1mysqlmysql8612Jan1800:06a.frm
-rw-rw----.1mysqlmysql98304Jan1800:24a.ibd
-rw-rw----.1mysqlmysql8624Jan3008:34area.frm
-rw-rw----.1mysqlmysql98304Jan3008:36area.ibd
-rw-rw----.1mysqlmysql8642Jan1800:05b.frm
-rw-rw----.1mysqlmysql98304Jan1800:08b.ibd
-rw-rw----.1mysqlmysql8693Jan3018:27ibdtest.frm
-rw-rw----.1mysqlmysql98304Jan3018:28ibdtest.ibd
-rw-rw----.1mysqlmysql8728Jan616:23testa.frm
-rw-rw----.1mysqlmysql98304Jan1004:10testa.ibd
-rw-rw----.1mysqlmysql8693Jan3014:30testmc.frm
-rw-rw----.1mysqlmysql98304Jan3014:30testmc.ibd
-rw-rw----.1mysqlmysql8693Jan3013:54testme.frm
-rw-rw----.1mysqlmysql98304Jan3013:55testme.ibd
-rw-rw----.1mysqlmysql8693Jan3014:40testmm.frm
-rw-rw----.1mysqlmysql98304Jan3014:45testmm.ibd
-rw-rw----.1mysqlmysql8693Jan3013:40testmu.frm
-rw-rw----.1mysqlmysql98304Jan3013:40testmu.ibd
-rw-rw----.1mysqlmysql8693Jan3011:08testmv.frm
-rw-rw----.1mysqlmysql98304Jan3011:10testmv.ibd
-rw-rw----.1mysqlmysql8694Jan421:55testuser.frm
-rw-rw----.1mysqlmysql98304Jan422:04testuser.ibd
-rw-rw----.1mysqlmysql8644Jan1421:55user.frm
-rw-rw----.1mysqlmysql98304Jan1421:55user.ibd
[root@localhosttest]#cpibdtest.ibd/home/download/
[root@localhosttest]#cd/home/download/

#vim打开ibd,使用16进制查看
[root@localhostdownload]#vim-bibdtest.ibd
:%!xxd

从下图中能看到 此表在 当前mysql数据库中的id为0x10,即16.


此时,我们假设灾难发生,ibdata损坏…

只剩下了ibdtest.ibd文,我们跳转到另一个mysql服务器上,用同样的建表语句创建ibdtest表.


这时我们打开这个mysql服务器下的ibdtest.ibd看看:

这个表的id为0x16,即为22,那么,我们只需将原有的ibdtest.ibd表id修改为0x16即可.


退出保存的时候一定要记得使用:%!xxd-r

退出保存.

并将修改好的文件覆盖掉新的ibdtest.ibd即可,


此mysql服务器会认为该表损毁,无法打开,没关系,修改innodb_force_recovery = 6,

重启mysql服务:

Select下,就知道数据是否恢复了没有:


此时,无法执行写操作,应尽快将数据dump出来,修改innodb_force_recovery = 0,重启服务,创建新表后,把数据倒回去就ok了.恢复数据就不演示了.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值