资讯专栏INFORMATION COLUMN

mysql怎么通过frm和ibd文件还原数据

沈俭 / 3520人阅读

摘要:使当前的和发生关系。就和我们开展数据开始说的那样,数据记录点不一致。修改表结构使当前的表结构和脱离关系。直到可以查询出数据为止,然后出来。把所有数据导出后,在新的数据库导入。所有数据就生成了。

1、找回表结构,如果表结构没有丢失直接到下一步

a、先创建一个数据库,这个数据库必须是没有表和任何操作的。

b、创建一个表结构,和要恢复的表名是一样的。表里的字段无所谓。一定要是innodb引擎的。CREATE TABLE weibo_qq0( weiboid bigint(20)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

c、关闭mysql, service mysqld stop;

d、用需要恢复的frm文件覆盖刚新建的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<=111; $1++) {CREATE TABLE t# (id int) ENGINE=InnoDB;} 也许很奇怪,为什么是循环111,不是112。因为在a执行创建表结构的时候已经记录增加了一次。

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数据库下,注意复制过来的文件权限 and 用户和组,要不然执行不会成功。

循环导入表空间。

ALTER TABLE inv_crawl_weibo_qq0 IMPORT TABLESPACE;

没有报错就导入成功了

【注意】如果是用的云服务器,下载binlog 找一个非云服务器rds数据库,新建库表再回复数据(覆盖idb 重启mysqld),再将恢复好的数据导入回云服务器数据库。今天尝试了一下搞定了。不知道还有没有更好方法,请多指正。(^-^)

摘自http://www.linuxidc.com/Linux...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/47109.html

相关文章

  • 基于Xtrabackup及可传输表空间实现多源数据恢复

    摘要:在以后支持了可传输表空间以及针对该功能在备份时提供了一个对应参数该参数支持对存储引擎表的备份数据转换,且与常规备份操作一样可生成备份时间点的信息信息结合这两特性可以更高效和快速的方式实现多库数据汇聚的初始导入操作。 本文目录一、使用背景1.可传输表空间基本流程2.使用前提条件/限制二、技术要点三、实施步骤1.实验环境2.源端操作 1) 造测试数据并模拟小压力 2) 备份单库数据 3) ...

    forrest23 评论0 收藏0
  • MySQL表结构为InnoDB类型从ibd文件恢复数据

    摘要:创建一个表结构,和要恢复的表名是一样的。启动,就能到表结构信息了。把之前要恢复的文件复制到新的表结构文件夹下。修改表结构使当前的表结构和脱离关系。 1、找回表结构,如果表结构没有丢失直接到下一步 a、先创建一个数据库,这个数据库必须是没有表和任何操作的。 b、创建一个表结构,和要恢复的表名是一样的。表里的字段无所谓。一定要是innodb引擎的。CREATE TABLE weibo_qq...

    fobnn 评论0 收藏0
  • MySQL命令统计的库大小物理文件大小差异

    一、MySQL数据库容量查询方法1.1查看所有数据库容量大小select table_schemaas'数据库', sum(table_rows)as'记录数', sum(truncate(data_length/1024/1024,2))as'数据容量(MB)', sum(truncate(index_length/1024/1024,2)...

    社区管理员 评论0 收藏0
  • MySQL 表空间

    摘要:表空间环境引擎为,不考虑。版之前的不支持独立表空间。再转换成独立表空间查看数据库文件。总用量月月月月月月月改表空间还可以用,详见 MySQL 表空间 环境:MySQL 5.6.27, Ubuntu 15.10 64-bit引擎为 InnoDB,不考虑 MyISAM。MySQL 5.6 版之前的 InnoDB 不支持独立表空间。 查看当前设置是共享表空间,还是独立表空间 mysql> s...

    pumpkin9 评论0 收藏0
  • mysql利用表对象数据文件恢复数据

    摘要:引擎文件数据文件文件索引文件引擎和重做日志文件两个文件一模一样,之所以存在两个是,为了避免一个文件损坏后,而且之后,无法恢复数据。引擎表恢复数据直接备份,,文件,然后再复制粘贴到目标数据库文件夹即可。参考文章利用数据库文件恢复数据 数据库文件基础 .frm文件: 只存储表的结构信息,frm文件跟数据库存储引擎无关,这也就是说,它和表的索引、数据都无关。 MyISAM引擎 .myd文件...

    LiveVideoStack 评论0 收藏0

发表评论

0条评论

沈俭

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<