站长梦想,靠谱的在线交易网站 帮助 每日签到

​新版MySQL环境InnoDB引擎模式下ibdata1数据文件损坏后利用mysqlfrm工具恢复数据库实例

  • 时间:2020-08-20 22:42 编辑:站长原创 来源:站长梦想 阅读:3817
  • 扫一扫,手机访问
摘要:新版MySQL环境InnoDB引擎模式下ibdata1数据文件损坏后利用mysqlfrm工具恢复数据库实例具体情况为:数据库版本为MySQL 5.7.26,站长也不清楚具体的数据库引擎; mysql崩溃宕机不能启动,出现问题的时候站长没有应对经验,重装了MySQL,ibdata1等文件被替换,没有数据库备份,只剩下数据库下面的一些文件(frm、idb)启动MYSQL后,MyISAM存储引擎模式和InnoDB存储引擎模式均不能读表,当然这

新版MySQL环境InnoDB引擎模式下ibdata1数据文件损坏后利用mysqlfrm工具恢复数据库实例

具体情况为:数据库版本为MySQL 5.7.26,站长也不清楚具体的数据库引擎; mysql崩溃宕机不能启动,出现问题的时候站长没有应对经验,重装了MySQL,ibdata1等文件被替换,没有数据库备份,只剩下数据库下面的一些文件(frm、idb)启动MYSQL后,MyISAM存储引擎模式和InnoDB存储引擎模式均不能读表,当然这中间细节过程不清楚也不用去纠结了。大概就是这么一个情况。查看文件后确认是InnoDB存储


InnoDB采用按表空间(tablespace)的方式进行存储数据, 默认配置情况下会有一个初始大小为10MB, 名字为ibdata1的文件, 该文件就是默认的表空间文件(tablespce file),用户可以通过参数innodb_data_file_path对其进行设置,可以有多个数据文件,如果没有设置innodb_file_per_table的话, 那些Innodb存储类型的表的数据都放在这个共享表空间中,而系统变量innodb_file_per_table=1的话,那么InnoDB存储引擎类型的表就会产生一个独立表空间,独立表空间的命名规则为:表名.idb. 这些单独的表空间文件仅存储该表的数据、索引和插入缓冲BITMAP等信息,其它信息还是存放在共享表空间中。


     MySQL 5.6.6以前的版本这个系统变量innodb_file_per_table默认是关闭的,如果没手动开启,数据都会存储在共享表空间中,ibdata1删除了或是损坏了,数据就无法恢复,只能通过工具恢复文件或是通过日志记录重建,但从MySQL 5.6.6开始, 系统变量innodb_file_per_table默认是启用的。也就是说默认开启了独立表空间,可从ibd文件中恢复数据。即使共享表空间的数据文件idbdata1丢失也不要紧,通过重建表结构再恢复表空间数据的方式一样可以还原数据库。


最初尝试使用MySQL Recovery Tool进行恢复,扫描了几小时后,成功导出了SQL文件,但效果并不理想,还原入库时满屏的错误日志,需要消耗耗费巨大的精力人工修复,遂放弃改用mysqlfrm工具手动恢复的方案


1、下载安装MySQL管理工具集,为了操作方便决定在本地搭建恢复环境所以选择了win64位的版本

win64位:https://downloads.mysql.com/archives/get/p/30/file/mysql-utilities-1.6.5-winx64.msi

2、通过phpstudy搭建本地环境,这里需要注意本地环境的MySQL版本要尽量跟原数据库版本保持一致,以免出现版本兼容问题

3、运行CMD进入DOS命令提示符,然后把路径切换到MySQL管理工具的安装目录,比如我的是D:/Program Files/MySQL/MySQL Utilities 1.6/

4、通过mysqlfrm工具查看重建frm表结构文件

mysqlfrm 是一个恢复性质的工具,用来读取.frm文件并从该文件中找到表定义数据生成CREATE语句,工具提供了两种工作模式

默认模式

mysqlfrm --server=root:ocm123@localhost --user=root --port=3307  /data/mysql/testbak/test.frm
mysqlfrm --basedir=/usr  --port=3307--user=mysql /data/mysql/testbak/test.frm --show-stats

默认的模式使用--basedir选项或指定--server选项来连接到已经安装的mysql数据库。这种过程不会改变原始的.frm文件。该模式需要指定--port选项来给再生的实例使用,该端口不能与现有的mysql数据库冲突。在读取.frm文件后,再生的实例将被关闭,所有的临时文件将被删除的。

诊断模式
mysqlfrm --diagnostic /data/mysql/testbak/test.frm --show-stats

诊断模式,需要指定 --diagnostic 选项。byte-by-byte读取.frm文件 尽可能多的恢复信息。该模式有更多的局限性,不能校验字符集;使用默认模式无法读取文件或者该服务器上没有安装MySQL实例就使用诊断模式。

