如何从ibd文件中恢复数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从ibd文件中恢复数据相关的知识,希望对你有一定的参考价值。

    创建已经丢失的表结构

    先要安装 mysql-utilities。

    // RedHatyum -y install mysql-server mysql-utilities// Debianapt install mysql-utilities

    使用 mysqlfrm 从 .frm 文件里面找回建表语句。

    // 分析一个 .frm 文件生成建表的语句mysqlfrm --diagnostic /var/lib/mysql/test/t1.frm// 分析一个目录下的全部.frm文件生成建表语句root@username:~# mysqlfrm --diagnostic /var/lib/mysql/my_db/bk/ >createtb.sqlroot@username:~# grep "^CREATE TABLE" createtb.sql |wc -l124

    可以看到一共生成了 124 个建表语句。

    有很多时候也可以从其它库里面生成建表语句,如同一个应用的其它数据库或不同的测试环境,采用下面的 mysqldump 生成建表语句:

    mysqldump --no-data --compact my_db>createtb.sql

    登录 MySQL 生成表。

    mysql> create database my_db;mysql> use my_dbDatabase changedmysql> source createtb.sqlQuery OK, 0 rows affected (0.07 sec)......

    导入旧的数据文件

    将新建的没有包括数据的 .ibd 文件抛弃

    root@username:/var/lib/mysql/my_db# ll *.ibd|wc12411167941root@username:/var/lib/mysql/my_db# mysql -e "show tables from my_db" \\| grep -v  Tables_in_my_db  \\| while read a; do mysql -e "ALTER TABLE my_db.$a DISCARD TABLESPACE"; doneroot@username:/var/lib/mysql/my_db# ll *.ibd|wcls: cannot access '*.ibd': No such file or directory000

    可以看到所有的 .idb 文件都已经被抛弃了。然后把旧的有数据的 .ibd 文件拷贝到这个 my_db 目录下面,别忘了把属主改过来:chown mysql. *,再把这些数据文件 import 到数据库中。

    root@username:/var/lib/mysql/my_db# mysql -e "show tables from my_db" \\| grep -v  Tables_in_my_db  \\| while read a; \\do mysql -e "ALTER TABLE my_db.$a import TABLESPACE"; done

    导入完成后检查表

    使用 mysqlcheck 对数据库 my_db 下的所有表进行检查:

    root@username:/var/lib/mysql/my_db# mysqlcheck -c my_dbmy_db.cdp_backup_point                             OK......

    所有的表都导入成功。

参考技术A 在使用独立表空间的情况下,如果不慎使得innodb存储引擎的元数据文件ibdata损坏,我们还可以挽救宝贵的数据f --user=mysql [root@localhost ~]# cd /home/soft/mysql/data/test/[root@localhost test]# lltotal 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了.恢复数据就不演示了.

从 ibd 文件恢复数据数据库不起作用

【中文标题】从 ibd 文件恢复数据数据库不起作用【英文标题】:Restore data database from ibd file not working 【发布时间】:2017-06-18 23:57:03 【问题描述】:

Mysql 5.5 InnoDB 坏了。我只有带有 .frm 和 ibd 文件的文件夹 mysql。

我在https://dba.stackexchange.com/questions/71596/restoring-mysql-tables-from-ibd-frm-and-mysqllogbin-files 找到了答案。在我升级 Mysql 5.6 并在http://www.chriscalender.com/tag/innodb-error-tablespace-id-in-file/ 使用 Method #2 的教程后,但表 wp_posts in database wordpress 上的任何数据都不正确。当我 ALTER TABLE wp_posts IMPORT TABLESPACE 时,它会中断 mysql(丢失连接)。我无法恢复它。请帮帮我。

这是我修复后的一条记录(数据在列之间杂乱无章):

************************* 1. row *************************
                   ID: 2
          post_author: 1
            post_date: 0000-00-09 05:24:20
        post_date_gmt: 9272-08-30 08:00:00
         post_content: V??<<iframe style="width: 100%;" src="https://docs.google.com/forms/d/e/1FAIpQLSe1mpUtq1EYSoLzsVJL_gAv8KCR023wO7uyxU0Tgps1UhHjjg/viewform?embedded=true"   frameborder="0" margin margin>Đang tải...</i
           post_title: frame>Đăng ký tư
         post_excerpt: 
          post_status:  vấnp
       comment_status: ublish
          ping_status: clos
        post_password: 
            post_name: edopendang-ki-
              to_ping: 
               pinged: 
        post_modified: 0909-02-09 08:38:31
    post_modified_gmt: 1378-05-31 30:54:42
post_content_filtered: 
          post_parent: 1922960506717475414
                 guid: ???        http://duhocvaxuatkhau.co
           menu_order: -315670672
            post_type: age_
       post_mime_type: 
        comment_count: -1629109878096134144
1 row in set (0.00 sec)

【问题讨论】:

mysqld.err 中有什么? @RickJames 我只有文件夹 mysql 文件夹。它没有文件 mysqld.err。之前查看mysql错误日志,提示“InnoDB is crash”,无法启动mysql。 【参考方案1】:

更新: 建议先阅读这篇文章。 https://dba.stackexchange.com/questions/288860/restoring-mysql-data-from-ibd-file/288861#288861

我今天遇到了同样的问题,经过几次调查终于发现,在调用 IMPORT TABLESPACE 之前,将新文件的所有权更改为 mysql:mysql 非常重要。

所以:

No.1-

ALTER TABLE my_table DISCARD TABLESPACE;

2号-

CP /var/lib/mysql/old_db/my_table.ibd /var/lib/mysql/new_db/my_table.ibd

3号-

sudo chown mysql:mysql /var/lib/mysql/new_db/my_table.ibd

4号-

ALTER TABLE my_table IMPORT TABLESPACE;

它对我有用,我非常高兴:)

【讨论】:

以上是关于如何从ibd文件中恢复数据的主要内容,如果未能解决你的问题,请参考以下文章

从frm和ibd文件恢复表结构

从 ibd 文件恢复数据数据库不起作用

sh 脚本用于从innodb的frm和ibd文件中恢复数据。

如何使用frm和ibd文件恢复mysql数据库

mysql数据库被破坏,只剩下ibd文件时如何恢复

怎样从frm,ibd恢复MYSQL的相关推荐