美文网首页
【翻译】如何从ibdata和.frm文件恢复MySQL表数据

【翻译】如何从ibdata和.frm文件恢复MySQL表数据

作者: frankie_cheung | 来源:发表于2021-01-05 20:59 被阅读0次

    这个教材叫你如何在数据库全部或者部分数据丢失,或者数据库加载数据失败时,如何恢复数据。
    发生这种情况的一个原因是表数据损坏。
    在这种特定情况下,你连接到MySQL服务器,你看不到更多的表,因为它们缺失了。
    在这种情况下,MySQL错误日志包含如下信息:

    InnoDB: Error: log file ./ib_logfile0 is of different size 0 50331648 bytes
    InnoDB: than specified in the .cnf file 0 5242880 bytes!
    [ERROR] Plugin 'InnoDB' init function returned error.
    [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
    [ERROR] Unknown/unsupported storage engine: InnoDB
    [ERROR] Aborting
    

    下面解释的这种方法只可以在innodb引擎才可以使用。
    注意:在你做任何事之前,在当前的数据库条件下,对数据库的全部文件进行一次备份,并且保证它们在其他地方是安全的。
    假如要恢复数据,需要保证数据目录以及它的内容是完整的,在我这个示例中,是完好的。

    drwx------ 2 mysql mysql     4096 Oct 11  2012 performance_schema
    drwx------ 2 mysql mysql     4096 Dec 10  2012 ndbinfo
    drwx--x--x 2 mysql mysql     4096 Dec 10  2012 mysql
    -rw-rw---- 1 mysql mysql       56 Dec 19  2012 auto.cnf
    drwx------ 2 mysql mysql     4096 Jul 30  2013 bugs
    -rw-r----- 1 mysql mysql 50331648 Mar 18 10:35 ib_logfile0
    -rw-r----- 1 mysql mysql 50331648 Apr 22  2013 ib_logfile1
    -rw-r----- 1 mysql mysql 35651584 Mar 18 10:35 ibdata1
    
    • Ibdata1: 这个文件是系统表空间,其中包含了多个innodb表和相关索引
    • *.frm: 持有MySQL表的元数据信息,这个文件位于对应的数据库目录下(在这个 在bugs文件夹下)
    • id_logfiles* : 所有改变的数据都会写入到该文件,这非常类似于其他关系型数据库中的归档日志。
    拷贝文件

    假如使用如上日志文件恢复数据,第一步就是停止MySQL服务
    service mysqld stop
    拷贝ibdata文件和数据库对应库目录下的文件到某一个目录下,我们将利用他们来恢复数据,在这个案例中,我们拷贝到/tmp目录下,在这个案例中,数据库库的名字为bugs.

    cp –r ibdata* ib_logfile* /tmp
    
    cp –r schema_name/  /tmp/schema_name/
    

    启动MySQL
    service mysqld start
    另一方面,一个典型的数据库备份和恢复,你应该使用mysqldump命令。

    恢复数据

    下一步,如下解释恢复表数据
    在我的my.cnf文件中,设置一个参数的值给ib_logfile0 文件,我的案例中我设置48M,当我看这个文件大小时,则可以 ls -lh ib_logfile0
    innodb_log_file_size=48M
    注意logfile0 和logfile1的 大小应该一直
    拷贝前面的ibdata.*到MySQL数据库的data对应目录
    cp –r /tmp/ibdata* /var/lib/mysql/
    在数据目录中创建一个与要还原的数据库架构名称同名的空文件夹,并复制此文件夹中以前的.frm文件,如下所示:
    ··

    cp –r /tmp/ib_logfile* /var/lib/mysql/
    cp –r /tmp/schema_name/*.frm /var/lib/mysql/schema_name/
    

    最后重启MySQL
    service mysqld restart
    现在你将表数据恢复了,并且数据库也运行,不要忘记给连接MySQL的客户端授予适当的权限。
    reference:
    原文:https://www.thegeekstuff.com/2014/04/recover-innodb-mysql/
    单词:
    One of the reason for this to happen is when 导致出现这种情况的原因之一是XXX
    particular :特殊的
    scenario:情形
    corrupted:损坏的
    associated :相关的
    Holds :持有
    corresponding :相应的
    concepts :概念
    On a related note:另一方面
    typical :典型的
    respective :分别的,各自的
    appropriate :适当的

    相关文章

      网友评论

          本文标题:【翻译】如何从ibdata和.frm文件恢复MySQL表数据

          本文链接:https://www.haomeiwen.com/subject/jzgwoktx.html