windows系统中的MySQL 程序崩了,但数据库文件还在,如何救回? ----把这个问题扔给ChatGPT,按gpt/baidu/google提供的解决方案操作,折腾了一天,还是没有搞定。
数据恢复没搞定,但也记录一下部分心得:
1、MySQL 提供了多种存储引擎,早期版本默认是MyISAM,从5.5版本开始默认InnoDB。
2、MySQL数据库每个表的数据在硬盘中都有独立的数据文件,以数据库名称作为文件夹名称,以表名称作为文件名。例如数据库"mytest"下有"users"表,那么Data目录下有mytest文件夹,文件夹有users.MYD等数据:
C:\ProgramData\MySQL\MySQL Server 8.0\data\mytest\ 目录下有
users.MYD
(存储数据)users.MYI
(存储索引)users.frm
(存储表的定义)
或
users.ibd
(存储数据和索引)users.frm
(存储表的定义)
从 MySQL 5.7 版本开始,InnoDB 表结构信息都不再单独存储在 .frm
从 MySQL 8.0 版本开始,MyISAM 也表不再生成 .frm 文件了
3、删除表,就会直接删除对应的文件,删除库就会简单粗暴直接删除对应的文件夹(即使文件夹中有其你手动创建的文件)
4、对于数据的恢复,早期版本相对容易恢复,早期版本的数据文件对各种数据恢复工具比较友好,但我试了多款工具都未能恢复8.0版本的数据。
5、工具集:
---- 对于用InnoDB引擎的 .ibd文件恢复,github上有一个开源的python脚本 ibd2sql 貌似挺不错。
---- 对于用MyISAM引擎的 .MYD/.MYI 文件恢复:有 Stellar Repair for MySQL、Recovery Toolbox for MySQL、Kernel for MySQL Database Recovery、DataNumen MySQL Repair、MySQL Recovery Tool by SysTools、Repair MySQL、MySQL Dump Recovery Tool by SoftPerfect、 EaseUS Data Recovery Wizard、ApexSQL Recover 似乎有很多,但我试几款均只能恢复8.0之前的版本,无法恢复我的这份文件。(参考 https://blog.youkuaiyun.com/youuzi/article/details/132159830 )
=================
对于mysql 8.0及之后的版本,默认是用 InnoDB引擎的,但这次我发现我的无论是本地开发环境还是服务器端的生产环境都是MyISAM引擎(文件夹中是 .MYD/.MYI ),我觉得奇怪,后来才发现原来是phpstudy在搞鬼。
我本地开发环境用的是phpstudy附带的MySQL,它安装方便,又不注册windows服务,不会开机自动启动,用完停止就释放资源了。但它的配置文件中,把默认引擎改为了MyISAM。所以用Navicat连接数据库后,在GUI界面创建的表默认都是MyIsam引擎。然后从Navicat导出的sql语句也是MyIsam,把sql语句导入到服务器的MySQL就也都是MyIsam引擎了。
之所以提这一点,一是我在想,如果是InnoDB引擎,那么保留下来的就是.ibd文件,就可以用ibd2sql来恢复了。二是在生产服务器上,不是特殊场景的话,还是用功能更强大的InnoDB引擎好。
另:phpstudy安装mysql的目录是 D:/phpstudy_pro/Extensions/MySQL8.0.12/,Data文件目录是D:/phpstudy_pro/Extensions/MySQL8.0.12/data 。如果卸载MySQL8.0.12,会简单粗暴地直接把 D:/phpstudy_pro/Extensions/MySQL8.0.12/整个目录删除掉,不管里面是否有手动加进去的文件。删除数据库也是直接data目录下的对应文件夹直接简单粗暴地删除。
m