欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 宝鼎售后问题提交 | 后台管理


新闻资讯

MENU

软件开发知识
原文出处: 赖勇浩

昨天因为不行描写的原因,数据库直接被 drop database删除。在第一时间遏制数据库处事和Web处事,备份MySQL数据目次下的所有文件之后,开始走上数据规复之路。

第一次干这种事,各类不得法。因为我们既没有备份,也没有开启binlog,连innodb_file_per_tabe_也没有。一番折腾后向万能的伴侣圈求救,昆山软件开发,伴侣给了两个链接,最终救了一下命。以下先按编号记下 URL,后续引用之。

  1. http://dba.stackexchange.com/questions/23251/is-there-a-way-to-recover-a-dropped-mysql-database
  2. https://github.com/chhabhaiya/undrop-for-innodb
  3. https://twindb.com/how-to-recover-innodb-dictionary/

个中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的内容就会在导入数据的环节堕落,临时没有找到步伐规复这个数据。