利用frm 和 idb文件批量还原数据_数据文件的恢复

2020-02-28 其他范文 下载本文

利用frm 和 idb文件批量还原数据由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“数据文件的恢复”。

利用frm 和 idb文件批量还原数据

最近碰到一个问题,一个平时不怎么用数据库在一次搬机器过程中弄挂了,然后在重启过程中不小心把ibdata给弄坏了。于是无奈只能通过frm和idb文件来做数据恢复。因为是整个库的数据有问题,因此在这过程中写了一些脚本来帮助恢复。

下面是这次操作的过程:

首先说明,本方案只适用于 innodb_file_per_table = 1 这种情况下的做数据恢复。

下面是用来说明恢复案例的环境:

原数据库数据文件的位置: /data/dbdata 库名称: user 新库的用户名、密码:root/111111 新库的数据文件位置:/data/newdata

1、首先做好frm和idb文件的备份,并准备一个全新的MySQL环境,至于为什么要全新的,稍后就会明白。

2、通过frm文件导出表结构

如果你本身就有创建数据的schema的sql脚本,这一步可以略过。

a、首先创建user库;

> create database user;

b、接下来需要在user库创建原库的frm对应的表,这一步可通过 create_init_table.sh【https://github.com/iamxhu/devops_tools/blob/master/mysql/recovery/create_init_sql.sh】生成创建表的脚本。具体使用方法参加文件中的说明。

$./create_init_table.sh /data/dbdata/user root 111111 user

运行上面的脚本后,会生成三个文件:create_tmp_table.sql,discard_tablespace.sh,import_tablespace.sh。在这一步只需要将create_tmp_table.sql导入到mysql中。

> mysql-uroot-p user

这样表就都创建好了。

c、关闭mysql,修改my.cnf 在[mysqld]段中增加如下配置: innodb_force_recovery = 6

d、将需要恢复的frm文件替换新的库是的frm文件 $ cp /data/dbdata/user/*.frm /data/newdata/user/

e、重启mysql 这时登录就可以看到恢复好的表结构了。

3、恢复idb中的数据

a、首先需要找出原来的idb中的space id,可通过下面的方法完成https://github.com/iamxhu/devops_tools/blob/master/mysql/recovery/find_mysql_spaceid.sh。

$./find_mysql_spaceid.sh /data/dbdata/user root 111111 user 脚本将会生成一个文件:export_table_schema.sh。这个文件主要是用来导出新生成表的建表语句create_table.sql。生成的create_table.sql需要再手动处理一下,删除开头的表名。

因为针对一个库,可能其中表的space id不一定是连续的,因此第一步生成的表不能直接使用需要重新建表。create_table.sql会根据space id的之间的差值,自动插入一些临时表来填充space id。

b、注释掉innodb_force_recovery = 6 重启mysql继续下面的操作。

c、找出最小的space id,在MySQL中填充好space id。

这一步需要注意,不要填多了,否则又要重新弄一个新的MySQL环境了。最好分两部做,先留100个space id,在生成完第一批表之后查看一下最后生成的表的space id再填充后面的space id。

填充space id可以使用 fill_table_space.sh 脚本来完成。用法如下:

$./fill_table_space.sh 100 root 111111

d、填充完成后,执行导入表结构。如下操作:

$ mysql-uroot-p user

e、执行discard_tablespace.sh脚本,做discard tablespace操作。

$./discard_tablespace.sh

f、将原来的idb文件拷贝到现在的user库目录下,并修改权限

$ chown mysql.mysql /data/newdata/user/*.idb

g、执行import_tablespace.sh $./import_tablespace.sh

h、在my.cnf中将innodb_force_recovery = 6 的注释打开,然后重启MySQL。

这时候可以登录进去看看数据是不是都存在了。如果一切都OK的话,接下来可以执行export_table_data.sh脚本,导出数据了。然后你也可以直接dump出sql文件。

本文作者胡星,现任职于华强北商城,原文转自博客:http://www.daodoc.com/

《利用frm 和 idb文件批量还原数据.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
利用frm 和 idb文件批量还原数据
点击下载文档
相关专题 数据文件的恢复 文件批量 数据 FRM 数据文件的恢复 文件批量 数据 FRM
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文