选项
某些引擎表在默认模式下不可读取的。如PARTITION, PERFORMANCE_SCHEMA,必需在诊断模式下可读。
要在创建语句中改变存储引擎,可使用--new-storage-engine 选项。如果有指定该选项,同时必须指定--frmdir选项,该工具生成新的.frm文件,前缀为new_,并保存在--frmdir目录下。
关掉所有信息除了CREATE 语句和警告或错误信息,使用--quiet选项。
使用--show-stats 选项统计每个.frm文件信息。
使用--user 选项指定再生的实例以哪个权限运行。
如果再生的实例超过10秒启动,需调大--start-timeout 选项参数。

如何要查看输出信息,可以使用参数-vvv

具体更详细的参数可查阅官方的说明手册

这里需要注意使用--basedir恢复出来的内容,常常因无法进行字符编码校验引发导入时出现问题,所以能用--server模式时,尽量使用--server同时保证提供mysqld环境与原生产环境的一致。

--basedir方式

mysqlfrm --basedir=/usr/local/mysql-5.7.26/ /data/mysql/testbak/test.frm --port=3434 --user=mysql --diagnostic

/usr/local/mysql-5.7.26/为本地mysql的安装目录

/data/mysql/testbak/test.frm为被读取的frm表结构文件

端口随意,只要不冲突就可以


--server方式

mysqlfrm --server=user:password@192.168.1.100:3306 /data/mysql/testbak/test.frm --port=3434 --user=mysql

user:password@192.168.1.100:3306 为服务器用户、密码、IP、端口如果是本地默认端口,可以直接@localhost

port=3434 是再生时用到的端口


在实际应用过程中因为往往要恢复多个frm表结构文件,所以可以直接指向frm文件所在的目录,并直接输出为.sql文件,以方便手动修复问题比如

mysqlfrm --server=root:root@localhost --user=root --port=3307  I:

/phpstudy_pro/Extensions/MySQL5.7.26/data/12345678/  > test_frm.sql

输出的test_frm.sql里面会有很多垃圾信息需要清理才能导入,可以打开手工处理,也可以直接搜索替换

另外生成的SQL脚本建立单表后没有以分号结尾,要手工添加分号


5、将修复好的frm表结构sql导入数据库(如okok库),完成数据库表结构的重建,这里推荐使用SQLyog,因为查看日志方便可以提高人工修复test_frm.sql的效率

6、删除okok库中新建表的独立表空间文件,

单表测试

alter table aaaaaa discard tablespace;      

alter table bbbbbb discard tablespace;    

alter table cccccc discard tablespace;

........................................

这里可以直接使用SQL脚本

mysql -N -e " select concat('alter table ',table_name,' discard tablespace ;') from information_schema.tables where table_schema='okok'; " >discard.sql

当然也可以先停止mysql数据库后直接把okok库中以ibd为扩展名的文件都删掉,我就是用的这个方法,感觉是最方便的


7、复制待恢复的表空间数据文件到okok库目录下并设置好权限属性

8、导入表空间数据文件

单表测试,可以使用Navicat 按F6进入mysql命令行模式

alter table aaaaaa import tablespace;      

alter table bbbbbb import tablespace;    

alter table cccccc import tablespace;


整体导入可以生成sql脚本:mysql -N -e " select concat('alter table ',table_name,' import tablespace ;') from information_schema.tables where table_schema='okok'; " >import.sql

然后运行import.sql脚本文件

9、刷新数据库信息,查看数据完整性,至此本地恢复工作完成

10、导出包含完整信息的数据库文件,恢复到生产环境


案例流程只是本人近期使用mysqlfrm工具恢复数据库后作的简要梳理,未认真细致校对,也没有结过多次验证,仅供新手站长朋友们借鉴参考,操作过程中请做好原始数据备份工作,以免造成重要数据丢失,同时欢迎朋友们对错误之处作批评订正,一起来挖掘MySQL管理工具集的强大功能,减少网站运维工作对站长造成的压力,站长越来越不易,需要抱团取暖相互扶持






  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【金融/投资|股票】如何研究基本面的?(2020-12-29 01:02)
【站长经验|网站运维】一款很好用的内网穿透工具--FRP(2020-09-08 20:21)
【站长经验|网站运维】使用Frp外网访问内网FTP服务器(以访问内网samba服务为例)(2020-09-08 20:14)
【站长经验|网站运维】使用FRP实现内网穿透,远程访问内网服务器(2020-09-08 20:06)
【站长经验|网站运维】安装 MySQL 后,需要调整的 10 个性能配置项(2020-08-31 23:02)
【站长经验|网站运维】Mysql如何优化MyISAM存储引擎(2020-08-31 20:53)
【站长经验|网站运维】Mysql5.7 innodb innodb_* 参数详解(2020-08-31 17:44)
【站长经验|网站运维】Linux下sysstat安装使用图文详解(2020-08-31 13:20)
【计算机/互联网|】centos安装iostat命令(2020-08-31 13:15)
【站长经验|网站运维】mysql占用磁盘IO过高的解决办法(2020-08-31 13:12)
联系我们
Q Q:258266
电话:18132120255
邮箱:pr888_admin@163.com
时间:09:00 - 19:00
底部广告
联系客服
购买源码 源码咨询 订制开发 联系客服
0577-67068160
手机版

扫一扫进手机版
返回顶部