中易网

如何从ibd文件中恢复数据

答案:2  悬赏:0  
解决时间 2021-02-10 12:14
如何从ibd文件中恢复数据
最佳答案
在使用独立表空间的情况下,如果不慎使得innodb存储引擎的元数据文件ibdata损坏,我们还可以挽救宝贵的数据f --user=mysql
[root@localhost ~]# cd /home/soft/mysql/data/test/
[root@localhost test]# ll
total 1296
-rw-rw----. 1 mysql mysql 8612 Jan 18 00:06 a.frm
-rw-rw----. 1 mysql mysql 98304 Jan 18 00:24 a.ibd
-rw-rw----. 1 mysql mysql 8624 Jan 30 08:34 area.frm
-rw-rw----. 1 mysql mysql 98304 Jan 30 08:36 area.ibd
-rw-rw----. 1 mysql mysql 8642 Jan 18 00:05 b.frm
-rw-rw----. 1 mysql mysql 98304 Jan 18 00:08 b.ibd
-rw-rw----. 1 mysql mysql 8693 Jan 30 18:27 ibdtest.frm
-rw-rw----. 1 mysql mysql 98304 Jan 30 18:28 ibdtest.ibd
-rw-rw----. 1 mysql mysql 8728 Jan 6 16:23 testa.frm
-rw-rw----. 1 mysql mysql 98304 Jan 10 04:10 testa.ibd
-rw-rw----. 1 mysql mysql 8693 Jan 30 14:30 testmc.frm
-rw-rw----. 1 mysql mysql 98304 Jan 30 14:30 testmc.ibd
-rw-rw----. 1 mysql mysql 8693 Jan 30 13:54 testme.frm
-rw-rw----. 1 mysql mysql 98304 Jan 30 13:55 testme.ibd
-rw-rw----. 1 mysql mysql 8693 Jan 30 14:40 testmm.frm
-rw-rw----. 1 mysql mysql 98304 Jan 30 14:45 testmm.ibd
-rw-rw----. 1 mysql mysql 8693 Jan 30 13:40 testmu.frm
-rw-rw----. 1 mysql mysql 98304 Jan 30 13:40 testmu.ibd
-rw-rw----. 1 mysql mysql 8693 Jan 30 11:08 testmv.frm
-rw-rw----. 1 mysql mysql 98304 Jan 30 11:10 testmv.ibd
-rw-rw----. 1 mysql mysql 8694 Jan 4 21:55 testuser.frm
-rw-rw----. 1 mysql mysql 98304 Jan 4 22:04 testuser.ibd
-rw-rw----. 1 mysql mysql 8644 Jan 14 21:55 user.frm
-rw-rw----. 1 mysql mysql 98304 Jan 14 21:55 user.ibd
[root@localhost test]# cp ibdtest.ibd /home/download/
[root@localhost test]# cd /home/download/
#vim打开ibd,使用16进制查看
[root@localhost download]# vim -b ibdtest.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了.恢复数据就不演示了.
全部回答
在使用独立表空间的情况下,如果不慎使得innodb存储引擎的元数据文件ibdata损坏,我们还可以挽救宝贵的数据.因为在innodb使用独立表空间的情况下,ibdata文件会记录每个innodb表的id,只要使得ibd中的表id和ibdata文件中记录的表id相同,就能够打开表,读取到数据. #创建表 create table `ibdtest` (   `id` int(11) not null auto_increment,   `fid` int(11) not null comment '表b中的id',   `content` char(255) not null comment '操作内容,系统生成',   `mark` char(255) not null comment '备注',   primary key (`id`) ) engine=innodb default charset=utf8 #添加数据 insert ibdtest (fid,content,mark) values (1,'1','1'),(2,'2','2'); select * from ibdtest; 关闭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@localhost test]# ll total 1296 -rw-rw----. 1 mysql mysql  8612 jan 18 00:06 a.frm -rw-rw----. 1 mysql mysql 98304 jan 18 00:24 a.ibd -rw-rw----. 1 mysql mysql  8624 jan 30 08:34 area.frm -rw-rw----. 1 mysql mysql 98304 jan 30 08:36 area.ibd -rw-rw----. 1 mysql mysql  8642 jan 18 00:05 b.frm -rw-rw----. 1 mysql mysql 98304 jan 18 00:08 b.ibd -rw-rw----. 1 mysql mysql  8693 jan 30 18:27 ibdtest.frm -rw-rw----. 1 mysql mysql 98304 jan 30 18:28 ibdtest.ibd -rw-rw----. 1 mysql mysql  8728 jan  6 16:23 testa.frm -rw-rw----. 1 mysql mysql 98304 jan 10 04:10 testa.ibd -rw-rw----. 1 mysql mysql  8693 jan 30 14:30 testmc.frm -rw-rw----. 1 mysql mysql 98304 jan 30 14:30 testmc.ibd -rw-rw----. 1 mysql mysql  8693 jan 30 13:54 testme.frm -rw-rw----. 1 mysql mysql 98304 jan 30 13:55 testme.ibd -rw-rw----. 1 mysql mysql  8693 jan 30 14:40 testmm.frm -rw-rw----. 1 mysql mysql 98304 jan 30 14:45 testmm.ibd -rw-rw----. 1 mysql mysql  8693 jan 30 13:40 testmu.frm -rw-rw----. 1 mysql mysql 98304 jan 30 13:40 testmu.ibd -rw-rw----. 1 mysql mysql  8693 jan 30 11:08 testmv.frm -rw-rw----. 1 mysql mysql 98304 jan 30 11:10 testmv.ibd -rw-rw----. 1 mysql mysql  8694 jan  4 21:55 testuser.frm -rw-rw----. 1 mysql mysql 98304 jan  4 22:04 testuser.ibd -rw-rw----. 1 mysql mysql  8644 jan 14 21:55 user.frm -rw-rw----. 1 mysql mysql 98304 jan 14 21:55 user.ibd [root@localhost test]# cp ibdtest.ibd /home/download/ [root@localhost test]# cd /home/download/ #vim打开ibd,使用16进制查看 [root@localhost download]# vim -b ibdtest.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了.恢复数据就不演示了.
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
长头发的妹子们你们蹲厕所的时候不觉得头发很
上海市黄浦区社会保险事业管理中心电话
海绵为什么吸声?
自由组合套餐是什么意思
有本小说主角武器叫天魔枯刃
国网甘肃电力公司2015年第二批校园招聘笔试通
先知道苹果手机下载什么软件可以记录运动的那
别克君威GS 运动 标准 舒适 三种模式都是什么
有人找网上办过个体工商户营业执照吗,我找人
帕戈郎鸡肉系列专营店吉木萨尔县总经销在哪里
6年内新车审验时需要上检测线为什么
要是把INTERNET的安全和隐私的级别调到最高会
上虞明星电子照明有限公司在哪里啊,我有事要
有关形容包青天的诗句
请问一下本田思域原厂机油格能用多久?
推荐资讯
为什么DNF启动以后游戏窗口自动关闭?跪求!
水瓶座会因为爱一个人可是觉得没将来没结果而
Tom汤姆王子地址在哪,我要去那里办事
我用搜狗打3的5次方能正常显示为3吗
250克兑350倍是多少水?
天猫看中一台德国美诺的洗衣机,值得入手吗?
平安保险的险种,年缴4000元,交10年,后返8
l列车1461有空调吗
工商银行中的其他贷款利息是多少
多了话费为什么没有短信提醒?
想要一句描写无法离开一个人,难以割舍的古诗
上岛咖啡辽阳店地址在哪,我要去那里办事
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?