昨天由于不可描述的缘由,数据库直接被 drop database
删除。在第一时间中止数据库服务和Web服务,备份MySQL数据目录下的全部文件以后,开始走上数据恢复之路。mysql
第一次干这种事,各类不得法。由于咱们既没有备份,也没有开启binlog,连innodb_file_per_tabe_也没有。一番折腾后向万能的朋友圈求救,朋友给了两个连接,最终救了一下命。如下先按编号记下 URL,后续引用之。laravel
其中URL1和URL3的内容基本上相同,是整个恢复工做的蓝本。URL2是URL1中引用的一个twindb团队开发的一个工具,如今他们官方已经删除了,URL2是该工具的一个fork,或者说是备份。git
恢复过程以URL3为蓝本,先去URL2 git clone一份代码下来,而后按其说明编译,咱们在ubuntu server 14.04 64bit 版本的状况下,成功编译完成,编译中须要安装各类依赖不表。github
而后用 stream_parser
处理ibdata1
文件,接下来恢复SYS_TABLES
和 SYS_INDEXES
,建议此过程当中严格遵照参考资料,好比把这些资料恢复到dumps/default
目录中,而不是随意起名,以避免横生枝节。sql
这里还有一个坑,就是URL3里用的c_parser -4f
是会出错的,而URL1里用的是c_parser -4Df
,就不会出错,因此你们作的时候必定要把这个D加上。感叹一下,若是不细心的人真的无法作这事!摔!shell
接下来按URL3的说明把数据字典导入 MySQL。这一步能够不作,按URL1里高票答案的方法来获取索引ID,比较麻烦。URL3的方法应该会出这样的错:数据库
ERROR 1148 (42000) at line 2: The used command is not allowed with this MySQL version
这是由于MySQL默认不启用LOAD DATA LOCAL INFILE
致使的,须要给mysql
命令加上--local-infile
参数。这是参考文献的一个坑。趟过这个坑之后,我能够告诉你一个捷径,就是URL2里的代码里其实有一个文件recover_dictionary.sh
,它干的就是恢复数据字典的事情,因此你只要把这个shell脚本里的mysql
都替换成mysql --local-infile -uroot -pxxxxx
就行,其中xxxx是指你的root帐号密码,不过前提是你很听话的用了前面说的dumps/default
目录,否则就再多一轮替换。django
接下来的内容,大部分是参考文献里没有的了。ubuntu
恢复数据字典后,就能够用URL3介绍的方式找出你对应的全部数据库和表的索引ID了。这个时候就遇到为 c_parser
提供数据表建表语句的问题了,这个问题难就难在先有鸡仍是先有蛋,通常来讲,数据库都被删掉了,哪还有办法去搞出CREATE TABLE
这种建表语句呢?好就好在咱们用的是django
,它对数据迁移的完美支持救了我一命。在这里讲一句题外话,使用相似django/ror/laravel等有数据迁移框架在此就看出多么重要了。只要在根据原有项目作一次migrate,数据表就建好了,这时候只要用mysqldump
导出对应表的建表语句便可:markdown
mysqldump --add-drop-table=0 --add-lock=0 -d DBNAME TABLENAME -uroot -p > xxxx.sql
由于c_parser
很是弱,只处理CREATE TABLE
语句,多一点干扰都不行,因此上面的参数都是必要的。
接下来就是参考URL1把某一个表的数据恢复出来,这里有一个坑,URL1里说把数据恢复到dump.tsv里,实际上是不对的,这里应该用dumps/default/TABLENAME
,别问我为何知道,我不会告诉你我找这个缘由找瞎了眼,好吧,跟你说,由于生成的load_cmd.sql
里直接引用 dumps/default/TABLENAME
,没法设置。因此最后咱们这里可用的命令是:
./c_parser -6f pages-ibdata1/FIL_PAGE_INDEX/0000000000002410.page -t xxxx.sql > dumps/default/TABLENAME 2> load_cmd.sql
把数据恢复出来之后,执行
mysql --local-infile -uroot -p DBNAME < load_cmd.sql
就能够把数据导进去了,记得在数据库里查询一下有没有成功,若是没有数据恢复出来,应该是其中的某些环节出了问题。
这样就成功恢复了某一个表,只要按这里最后三条命令(导出建表语句、恢复数据、导入数据)重复地作下去,你就能把基本上全部的数据都恢复出来了。之因此说是“基本上”,缘由是我系统中使用了utf8mb4
编码(为了兼容emoji),结果是若是数据中有emoji的内容就会在导入数据的环节出错,暂时没有找到办法恢复这个数据。
以上就是整个恢复过程,枯燥、压力山大,这种事情我不想再经历了。若是你也遇到这样的数据恢复需求,但愿这篇笔记可以帮到你。但也不要期望我能帮到你更多了,个人经验也仅止于此,天大地大,就此别过,不要找我。谢谢!