事故背景
原本开发的好好的,突然发现mysql连接不上,去服务器一看宕机了,想着重启一下,结果找不到bin目录,重启service也不行,当时忘记把mysql添加service了,网上找了一圈没找到解决方法。
操作
最后经过权衡,选择新起一个mysql服务,进行数据恢复,但搞笑的是,项目并没有导出sql文件进行备份,由于旧mysql也重启不了,无法进行数据迁移,形成了一个很尴尬的局面。
突然想到一个歪路子,把旧mysql的data目录下的文件直接移到新mysql下,结果显然是失败的,mysql根本启动不了,按照网上的教程也都不行。
我打开数据库目录下,看到的是一个一个的idb文件,经过百度发现:MySQL数据库中的 `.ibd` 文件是InnoDB存储引擎的数据文件,其中包含表的数据和索引。`.ibd` 文件是InnoDB表空间的一部分,它包含了表的实际数据、索引数据和元数据。
我心想,这不就完事了吗,ibd文件中需要的数据都有了,直接拿出来不就能进行恢复了,但是又错了,ibd是二进制文件,无法直接打开查看,网上找了一圈也没有对应的解决方法。
这时候就想起了万能的GitHub,果然发现一个好东西:https://github.com/ddcw/ibd2sql
这是一个使用py对ibd文件解析成sql,ddl等语句的工具,具体操作方法见GitHub。
他完美的帮我还原了原本建表语句和表数据,帮助我完成数据恢复。
原理:
ibd文件结构和解析的原理在https://cloud.tencent.com/developer/article/2377921
总结
- 数据库一定要定时做数据备份,防止服务宕机
- 尽量将mysql添加到服务,用服务对mysql进行管理
- 遇到网上难以解决的问题,多去GitHub上逛逛