通过frm&ibd 恢复 Mysql ibdata 丢失或损坏的数据教

2019-09-15 15:45 来源:未知
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)

由此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分离。 ALTE凯雷德 TABLE weibo_qq0 DISCARD TABLESPACE;

  c、把前面要还原的 .ibd文件复制到新的表结构文件夹下。 使当前的ibd 和frm产生关联。ALTEWrangler TABLE weibo_彩民之家高手论坛,qq0 IMPORT TABLESPACE; 结果不出意外肯定会报错。就和大家举办数据开始说的那么,数据记录点不雷同。大家看看前边ibd记录的点在什么样职位。最初试行import tablespace,报错 E福特ExplorerROCRUISER 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昂科拉 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存在,上边就...

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

彩民之家高手论坛 1

3.1 概述

InnoDB的文件重大分为四个部分,五个是表空间文件,一个是重做日志文件

  • 表空间文件
    • 独立表空间文件
    • 大局表空间文件
    • undo表空间文件(from MySQL5.6)
  • 重做日志文件
    • 大要逻辑日志
    • 不曾Oracle的归档重做日志

   对于琢磨难题,能够手工操作,可是最佳通过脚本自动化操作,MySQL 数据恢复生机案例里有自动化脚本放在github上,有意思味能够参照!

[TOC]

 

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后,备份工具是否能够支持

末尾在网络找到有关资料,恐怕是因为数据库版本缘故,小编利用MySQL 5.6.41以此本子就不曾汇合那么些难题。所以一旦遇上这种数据恢复生机,最佳使用同样的数据库版本。

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; -- 查看表空间的元数据音讯

22

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

 

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(高性能,高扩展,高可用)

 

3. InnoDB囤积引擎的文书

 

InnoDB 存款和储蓄引擎

 

出于分享表空间的ibdata1数据文件不设有了,加之有没有备份,所以自身武断的判断那个数据库真的无助恢复生机了,可是随后一天,那些朋友跟本身说找了一家数据恢复生机集团将以此数据库苏醒了。 听到这几个音信颇有一点点学艺不精的难堪(其实谈不上进退两难呢,本来还在上学MySQL的中途,有个别知识数不完楚也很正规。经验是内需稳步储存的),可是越来越多的是惊讶外人是哪些回复数据的,既然人家能够重振旗鼓,那么自个儿下三回遭遇这种意况也要能化解。上面就来复局一下别人是怎么着恢复生机数据的(其实如若稍稍做点功课,开采那几个实际上挺简单的)

    InnoDB采取按表空间(tablespace)的点子实行仓库储存数据, 私下认可配置意况下会有三个起来大小为10MB, 名为ibdata1的文件, 该文件正是暗中同意的表空间文件(tablespce file),客商能够透过参数innodb_data_file_path对其进展设置,能够有三个数据文件,若无安装innodb_file_per_table的话, 那么些Innodb存款和储蓄类型的表的数目都位居这一个分享表空间中,而系统变量innodb_file_per_table=1的话,那么InnoDB存款和储蓄引擎类型的表就能发生二个独立表空间,独立表空间的命名法规为:表名.idb. 那么些单独的表空间文件仅存款和储蓄该表的数码、索引和插入缓冲BITMAP等音信,其余音信还是寄放在共享表空间中。

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

下一场看看 ibd 文件的团组织结构,如下图:

导入frm文件的表结构音信

至于原理介绍,能够参见意国语原稿The basics of InnoDB space file layout 或者MySQL 数据苏醒案例, 上面那部分内容完全摘抄自MySQL 数据苏醒案例:

 

 

那正是说大家接下去看看,如何从idb文件中回复数据吧,大家须要接纳mysqlfrm工具, 要求安装MySQL Utilities,下边是安装MySQL Utilities 1.5.5

 

 

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

[root@gettestlnx02 test]#

实则,大家对此 ibdata 文件中的 undo、change buffer、double write buffer 数据能够不用关爱。大家只供给利用二个斩新的实例,以及叁个干净的 ibdata 文件,通过卸载和加载表空间把 ibd 文件与 ibdata 文件涉及。小编使用了如此多脚本,目标正是那般。

alter table think_session discard tablespace;    

 

# python ./setup.py build

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> 

 

 

 

回复方案中,大家运用到了 DISCASportageD TABLESPACE、IMPORT TABLESPACE 和修改表空间 id。我们先说下 InnoDB 数据页的咬合。InnoDB 数据页由 7 个部分构成,分别是 File Header、Page Header、Infimum 和 Supermum Records、User Records、Free Space 和 Page Directory。

 

 

复制待苏醒的表空间文件

** 

 

 

彩民之家高手论坛 2

84

那正是说在那几个恢复生机进程中是否会蒙受一些烦劳或主题素材啊,答案是早晚的,上边简要介绍部分在恢复生机进程中也许蒙受的难点

