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

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
利用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【/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 create_tmp_table.sql 这样表就都创建好了。 c、 关闭mysql,修改f 在[mysqld]段中增加如下配置: innodb_force_recovery = 6 d、将需要恢复的frm文件替换新的库是的frm文件 $ cp /data/dbdata/user/*.frm /data/newdata/user/ e、重启mysql 这时登录就可以看到恢复好的表结构了。 3、恢复idb中的数据 a、首先需要找出原来的idb中的space id,可通过下面的方法完成/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 create_table.sql 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、在f中将innodb_force_recovery = 6 的注释打开,然后重启MySQL。 这时候可以登录进去看看数据是不是都存在了。如果一切都

文档评论(0)

3va3x66 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档