丢失或损坏的数据教程,存储引擎

 

通过frm&ibd 恢复生机 Mysql ibdata 错过或磨损的数额教程

        偶然候mysql未有办好数据备份,可能被数据管理员误删,只怕ibdata损坏了作者们什么样回复呢?别怕,只要有部分frm、ibd存在,上面便是恢复生机教程。

  mysql存储在磁盘中,各样天灾人祸都会导致数据错过。大集团的时候我们经常要求盘活数据冷热备,对于小商场来讲要做好全体数据备份供给支出大量的工本,相当多商铺也是不现实的。万一还并未有做好备份,数据被误删除了,或然ibdata损坏了如何是好呢?别忧郁,只要有部分的frm、ibd存在就足以过来部分数据。

  注意:

  一、这些是对innodb的数据恢复生机。myisam不要求这么麻烦,只要数据文件存在直接复制过去就足以。

  二、我们的mysql数据库必得是按表贮存数据的,暗中同意不是,不过我们生产鲜明是按分表设置的呢,假设不是,倒霉意思,那些艺术不能够苏醒你的数据。my.ini的装置为

  innodb_file_per_table = 1。

  1、找回表结构,要是表结构未有错过直接到下一步

  a、先创设三个数据库,那些数据库必需是绝非表和任何操作的。

  b、成立三个表结构,和要过来的表名是一模二样的。表里的字段不在意。必定若是innodb引擎的。CREATE TABLE `weibo_qq0`( `weiboid` bigint(20)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  c、关闭mysql, service mysqld stop;

  d、用须要苏醒的frm文件覆盖刚新建的frm文件;

  e、修改my.ini 里 innodb_force_recovery=1 , 要是不成修改为 2,3,4,5,6。

  f、 启动mysql,service mysqld start;show create table weibo_qq0 就会li到表结构消息了。

  2、找回数据。记得上边把 innodb_force_recovery改掉了,供给注释掉,不然苏醒格局倒霉操作。 这里有个重点的标题,就是innodb里的任何数据操作都以贰个日记的记录点。也正是一旦大家要求数据复苏,必需把前边的表的数量的日记记录点增加到均等。

  a、建构叁个数据库,分局方导出的创制表的sql实践创造表。

  b、找到记录点。先要把近来数据库的表空间放任掉,使方今ibd的数据文件和frm分离。 ALTERubicon TABLE weibo_qq0 DISCARD TABLESPACE;

  c、把此前要苏醒的 .ibd文件复制到新的表结构文件夹下。 使当前的ibd 和frm爆发涉及。ALTESportage TABLE weibo_qq0 IMPORT TABLESPACE; 结果不出意外确定会报错。就和大家开展数据带头说的那样,数据记录点不一致样。我们看看前面ibd记录的点在怎么岗位。发轫实践import tablespace,报错 E陆风X8ROEscort 1030 (HY000): Got error -1 from storage engine。找到mysql的荒唐日志,InnoDB: Error: tablespace id in file ‘.testweibo_qq0.ibd’ is 112, but in the InnoDB InnoDB: data dictionary it is 1. 因为 weibo_qq0 此前的记录点在112,当前的表只开创贰遍,所以记录点是1.

  d、那怎么从1笔录到112。for ($1=1; $i<=111; $1 ) {CREATE TABLE t# (id int) ENGINE=InnoDB;} 大概很意外,为啥是循环111,不是112。因为在a实施创造表结构的时候曾经记下扩大了一回。

  e、修改表结构 alter table weibo_qq0 discard tablespace;使当前的表结议和ibd脱离关系。复制.ibd到近来的目录结构。

  f、使原本数据的ibd和当下frm创立关联。 ALTE奥迪Q7 TABLE product IMPORT TABLESPACE; 这一年从不不当,表达已经确立好了。然则查询数据或许查不出来。

  g、比较这里我们早已知晓干什么了,这些情势亦非说改了数据库就能够在生育情况使用。改造innodb_force_recovery=1 , 若是不成修改为 2,3,4,5,6。直到可以查询出多少停止,然后dump出来。数据就备份出来了。

  h、把装有数据导出后,在新的数据库导入。全体数据就生成了。

  扩充难题,非常多时候我们是分表表结构怎么批量操作,进步速度吗。用循环!循环把表的半空中遗弃掉。

  for i in `seq 0 111`; do mysql -uroot -P33061 -h127.0.0.1 -Dtestdd -e “CREATE TABLE inv_crawl_weibo_qq$i (id bigint(20) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id)) ENGINE=innodb “; done

  ALTER TABLE inv_crawl_weibo_qq0 DISCARD TABLESPACE;

  从备份数据把ibd复制cp到dd数据库下,注意复制过来的文件权限。

  循环导入表空间。

  ALTER TABLE inv_crawl_weibo_qq0 IMPORT TABLESPACE;

  未有报错就导入成功了

; 有的时候候mysql未有做好数据备份,只怕被数据管理员误删,或许ibdata损坏了大家什么回复呢?别怕,只要有部分frm、ibd存在,下边就...

[TOC]

 

前一周,从前集团的同事朋友找小编扶助,看看是或不是扶植恢复生机一个MySQL 数据库,具体情形为:数据库版本为MySQL 5.6(具体版本不明了),也不明了具体的数据库引擎; 未有数据库备份,只剩下数据库上面包车型大巴一部分文本(frm、idb),具体原因是因为出现难点的时候,重装了MySQL,最可怜的是ibdata1等公事也绝非了,当然这在这之中细节经过如何,不知晓也不用去纠缠了。大概正是这么三个气象。

InnoDB 存款和储蓄引擎

 InnoDB选择按表空间(tablespace)的不二秘籍开展仓库储存数据, 暗中同意配置景况下会有一个开端大小为10MB, 名为ibdata1的文书, 该公文正是暗许的表空间文件(tablespce file),客商能够透过参数innodb_data_file_path对其开展安装,能够有四个数据文件,若无设置innodb_file_per_table的话, 这几个Innodb存款和储蓄类型的表的数量都位于这一个分享表空间中,而系统变量innodb_file_per_table=1的话,那么InnoDB存款和储蓄引擎类型的表就能够发生一个独立表空间,独立表空间的命名法则为:表名.idb. 这一个单独的表空间文件仅存储该表的数目、索引和插入缓冲BITMAP等音讯,其余消息依旧存放在分享表空间中,那么哪些识别数据库中怎样表是独立表空间,哪些表是分享表空间啊?

 

1. InnoDB的历史

年份 事件 备注
1995 由Heikki Tuuri 创建Innobase Oy公司,并开发InnoDB存储引擎 Innobase开始做的是数据库,希望卖掉该公司
1996 MySQL 1.0 发布
2000 MySQL3.23版本发布
2001 InnoDB存储引擎集成到MySQL数据库 作为插件的方式集成
2006 Innobase被Oracle公司收购(InnoDB作为开源产品,性能和功能很强大) InnoDB在被收购后的,MySQL中的InnoDB版本没有改变
2010 MySQL5.5版本InnoDB存储引擎称为默认存储引擎 MySQL被Sun收购,Oracle被Oracle收购,使得MySQL和InnoDB重新在一起配合开发
至今 其他存储引擎已经不再得到Oracle官方的后续开发

 

 

2. InnoDB的特点

• Fully ACID (InnoDB默认的Repeat Read隔离级别就支持)
• Row-level Locking(支持行锁)
• Multi-version concurrency control(MVCC)(支持多版本并发控制)
• Foreign key support(支持外键)
• Automatic deadlock detection(死锁自动检测)
• High performance、High scalability、High availability(高性能,高扩展,高可用)

 

因为数据库非常的小,将相应的文本拷贝到自个儿一台测试服务器的MySQL数据文件目录下后(下边实验测验,对数据库名等敏感音信做了一晃模糊),如下所示,数据库名字为test,show tables能够观察有关的表。

3. InnoDB囤积引擎的文书

 

 

3.1 概述

InnoDB的公文器重分为多个部分,叁个是表空间文件,一个是重做日志文件

  • 表空间文件
    • 独立表空间文件
    • 大局表空间文件
    • undo表空间文件(from MySQL5.6)
  • 重做日志文件
    • 物理逻辑日志
    • 尚无Oracle的归档重做日志

主意1:通过ibd文件剖断

 

3.2 InnoDB - 表空间

  • 表空间的定义
    • 表空间是八个 逻辑存储 的概念
    • 表空间能够由多个文件组成
    • 支撑裸设备(能够直接行使 O_DIRECT方法绕过缓存,直接写入磁盘)
  • 表空间的归类
    • 系统表空间 (最先唯有系列表空间)
    • 存款和储蓄元数据音信
    • 存储Change Buffer信息
    • 存储Undo信息
    • 居然一开头 所有的表和索引 的消息都是积攒在系统表空间
      • 继之InnoDB对其做了校勘,能够利用独立的表空间
  • 独立表空间
    • innodb-file-per-table=1 (开启协理每一个表二个独自的表空间)
    • 每张顾客表对应三个单身的 ibd文件
    • 分区表能够对应多个ibd文件
  • Undo表空间
    • MySQL5.6版本扶助独立Undo表空间
    • innodb_undo_tablespaces
  • 临时表空间

    • MySQL5.7增加了临时表空间(ibtmp1)
    • innodb_temp_data_file_path

    shell> ll ib # MySQL的datadir目录 -rw-r-----. 1 mysql mysql 22913 Dec 27 23:56 ib_buffer_pool -rw-r-----. 1 mysql mysql 12582912 Jan 3 15:27 ibdata1 # 系统表空间,暗中同意全体音信留存这里 -rw-r-----. 1 mysql mysql 134217728 Jan 3 15:27 ib_logfile0 -rw-r-----. 1 mysql mysql 134217728 Jan 3 15:27 ib_logfile1 -rw-r-----. 1 mysql mysql 12582912 Jan 3 15:27 ibtmp1 # 一时表空间 shell> cd burn_test # 在MySQL的datadir目录下,burn_test是自定义数据库,根据布置,默认为innodb的表 shell> ll test_1 -rw-r-----. 1 mysql mysql 8554 Dec 3 20:14 test_1.frm #test_1表的表结构文件 #mysqlfrm --diagnostic test_1.frm可查看表结构 -rw-r-----. 1 mysql mysql 49152 Dec 3 20:14 test_1.ibd #ibd就是test_1那张表对应的innodb文件 #ibd中蕴藏了目录和数据

  • 同二个表空间(ibdata1) 存储和 独立表空间 存储就 性能 上来讲未有区分;

  • 当须要删除表(drop table)时, 独立的表空间 存款和储蓄能够直接删除文件 ,而 ibdata1 存款和储蓄也只是把 该有的表空间标识为可用 ,所以从进程上看很难说哪个更加快;不过 删除文件 后, ibdata1 占用的 空间不会释放
  • 分区表 会产生 独立 的 ibd文件 ;
  • 独立的表空间 ,八个表对应七个 ibd文件 ,给人的感到更加直观;
  • 单个 ibd文件 直接拷贝到新的数据库中不只怕直接回复:
  • 原因一: 元数据 消息恐怕在 ibdata1
  • 原因二:部分索引文件存在于 Change Buffer 中,近年来要么贮存于 ibdata1文件中

    select * from information_schema.innodb_sys_tablespaces; -- 查看表空间的元数据音信

 

图片 1

3.3 General表空间

法定文书档案

假若,新建一张表,并让该表的存储路径不是暗中认可的/r2/mysqldata 。而是 指定存储的位置 应该怎么着处理?

  • 方法一

    shell> mkdir /GeneralTest shell> chown mysql.mysql /GeneralTest mysql> create table test_ger1 (a int) data directory='/GeneralTest'; Query OK, 0 rows affected (0.15 sec) shell> cd /GeneralTest shell> tree . └── burn_test # dbname └── test_ger1.ibd # 表空间文件 1 directory, 1 file shell> ll test_ger1* # 在datadir 的 burn_test 目录下 -rw-r-----. 1 mysql mysql 8554 Jan 3 16:41 test_ger1.frm -rw-r-----. 1 mysql mysql 36 Jan 3 16:41 test_ger1.isl # 那是链接文件,链接到地点的ibd文件 shell> cat test_ger1.isl # 三个文书文件,内容正是idb文件的门路/GeneralTest/burn_test/test_ger1.ibd

  • 方法二

  • 使用通用表空间
  • 1: 创造一个通用表空间

    mysql> create tablespace ger_space add datafile '/r2/testdir/ger_space.ibd' file_block_size=8192; Query OK, 0 rows affected (0.07 sec)

    -- datafile 钦赐期存款款和储蓄路线后,在datadir下会生出贰个isl文件,该文件的内容为General space的ibd文件的门路-- 如若datafile不钦命路线,则ibd文件暗许存款和储蓄在datadir目录下,且没有须求isl文件了

    mysql> create tablespace ger2_space add datafile 'ger2_space.ibd' file_block_size=8192; Query OK, 0 rows affected (0.06 sec) shell> ll ger* -rw-r-----. 1 mysql mysql 32768 Jan 3 16:51 ger2_space.ibd # 未钦点路径,寄放于datadir目录 -rw-r-----. 1 mysql mysql 26 Jan 3 16:50 ger_space.isl # 钦赐了别样路径,存在isl链接文件

    shell> cat ger_space.isl /r2/testdir/ger_space.ibd # ibd文件真实存在的不二等秘书诀mysql> select from information_schema.innodb_sys_tablespaces where name='ger_space'G; ** 1. row ***

         SPACE: 55
          NAME: ger_space
          FLAG: 2089
    

    FILE_FORMAT: Barracuda

    ROW_FORMAT: Compressed
     PAGE_SIZE: 16384  -- page_size是16k
    

    ZIP_PAGE_SIZE: 8192

    SPACE_TYPE: General  --General类型
    

    FS_BLOCK_SIZE: 4096

     FILE_SIZE: 65536
    

    ALLOCATED_SIZE: 65536 1 row in set (0.00 sec)

  • 2: 创建表

    mysql> create table test_ger2 (a int) tablespace=ger_space; ERROR 1478 (HY000): InnoDB: Tablespace ger_space uses block size 8192 and cannot contain a table with physical page size 16384

    --FILE_BLOCK_SIZE默感到innodb page size的深浅(16kb),当您钦赐三个值时,举个例子8192,意味着你要求利用那么些表空间来囤积压缩表。不然就能够报错:

    mysql> create table test_ger2 (a int) ROW_FORMAT=COMPRESSED tablespace=ger_space; Query OK, 0 rows affected (0.02 sec)

    shell> ll test_ger* # 在/r2/mysqldata/employees目录下 -rw-r-----. 1 mysql mysql 8554 Jan 3 17:09 test_ger2.frm # 唯有四个frm文件 shell> /r2/testdir/ total 52 drwxr-x---. 2 mysql mysql 4096 Jan 3 16:41 burn_test -rw-r-----. 1 mysql mysql 49152 Jan 3 17:09 ger_space.ibd # test_ger2的ibd文件其实存储在ger_space.ibd的通用表空间中 mysql> create table test_ger3 (a int) ROW_FORMAT=COMPRESSED tablespace=ger_space; -- test_ger3 也存放在ger_space.ibd中 Query OK, 0 rows affected (0.09 sec)

  • 透过利用 General Space ,多少个表空间能够对应多张表

  • 当对表举行alter等操作时,依然和原先同样,没有须要额外语法内定表空间地方
  • 可以省略的精通为把多个表的ibd文件合併在同步了

    mysql> create tablespace ger3_space add datafile '/r2/testdir/ger3_space.ibd' file_block_size=4096; -- 创立4K轻重缓急的General Space也是足以的 Query OK, 0 rows affected (0.06 sec) -- 然而注意,借使设置了innodb_page_size,且大小不是file_block_size,那么在创造表的时候会报错

    mysql> create table test_ger (a int) tablespace=ger3_space; ERROR 1478 (HY000): InnoDB: Tablespace ger3_space uses block size 4096 and cannot contain a table with physical page size 8192

    • 既是不能成立表,那应该在创设general space时就应当报错啊?
    • 持续涉及压缩表时能够行使
    • 这里的 file_block_size 就是 page_size
    • 注意:需要考虑在使用General Space后,备份工具是否能够支持

 

 

3.4 Undo表空间文件

  • innodb_undo_tablespaces = 3
  • 创建3个undo表空间

    shell> ll undo*
    -rw-r -----. 1 mysql mysql 7340032 Jan 3 17:21 undo001 -rw-r -----. 1 mysql mysql 7340032 Jan 3 17:40 undo002 -rw-r -----. 1 mysql mysql 7340032 Jan 3 17:21 undo003

假定表的囤积引擎是InnoDB,况兼表空间(tablespace)是分享表空间的话,那么数据库对应目录上面是一向不"表名.ibd"文件的。独立表空间的表的话,则有"表名.ibd"文件。只是这几个方法很笨,对于生产条件,多量的表经过这种方法决断,确实不是三个好方法。

 

3.5 重做日志文件

  • innodb_log_file_size
  • 该文件设置的尽量的大 ,模板中付出的尺寸是 4G
  • 设置太小莫不会导致脏页刷新 时hang住

    [root@localhost-m(252) /r2/mysqldata]# ll ib_logfile* -rw-r----- 1 mysql mysql 2147483648 1月 4 11:32 ib_logfile0 -rw-r----- 1 mysql mysql 2147483648 1月 4 11:32 ib_logfile1

 

其间有几张表的积累引擎为MyISAM,那么这么些表的数额是全然能够还原的,可是好些个分表的仓库储存引擎为InnoDB,访谈表或查看表都会提示“ERAV4ROTiguan1146 (42S02): Table 'xxxx' doesn't exist 官样文章。

mysql> show variables like 'innodb_file_per_table';

 ----------------------- ------- 

| Variable_name         | Value |

 ----------------------- ------- 

| innodb_file_per_table | ON    |

 ----------------------- ------- 

1 row in set (0.01 sec)

 

mysql> use MyDB;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

 

Database changed

mysql> create table Independent_tablespace(name  varchar(64));

Query OK, 0 rows affected (0.03 sec)

 

mysql> exit

 

[root@DB-Server ~]# cd /data/mysql/MyDB/

[root@DB-Server MyDB]# ls -lrt Independent_tablespace*

-rw-rw---- 1 mysql mysql  8560 Aug 21 22:05 Independent_tablespace.frm

-rw-rw---- 1 mysql mysql 98304 Aug 21 22:05 Independent_tablespace.ibd

[root@DB-Server MyDB]# 

 

 

mysql> desc think_cache;

ERROR 1146 (42S02): Table 'test.think_cache' doesn't exist

mysql> show create table think_cache;

ERROR 1146 (42S02): Table 'test.think_cache' doesn't exist

mysql> 

在配置文件my.cnf里面安装innodb_file_per_table=0,重启MySQL服务,创建表common_tablespace,你会在数量目录看到独有common_tablespace.frm文件。

 

 

出于分享表空间的ibdata1数据文件空中楼阁了,加之有未有备份,所以笔者武断的判定这几个数据库真的不只怕复苏了,但是随后一天,这些心上人跟自家说找了一家数据复苏集团将这一个数据库恢复生机了。 听到那几个音信颇具一点学艺不精的两难(其实谈不上进退两难呢,本来还在读书MySQL的中途,有个别知识点不精晓也很健康。经验是内需稳步储存的),不过更多的是感叹外人是怎样回复数据的,既然人家能够东山复起,那么友好下叁回遭逢这种景况也要能消除。下边就来复局一下人家是什么回复数据的(其实纵然稍稍做点功课,发掘那一个实际上挺轻巧的)

mysql> show variables like 'innodb_file_per_table';

 ----------------------- ------- 

| Variable_name         | Value |

 ----------------------- ------- 

| innodb_file_per_table | OFF   |

 ----------------------- ------- 

1 row in set (0.00 sec)

 

mysql> use MyDB;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

 

Database changed

mysql> create table common_tablespace(name varchar(64));

Query OK, 0 rows affected (0.02 sec)

 

mysql> exit

Bye

[root@DB-Server MyDB]# ls -lrt common_tablespace*

-rw-rw---- 1 mysql mysql 8560 Aug 21 22:08 common_tablespace.frm

[root@DB-Server MyDB]# 

 

 

首先,我们来打听一下MySQL 表空间数据文件idbdat1文件有关概念和知识点:

 

 

方法2:使用INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES来判别。

    InnoDB选取按表空间(tablespace)的法子举行仓库储存数据, 暗许配置情形下会有多个起初大小为10MB, 名称为ibdata1的文件, 该公文即是暗中认可的表空间文件(tablespce file),客户可以透过参数innodb_data_file_path对其开展安装,能够有八个数据文件,若无设置innodb_file_per_table的话, 那三个Innodb存款和储蓄类型的表的多寡都位居那几个分享表空间中,而系统变量innodb_file_per_table=1的话,那么InnoDB存款和储蓄引擎类型的表就能够产生几个独立表空间,独立表空间的命名准则为:表名.idb. 那些单独的表空间文件仅存款和储蓄该表的数据、索引和插入缓冲BITMAP等新闻,其余音讯可能存放在分享表空间中。

 

 

 

    其实那时候最主借使对那些定义有一点点模糊了,感觉那些种类变量innodb_file_per_table默许是关门的,数据都会储存在分享表空间中,那么那些文件删除了,数据就无法复苏。所以武断的下定论,其实从MySQL 5.6.6开端, 系统变量innodb_file_per_table暗许是启用的。只要再多领悟一些只怕说更加深刻精晓一些以来,情形就能立刻就能够反转。也正是说假如打开了独立表空间,可从ibd文件中还原数据。尽管共享表空间的数据文件idbdata1遗失也没什么,反之,设若未张开独立表空间时,idbdat1被删除了,数据也会被删除,只好从备份中还原,真的没有别的措施。

MySQL 5.6

 

 

 

MySQL 5.6 INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES 关于那几个系统表提供了关于表格的格式和积攒天性,包涵行格式,压缩页面大小位品级的音讯(如适用),INNODB的表空间音讯。

那么我们接下去看看,如何从idb文件中还原数据吧,我们须要动用mysqlfrm工具, 要求设置MySQL Utilities,下边是设置MySQL Utilities 1.5.5

 

 

The INNODB_SYS_TABLESPACES table provides metadata about InnoDB tablespaces, equivalent to the information in the SYS_TABLESPACES table in the InnoDB data dictionary.

# tar -xvf mysql-utilities-1.5.5.tar.gz

 

# cd mysql-utilities-1.5.5

   花了点时间通晓了一下INFORMATION_SCHEMA数据库上边包车型客车INNODB_SYS_TABLESPACES这么些表,遂写了三个SQL来推断那多少个InnoDB引擎表是单独表空依旧分享表空间

# python ./setup.py build

 

# python ./setup.py install

共享表空间:

 

 

 

 

SELECT TABLE_SCHEMA

    ,TABLE_NAME

    ,TABLE_TYPE

    ,N'共享表空间' AS TABLE_SPACE

    ,ENGINE

    ,VERSION

    ,TABLE_ROWS

    ,AVG_ROW_LENGTH

    ,CREATE_TIME

    ,UPDATE_TIME

FROM INFORMATION_SCHEMA.TABLES  T

LEFT JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES I ON  CONCAT(T.TABLE_SCHEMA, '/',T.TABLE_NAME)=I.NAME

WHERE I.NAME IS NULL  AND T.TABLE_SCHEMA='MyDB' AND T.ENGINE='InnoDB';

领到frm文件的表结构新闻

 

 

图片 2

mysqlfrm 是贰个重操旧业性质的工具,用来读取.frm文件并从该文件中找到表定义数据生成CREATE语句。此处不对mysqlfrm工具做过多介绍,我们利用msqlfrm来生成该数据库的表的CREATE语句

 

 

而是那么些本子有个一点都不大bug,对于饱含特殊字符的表名,有希望出现错误意况,那么些是因为只要表名满含特殊字符,那么文件名或INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES中的NAME做了转义管理,如下所示

[root@DB-Server ~]# service mysql stop

Shutting down MySQL.... SUCCESS! 

[root@DB-Server ~]# /usr/local/bin/mysqlfrm --basedir=/usr --port=3306 --user=root /data/mysql/test/ > test_frm.sql

[root@DB-Server ~]# 

 

 

图片 3

反省导出的SQL语句,发掘都是“E巴博斯 SLS级ROEvoque: The server version for this file is too low. It requires a server version 5.6.29 or higher but your server is version 5.6.20. Try using a newer server or use diagnostic mode”那类错误:

 

 

独立表空间

[root@DB-Server ~]# more test_frm.sql 

# Spawning server with --user=root.

# Starting the spawned server on port 3306 ... done.

# Reading .frm files

#

# Reading the think_cache.frm file.

ERROR: The server version for this file is too low. It requires a server version 5.6.29 or higher but your server is version 5.6.20. Try using a newer server or use diagnostic mode.

#

# Reading the think_session.frm file.

ERROR: The server version for this file is too low. It requires a server version 5.6.29 or higher but your server is version 5.6.20. Try using a newer server or use diagnostic mode.

#

# Reading the wx_activity_config.frm file.

ERROR: The server version for this file is too low. It requires a server version 5.6.29 or higher but your server is version 5.6.20. Try using a newer server or use diagnostic mode.

#

........................................................................................

 

 

 

SELECT TABLE_SCHEMA

    ,TABLE_NAME

    ,TABLE_TYPE

    ,N'独立表空间' AS TABLE_SPACE

    ,ENGINE

    ,VERSION

    ,TABLE_ROWS

    ,AVG_ROW_LENGTH

    ,CREATE_TIME

    ,UPDATE_TIME

FROM INFORMATION_SCHEMA.TABLES  T

INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES I ON  CONCAT(T.TABLE_SCHEMA, '/',T.TABLE_NAME)=I.NAME

WHERE T.TABLE_SCHEMA='MyDB'  AND T.ENGINE='InnoDB';

从当中能够看出这几个数据库在此之前的本子为MySQL为5.6.29,而自己这里的MySQL版本比那几个低(MySQL 5.6.20)。所以必得找贰个跟那一个本子同样或高的MySQL数据库操作才行。于是在别的一台测验服务器安装了MySQL

 

 

图片 4

[root@gettestlnx02 ~]# service mysqld stop

 

Stopping mysqld:  [  OK  ]

 

[root@gettestlnx02 tmp]# mv test  /data/mysqldata/mysql/test

 

[root@gettestlnx02 tmp]# cd /data/mysqldata/mysql/

 

 

 

/usr/bin/mysqlfrm --basedir=/usr --port=3306 --user=root /data/mysqldata/mysql/test/ > test_frm.sql

方法3 :INFORMATION_SCHEMA.INNODB_SYS_TABLES判别

 

 

怎样要翻开输出消息,能够选择参数-vvv

 

 

MySQL 5.7

/usr/bin/mysqlfrm --basedir=/usr --port=3306 --user=root -vvv /data/mysqldata/mysql/test/ > test_frm.sql

 

 

     借使是MySQL 5.7的话, 比MySQL 5.6有多了一种格局,MySQL 5.7 的INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES中多了SPACE_TYPE字段,不过其值全部为Single,而INFORMATION_SCHEMA.INNODB_SYS_TABLES中也多了字段SPACE_TYPE, 其值有Single与System 分别代表单独表空间和共享表空间。

图片 5

 

 

 

改造的SQL脚本没有以分行结尾,本来想用sed命令给那个CREATE TABLE脚本加上分号结尾,然而开掘里面大量CREATE TABLE的脚本结尾未有规律,都以以COMMNET='xxxxx'结尾,只好手工业增添分号(如下所示)

#独立表空间

 

 

 

SELECT * FROM  INFORMATION_SCHEMA.INNODB_SYS_TABLES

WHERE SPACE_TYPE='Single';

 

 

 

SELECT TABLE_SCHEMA

    ,TABLE_NAME

    ,TABLE_TYPE

    ,N'独立表空间' AS TABLE_SPACE

    ,ENGINE

    ,VERSION

    ,TABLE_ROWS

    ,AVG_ROW_LENGTH

    ,CREATE_TIME

    ,UPDATE_TIME

FROM INFORMATION_SCHEMA.TABLES  T

INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES I ON  CONCAT(T.TABLE_SCHEMA, '/',T.TABLE_NAME)=I.NAME

WHERE T.TABLE_SCHEMA='YourDatabase'  AND T.ENGINE='InnoDB';

图片 6

 

 

#分享表空间

 

 

导入frm文件的表结构消息

SELECT * FROM  INFORMATION_SCHEMA.INNODB_SYS_TABLES

WHERE SPACE_TYPE='System';

 

 

   

SELECT TABLE_SCHEMA

    ,TABLE_NAME

    ,TABLE_TYPE

    ,N'共享表空间' AS TABLE_SPACE

    ,ENGINE

    ,VERSION

    ,TABLE_ROWS

    ,AVG_ROW_LENGTH

    ,CREATE_TIME

    ,UPDATE_TIME

FROM INFORMATION_SCHEMA.TABLES  T

LEFT JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES I ON  CONCAT(T.TABLE_SCHEMA, '/',T.TABLE_NAME)=I.NAME

WHERE I.NAME IS NULL  AND T.TABLE_SCHEMA='YourDatabase' AND T.ENGINE='InnoDB'

 

 

mysql> use test;

Database changed

mysql> source test_frm.sql

Query OK, 0 rows affected (0.02 sec)

 

Query OK, 0 rows affected (0.01 sec)

 

Query OK, 0 rows affected (0.01 sec)

 

Query OK, 0 rows affected (0.00 sec)

.................................

 

 

 

然后大家检查那么些数据库的各式文件frm、ibd、MYI、MYD文件数量,后续做相比验证用途。

 

 

方法4: INFORMATION_SCHEMA.INNODB_TABLES判别

[root@gettestlnx02 test]# ls -lrt *.frm | wc -l

 

84

 

[root@gettestlnx02 test]# ls -lrt *.ibd | wc -l  

MySQL 8.0

84

 

[root@gettestlnx02 test]# ls -lrt *.MYI | wc -l     

设要是MySLQ 8.0的话,还多了一种艺术, 那正是透过INFORMATION_SCHEMA.INNODB_TABLES来剖断,那个新添的系统表能够透过SPACE_TYPE字段来分别分享表空间与独立表空间

22

 

[root@gettestlnx02 test]# ls -lrt *.MYD | wc -l 

SELECT * FROM  INFORMATION_SCHEMA.INNODB_TABLES WHERE SPACE_TYPE=’Single’;

22

 

[root@gettestlnx02 test]#

 

 

 

 

参照他事他说加以考察资料

去除新建表的独立表空间文件

 

 

利用下边脚本生成删除新建表的独自空间的本子:

 

select concat(concat('alter table ',table_name), ' discard tablespace;')                                                  

from information_schema.tables                               

where table_schema='test' and engine ='InnoDB';

 

行使脚本就能够调换上面SQL,推行该命令后,对应数据库上面包车型地铁ibd文件全部被删去。

 

alter table think_cache discard tablespace;      

alter table think_session discard tablespace;    

alter table wx_activity_config discard tablespace;

........................................

 

 

 

复制待恢复生机的表空间文件

 

将待恢复生机的ibd文件拷贝到对应数据库目录上面,并设置好权力属性

 

# cd /tmp/database

# ls -lrt *.ibd | wc -l

84

# cp *.ibd /var/lib/mysql/test

 

# chown  mysql:mysql *.ibd

# chmod 660 *.ibd

 

 

导入表空间

mysql> alter table think_cache import tablespace;

Query OK, 0 rows affected, 1 warning (0.21 sec)

 

mysql> alter table think_session import tablespace;

Query OK, 0 rows affected, 1 warning (0.18 sec)

 

mysql> select count(*) from think_cache;

 ---------- 

| count(*) |

 ---------- 

|    10919 |

 ---------- 

1 row in set (0.01 sec)

 

mysql> select * from think_cache limit 5;

 --------------------------------------- ------------ ---------------------------------------- --------- 

| cachekey                              | expire     | data                                   | datacrc |

 --------------------------------------- ------------ ---------------------------------------- --------- 

| 00OLH9JvIwX42R3mPygXYN3gWZp2rH_rebate | 1533050257 | s:30:"00OLH9JvIwX42R3mPygXYN3gWZp2rH"; |         |

| 00SCWX7cIgqnnzHRArAXoascr1gnlA_rebate | 1516937278 | s:30:"00SCWX7cIgqnnzHRArAXoascr1gnlA"; |         |

| 00uVkAbOMPGQc2z02PPxVMblGY7oj7_rebate | 1528708564 | s:30:"00uVkAbOMPGQc2z02PPxVMblGY7oj7"; |         |

| 01dB7czgCph7hgm1qGM7qA7haChXop_rebate | 1525740805 | s:30:"01dB7czgCph7hgm1qGM7qA7haChXop"; |         |

| 023oMqQAAwg4WWxWgJSLNgQhYlgtVi_rebate | 1531560804 | s:30:"023oMqQAAwg4WWxWgJSLNgQhYlgtVi"; |         |

 --------------------------------------- ------------ ---------------------------------------- --------- 

5 rows in set (0.00 sec)

 

mysql> select count(*) from think_session;

 ---------- 

| count(*) |

 ---------- 

|     1347 |

 ---------- 

1 row in set (0.00 sec)

 

mysql> select * from think_session limit 5;

 ---------------------------- ---------------- -------------- 

| session_id                 | session_expire | session_data |

 ---------------------------- ---------------- -------------- 

| 00onr4u3jabvi6vrts3bfeaqt4 |     1533358643 |              |

| 00rs65ljphuhhughujfnk2bci6 |     1533350110 |              |

| 01ld93n8ac31o4uorqrebtjir5 |     1533418040 |              |

| 01u5tv79pp8jjssh1r3s7oj6d4 |     1533351181 |              |

| 0261rcndf0jmq9dccou5l23mn4 |     1533346621 |              |

 ---------------------------- ---------------- -------------- 

5 rows in set (0.00 sec)

** 

 

 

导出数据库

 

导入数据库

 

 

要是顺遂的话,一切就不足为奇了,数据平常恢复生机,是或不是亦不是如何难事,难就难在你不理解而已,假使您作证学习了弹指间那上头的知识点,整个事情实在并不复杂。有些细节操作难点得以参照官方文书档案:

 

 

 

 

那么在此个复苏进程中是不是会遇到某些麻烦或主题素材吧,答案是无可置疑的,下边简单介绍一些在平复进程中也许遭受的主题素材

 

1: 在试验测验进度,笔者早已使用版本为MySQL 5.7.21的数据库,在导入表空间是胜过上面错误:

 

mysql> alter table wx_sign_record import tablespace; 

 

ERROR 1808 (HY000): Schema mismatch (Table has ROW_TYPE_DYNAMIC row format, .ibd file has ROW_TYPE_COMPACT row format.)

 

mysql> alter table wx_sign_record  row_format=DYNAMIC;

 

ERROR 2013 (HY000): Lost connection to MySQL server during query

 

mysql> alter table wx_sign_record  row_format=DYNAMIC;

 

ERROR 2006 (HY000): MySQL server has gone away

 

No connection. Trying to reconnect...

 

Connection id:    2

 

Current database: test

 

背后在英特网找到相关资料,大概是因为数据库版本缘故,作者动用MySQL 5.6.41以此本子就一向不碰着那一个主题材料。所以如若蒙受这种数据苏醒,最佳使用一样的数据库版本。

 

2:表空间 id 不等同问

  

    个人尚未遇上这几个标题,这里不做牵线。能够参谋MySQL 数据复苏案例

 

3:脚本自动化难题 

 

   对于研商难题,能够手工业操作,可是最为通过脚本自动化操作,MySQL 数据复苏案例里有自动化脚本放在github上,有意思味能够参照他事他说加以考察!

 

 

 

规律介绍:

 

关于原理介绍,能够参照英文原来的书文The basics of InnoDB space file layout 或者MySQL 数据恢复案例, 上面那有个别剧情完全摘抄自MySQL 数据苏醒案例:

 

回复方案中,我们选用到了 DISCA途胜D TABLESPACE、IMPORT TABLESPACE 和修改表空间 id。我们先说下 InnoDB 数据页的组成。InnoDB 数据页由 7 个部分组成,分别是 File Header、Page Header、Infimum 和 Supermum Records、User Records、Free Space 和 Page Directory。

接下去看看 ibdata 文件的团组织结构,如下图:

图片 7
From blog.jcole.us, by Jeremy Cole.

下一场看看 ibd 文件的集体结构,如下图:

图片 8
From blog.jcole.us, by Jeremy Cole.

我们要修改的表空间 id,位于 FSP_HEADERubicon。分歧的 ibd 文件,表空间 id 是差异的。ibdata 文件中有多个数目字典 data dictionary,记录的是实例中各类表在 ibdata 中的三个逻辑地点,而在 ibd 文件中也蕴藏着一样的多个 tablespace id,两个必得一律,InnoDB 引擎技能不荒谬加载到多少。所以,大家需求修改旧的表空间 id 为新的。

实在,大家对于 ibdata 文件中的 undo、change buffer、double write buffer 数据足以不用关爱。我们只须求采取八个全新的实例,以致三个根本的 ibdata 文件,通过卸载和加载表空间把 ibd 文件与 ibdata 文件涉及。小编利用了那般多脚本,目标正是那般。

 

参谋资料:

 

 

本文由星彩网app下载发布于星彩彩票app下载,转载请注明出处:丢失或损坏的数据教程,存储引擎

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。