昨天因为不行描写的原因,数据库直接被 drop database
删除。在第一时间遏制数据库处事和Web处事,备份MySQL数据目次下的所有文件之后,开始走上数据规复之路。
第一次干这种事,各类不得法。因为我们既没有备份,也没有开启binlog,连innodb_file_per_tabe_也没有。一番折腾后向万能的伴侣圈求救,昆山软件开发,伴侣给了两个链接,最终救了一下命。以下先按编号记下 URL,后续引用之。
个中URL1和URL3的内容根基上沟通,是整个规复事情的蓝本。URL2是URL1中引用的一个twindb团队开拓的一个东西,此刻他们官方已经删除了,URL2是该东西的一个fork,可能说是备份。
规复进程以URL3为蓝本,先去URL2 git clone一份代码下来,然后按其说明编译,我们在ubuntu server 14.04 64bit 版本的环境下,乐成编译完成,编译中需要安装各类依赖不表。
然后用 stream_parser
处理惩罚ibdata1
文件,接下来规复SYS_TABLES
和 SYS_INDEXES
,发起此进程中严格遵守参考资料,好比把这些资料规复到dumps/default
目次中,而不是随意起名,以免横生枝节。
这里尚有一个坑,就是URL3里用的c_parser -4f
是会堕落的,而URL1里用的是c_parser -4Df
,就不会堕落,所以各人做的时候必然要把这个D加上。叹息一下,假如不细心的人真的没法做这事!摔!
接下来按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
目次,否则就再多一轮流换。
接下来的内容,大部门是参考文献里没有的了。
规复数据字典后,就可以用URL3先容的方法找出你对应的所有数据库和表的索引ID了。这个时候就碰着为 c_parser
提供数据表建表语句的问题了,这个问题难就难在先有鸡照旧先有蛋,一般来说,数据库都被删掉了,哪尚有步伐去搞出CREATE TABLE
这种建表语句呢?好就亏得我们用的是django
,它对数据迁移的完美支持救了我一命。在这里讲一句题外话,利用雷同django/ror/laravel等有数据迁移框架在此就看出何等重要了。只要在按照原有项目做一次migrate,数据表就建好了,这时候只要用mysqldump
导出对应表的建表语句即可:
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的内容就会在导入数据的环节堕落,临时没有找到步伐规复这个数据。