[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.

#

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

alter table wx_activity_config discard tablespace;

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 表空间数据文件idbdat1文件有关概念和知识点:

[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 ~]# 
select concat(concat('alter table ',table_name), ' discard tablespace;')                                                  

from information_schema.tables                               

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

 

 

原理介绍:

  

应用下边脚本生成删除新建表的独立空间的脚本:

 

 

下三日,在此此前公司的同事朋友找小编匡助,看看是不是扶助复苏二个MySQL 数据库,具体情况为:数据库版本为MySQL 5.6(具体版本不晓得),也不精通具体的数据库引擎; 未有数据库备份,只剩下数据库上边包车型地铁一部分文书(frm、idb),具体原因是因为出现难点的时候,重装了MySQL,最可怜的是ibdata1等文件也一贯不了,当然那中间细节经过如何,不亮堂也不用去纠结了。大约正是如此一个动静。

    其实当时首若是对这几个定义有一点模糊了,感觉这些系统变量innodb_file_per_table暗中认可是关闭的,数据都会蕴藏在分享表空间中,那么那个文件删除了,数据就无法苏醒。所以武断的下定论,其实从MySQL 5.6.6发端, 系统变量innodb_file_per_table默许是启用的。只要再多理解一些或许说越来越深刻精通一些来讲,景况就能够应声就能够反转。也正是说如若展开了独立表空间,可从ibd文件中平复数据。尽管分享表空间的数据文件idbdata1错过也不要紧,反之,假如未展开独立表空间时,idbdat1被剔除了,数据也会被去除,只可以从备份中回复,真的未有其他措施。

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

 

 

领到frm文件的表结构消息

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

 

 

3:脚本自动化问题 

动用脚本就可以转换下边SQL,试行该命令后,对应数据库下面包车型地铁ibd文件全体被删除。

 

 

 

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

# cd /tmp/database

# ls -lrt *.ibd | wc -l

84

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

 

# chown  mysql:mysql *.ibd

# chmod 660 *.ibd

# cd mysql-utilities-1.5.5

 

 

彩民之家高手论坛 3
From blog.jcole.us, by Jeremy Cole.

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)

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

因为数据库异常的小,将相应的文件拷贝到本身一台测验服务器的MySQL数据文件目录下后(上边实验测量试验,对数码库名等灵活新闻做了弹指间模糊),如下所示,数据库名称叫test,show tables能够见到相关的表。

84

从中能够观察那个数据库从前的本子为MySQL为5.6.29,而小编这里的MySQL版本比那几个低(MySQL 5.6.20)。所以必需找二个跟那个版本一样或高的MySQL数据库操作才行。于是在其它一台测量试验服务器安装了MySQL

 

 

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

 

 

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

哪些要翻开输出音讯,能够动用参数-vvv

 

 

 

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

 

 

2:表空间 id 不一样样问

    个人尚未遭遇这么些难题,这里不做牵线。能够参见MySQL 数据复苏案例

 

导出数据库

 

22

 

彩民之家高手论坛 4

 

彩民之家高手论坛 5
From blog.jcole.us, by Jeremy Cole.

 

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

1: 在尝试测量检验进程,作者曾经使用版本为MySQL 5.7.21的数据库,在导入表空间是碰见上面错误:

 

 

 

中间有几张表的储存引擎为MyISAM,那么这么些表的数码是截然能够回复的,不过相当多分表的囤积引擎为InnoDB,访谈表或查看表都会提醒“E福睿斯ROENCORE1146 (42S02): Table 'xxxx' doesn't exist 空中楼阁。

 

# python ./setup.py install

变迁的SQL脚本未有以总局结尾,本来想用sed命令给那个CREATE TABLE脚本加上分号结尾,可是开掘当中山大学量CREATE TABLE的本子结尾未有规律,都是以COMMNET='xxxxx'结尾,只可以手工业加多分号(如下所示)

 

 

 

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

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

导入数据库

 

我们要修改的表空间 id,位于 FSP_HEADESportage。分化的 ibd 文件,表空间 id 是见仁见智的。ibdata 文件中有一个数码字典 data dictionary,记录的是实例中各种表在 ibdata 中的三个逻辑地点,而在 ibd 文件中也蕴藏着平等的一个 tablespace id,两个必得一致,InnoDB 引擎本领健康加载到多少。所以,我们需求修改旧的表空间 id 为新的。

 

 

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

 

 

 

 

 

 

 

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

 

[root@gettestlnx02 ~]# service mysqld stop

 

Stopping mysqld:  [  OK  ]

 

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

 

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

 

将待苏醒的ibd文件拷贝到对应数据库目录下边,并设置好权力属性

alter table think_cache discard tablespace;      

 

若是顺遂的话,一切就好像常了,数据寻常恢复生机,是不是亦不是什么样难事,难就难在你不清楚而已,倘若您作证学习了弹指间那上边的知识点,整个事情实在并不复杂。有些细节操作难题得以参见官方文书档案:

 

反省导出的SQL语句,开掘都是“ECR-VROLAND: 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”那类错误:

 

导入表空间

 

TAG标签: MySQL-复习之路
版权声明:本文由彩民之家高手论坛发布于彩民之家高手论坛,转载请注明出处:通过frm&amp;ibd 恢复 Mysql ibdata 丢失或损坏的数据教