zoukankan      html  css  js  c++  java
  • mysql InnoDB通过.frm和.ibd恢复表和数据

    ibdata1是一个用来构建innodb系统表空间的文件,这个文件包含了innodb表的元数据、撤销记录、修改buffer和双写buffer。如果file-per-table选项打开的话,该文件则不一定包含所有表的数据。当innodb_file_per_table选项打开的话,新创建表的数据和索引则不会存在系统表空间中,而是存放
    在各自表的.ibd文件中. 显然这个文件会越来越大,innodb_autoextend_increment选项则指定了该文件每次自动增长的步进,默认是8M. ibdata1存放数据,索引和缓存等,是MYSQL的最主要的数据。所以随着数据库越来越大,表也会越大,这个无法避免的。如果时间长了,越来越大,我们在处理日志和空间的时候就不是那么方便了,就不知从何入手了。接下来我们就要处理下这样的情况,分库存储数据。当ibdata1文件损坏或者丢失后,查询数据库表的时候,会报错表不存在
    1. 恢复表结构
       创建一个新数据库test,然后创建一个和需要恢复的表的引擎相同的同名表(即引擎为InnoDB的t_user表,其结构无所谓,可以只有一个字段),如下:
      create table t_user(id int(10)) engine=InnoDB;

    以上,我在新建的test数据库中创建了一个引擎为InnoDB的只有一个字段id的t_user表
    2.使用systemctl stop mysql关闭数据库服务,然后用需要恢复的t_user.frm覆盖这个新建的test数据库的t_user表的物理文件t_user.frm,接着对配置文件(my.ini)设置innodb_force_recovery = 6,然后使用systemctl start mysql启动服务,并在控制台进入test库中,使用
    desc t_user查看该表结构,如下:表不存在

    3.  此时,我们查看/var/log/下的log文件,可以看到如下:
        Innodb: table test/t_user contains 1 user defined columns in Innodb,but 6 columns in Mysql.
      以上,应该是说test下t_user只定义了一列,但MySQL中有6列
    4. 使用systemctl stop mysql停掉服务,然后在配置文件my.ini中将innodb_force_recovery = 6注释掉(#或;均可),再systemctl start mysql启动服务。接着,将test下t_user表删掉(drop掉),再新建一个6列字段的t_user表,如下:字段随意
     create table t_user(id int(10),id1 int(10),id2 int(10),id3 int(10),id4 int(10),id5 int(10),id6 int(10)) engine=InnoDB;
    5. 继续重复②中的操作,使用desc t_user即可获取到t_user的表结构(使用mysqldump导出即可)
    
    6. 用t_user.ibd文件恢复t_user表的数据
        停掉数据库服务,将innodb_force_recovery = 6注释掉,然后启动数据库服务(若启动中出现1067错误,可以尝试删除data文件夹下ibdata1、ib_logfile0、ib_logfile1即可)并删除test下t_user表,并使用新导出的表结构创建t_user表.
        由于.ibd文件含有tablespace id,因此我们将需要恢复数据的t_user.ibd的tablespace id改为新创建的t_user.ibd的tablespace id,如下:使用了hexedit  #yum install hexedit
        需要恢复数据的t_user.id的tablespace id:图1
        新创建的t_user.ibd的tablespace id:图2
    

                  

    7. 修改后的带数据的t_user.ibd如下:     #hexedit  文件名---crtl+x保存,crtl+c退出
    

    8. 停掉数据库服务,使用修改tablespace id的t_user.ibd文件覆盖test库下的t_user.ibd文件,并且将配置文件中innodb_force_recovery = 6去掉注释,进入mytest库内,使用select * from t_user查看数据
    
    9. 使用mysqldump导出表结构和数据即可,注意:最好重新配置一个空的MySQL来进行恢复操作,这样不会影响到MySQL下别的数据库,本例中使用的是MySQL 5.6.26版。
  • 相关阅读:
    利用dockerfile定制镜像
    发布Docker 镜像到dockerhub
    Docker 停止容器
    133. Clone Graph
    132. Palindrome Partitioning II
    131. Palindrome Partitioning
    130. Surrounded Regions
    129. Sum Root to Leaf Numbers
    128. Longest Consecutive Sequence
    127. Word Ladder
  • 原文地址:https://www.cnblogs.com/The-day-of-the-wind/p/10656292.html
Copyright © 2011-2022 走看看