Home  >  Article  >  Database  >  通过frm&ibd 恢复 Mysql ibdata 丢失或损坏的数据教程

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

WBOY
WBOYOriginal
2016-06-07 16:23:031073browse

有时候mysql没有做好数据备份,或者被数据管理员误删,或者ibdata损坏了我们如何恢复呢?别怕,只要有部分frm、ibd存在,下面就是恢复教程。 mysql存储在磁盘中,各种天灾人祸都会导致数据丢失。大公司的时候我们常常需要做好数据冷热备,对于小公司来说要做

        有时候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分离。 ALTER TABLE weibo_qq0 DISCARD TABLESPACE;

  c、把之前要恢复的 .ibd文件复制到新的表结构文件夹下。 使当前的ibd 和frm发生关系。ALTER TABLE weibo_qq0 IMPORT TABLESPACE; 结果不出意外肯定会报错。就和我们开展数据开始说的那样,数据记录点不一致。我们看看之前ibd记录的点在什么位置。开始执行 import tablespace,报错 ERROR 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

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

  f、使原来数据的ibd和当前frm建立关系。 ALTER 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;

  没有报错就导入成功了

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn