- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
利用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)