如何撤消DROP表?

11 mysql database

我不小心丢了所有表。我可以恢复回来吗?我没有备份副本。

Cho*_*er3 13

如果您实际上没有备份,那么我 99% 肯定您不走运。

如果您确实有任何形式的备份,无论多旧,那么您是否通过 log-bin 选项在 MySQL 配置文件 (my.ini) 中打开了二进制日志记录?如果是这样,您可能能够从上次备份后恢复。

糟糕的一周开始方式,对不起。

  • 告诉你的经理 (8认同)
  • 它并没有解决问题,但也许您的开发人员中的一个副本与上一个好的副本相距不远? (4认同)
  • Tom 提出了一个很好的观点:如果您的开发人员习惯于定期拍摄实时数据的快照以用于测试/开发目的,那么您可能很幸运,并且他们中的一个有足够的最新未受破坏的副本,可以将您的情况从“彻底的灾难”到“重大的不便”。 (3认同)
  • 大概是因为你没有经验,我们都做过这种事情,有时仍然这样做(事实上一周前我把自己锁在自己的 VCenter 之外)——重要的是你从中学习,这样你就少了可能会重复。 (2认同)

aku*_*sky 8

这个问题比较老了,但没有一个肯定的答案,所以我会添加一个。

在 MySQL 删除一个表后,数据仍然在媒体上一段时间。因此,您可以获取记录并重建表。稍后我将在博客上介绍它,但现在快速草图。

您需要拥有表的结构(CREATE TABLE 语句)。

如果 innodb_file_per_table 为 ON,则删除的表位于磁盘分区上。尽快停止 MySQL 并将其重新挂载为只读。如果 MySQL 位于根分区上(顺便说一句,这不是一个好主意),则拍摄映像或取出磁盘并插入另一台服务器。换句话说,停止所有写入。

如果 innodb_file_per_table 关闭,则停止 MySQL。

然后从https://github.com/twindb/undrop-for-innodb/下载并编译 InnoDB 的 un-drop 工具。查看“[编译 TwinDB 恢复工具包][1]”帖子了解详细信息。

然后使用 stream_parser 解析磁盘分区或 ibdata1(取决于 innodb_file_per_table 设置):

./stream_parser -f /path/to/diskimage_or_ibdata1
Run Code Online (Sandbox Code Playgroud)

然后恢复 InnoDB 字典以知道删除的表在哪个 index_id 中。

然后取表结构并获取记录

./c_parser -f pages-diskimage_or_ibdata1/FIL_PAGE_INDEX/00000<index_id>.page
Run Code Online (Sandbox Code Playgroud)

它会将记录输出到 stdout,并将 LOAD DATA 命令输出到 stderr。[1]:https : //twindb.com/how-to-recover-innodb-dictionary/

关于 Undrop For InnoDB 的 PS 视频教程 - Undrop for InnoDB 概述https://youtu.be/-1LeLhGjAWM

  • 先生你救了我的命 (2认同)

Dav*_*ett 2

不幸的是,除了吸取有关良好备份计划的必要性的非常宝贵的教训之外,您无能为力。

根据表类型,您也许能够找到一位专家,他可以将数据从光盘上留下的内容重新拼凑在一起,但这种取证分析将非常非常昂贵(因为它需要相对不常见的技能)并且根本无法保证才能真正有用。