昨天因为不可描述的原因,数据库直接被 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_TABLESSYS_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的内容就会在导入数据的环节出错,暂时没有找到办法恢复这个数据。

以上就是整个恢复过程,枯燥、压力山大,这种事情我不想再经历了。如果你也遇到这样的数据恢复需求,希望这篇笔记能够帮到你。但也不要指望我能帮到你更多了,我的经验也仅止于此,天大地大,就此别过,不要找我。谢谢!

记一次MySQL删库的数据恢复相关推荐

  1. github mysql 数据恢复_记一次MySQL删库的数据恢复

    昨天因为不可描述的原因,数据库直接被 drop database删除.在第一时间停止数据库服务和Web服务,备份MySQL数据目录下的所有文件之后,开始走上数据恢复之路. 第一次干这种事,各种不得法. ...

  2. mysql删库后恢复_记一次MySQL删库的数据恢复

    昨天因为不可描述的原因,数据库直接被 drop database删除.在第一时间停止数据库服务和Web服务,备份MySQL数据目录下的所有文件之后,开始走上数据恢复之路. 第一次干这种事,各种不得法. ...

  3. linux mysql 数据恢复_记一次MySQL删库的数据恢复

    昨天因为不可描述的原因,数据库直接被 drop database删除.在第一时间停止数据库服务和Web服务,备份MySQL数据目录下的所有文件之后,开始走上数据恢复之路. 第一次干这种事,各种不得法. ...

  4. [MySQL]-删库后恢复

    [MySQL]-删库后恢复 sen格 | 2022年11月 本文旨在记录个人在数据库的删库恢复演练过程中的一些总结,如有不足,欢迎指正. 一.恢复场景 1)假设生产实例MySQL端口为:3306 2) ...

  5. mysql删库后恢复数据流程

    目录 前言 binlog 准备 备份 总结 前言 本文将介绍当我们使用mysql不小心删库之后,或者恶意被删库后,如何进行数据恢复 binlog 我们进行数据恢复的前提是: 1.必须开启binlog日 ...

  6. 手把手教你玩 MySQL 删库不跑路,直接把 MySQL 的 binlog 玩溜

    我们常常听人说,只要你愿意,MySQL 可以恢复至半个月甚至一个月以内的任何一个状态.网上也有很多删库跑路的段子... 那么今天松哥想和大家来聊一聊 MySQL 中的 binlog,来手把手教大家如何 ...

  7. 【数据库】mysql删库恢复

    删库跑路撤回手册 1.binlog恢复 1.查看mysql是否开启binlog日志 mysql> show variables like 'log_%'; 2.查看logs文件并查看二进制操作日 ...

  8. MySQL删库数据延迟恢复策略

    stop slave; change master to master_delay = 1800; #1800s后才同步 start slave;

  9. mysqldump全量恢复_删库不跑路-详解MySQL数据恢复

    日常工作中,总会有因手抖.写错条件.写错表名.错连生产库造成的误删库表和数据的事情发生,那么,如果连数据都恢复不了,还要什么 DBA. 相关文章 MySQL备份策略:https://segmentfa ...

最新文章

  1. 使用Powershell将PST导入Exchange 2007
  2. 台式计算机的cpu设置,i7型CPU进行了修改并在台式计算机上使用,这才是真正的计算机之神!...
  3. python——正则表达式
  4. 两路服务器型号,两路服务器 核数
  5. web前端开发职业技能证书_1+x证书web前端开发职业技能等级标准1
  6. OpenCV基本函数使用--Python
  7. 麒麟软件、麒麟操作系统、银河麒麟、中标麒麟、优麒麟、国产操作系统下载。
  8. 虚拟盘可以挂载多个服务器吗,两台云服务器挂载一个云硬盘吗
  9. 干货 | 数字经济创新创业——数字技术创造新经济
  10. 免冠证件照如何制作?制作证件照的简单方法
  11. GetLastError 函数错误信息 代码大全
  12. 夜神模拟器开机全屏并自启动自己的app
  13. 【HTTP劫持和DNS劫持】
  14. pytest.fixture如何像testng的beforeMethod一样使用
  15. 解决CUDA out of memory. Tried to allocate 2.10 GiB (GPU 0; 14.76 GiB total capac
  16. Kafka系统介绍及高性能原理
  17. 文件锁-FileLock
  18. Android studio使用NDK编译和调试(生成so文件)
  19. 数据库——数据操作——单表查询(9)
  20. Ansys-静力学分析-内六角扳手学习心得

热门文章

  1. IDEA输入汉字出现乱码
  2. TMD(弹个车,毛豆新车,蛋蛋订车) 三大网络售车平台谁会走的更远?
  3. Stages—产品开发流程管理解决方案
  4. 将sql server表中的数据导出为inert into语句的形式
  5. 会声会影2022完美收官,2023下个版本再见!
  6. 2019年博客之星评选活动公告:严禁刷票!
  7. 打造前端MAC工作站(六)MAC上的压缩软件,keka和atool
  8. 浏览器推荐 - Vivaldi 1.6浏览器正式发布
  9. LuaStudio破解版闪退解决方案
  10. 如何提升文档编写能力