如何撤消DROP表?


Answers:


12

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

如果您有任何形式的备份(无论多么旧),那么是否通过log-bin选项将二进制日志记录打开到MySQL配置文件(my.ini)中?如果是这样,他们也许可以自上次备份以来恢复。

不好意思,开始一个星期的家伙的方法很抱歉。


2
大概是因为您没有经验,所以我们都做过这种事情,有时还是做(实际上是一周前就将自己锁定在自己的VCenter之外)-重要的是您可以从中学到东西,所以您更少可能会重复。
斩波器

我现在能做什么??我不能坐等!!!!

8
告诉您的经理
Chopper3 2010年

4
它不能解决问题,但是您的开发人员中也许有一个与上一个好的副本相距不太远?
汤姆·奥康纳

3
汤姆提出了一个很好的观点:如果您的开发人员习惯于定期为测试/开发目的而拍摄实时数据的快照,那么您可能很幸运,并且其中一位拥有最近未损坏的副本可以将您的情况从“彻底的灾难”只会带来“重大不便”。
David Spillett

7

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

MySQL删除表后,数据仍会在介质上保留一段时间。因此,您可以获取记录并重建表。稍后,我将在博客上进行介绍,但现在进行简要介绍。

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

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

如果innodb_file_per_table关闭,则停止MySQL。

然后从https://github.com/twindb/undrop-for-innodb/下载并编译InnoDB的拖放工具。有关详细信息,请参见“ 编译TwinDB恢复工具包 ”文章。

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

./stream_parser -f /path/to/diskimage_or_ibdata1

然后恢复InnoDB字典,以了解删除的表在哪个index_id中。

然后采用表结构并获取记录

./c_parser -f pages-diskimage_or_ibdata1/FIL_PAGE_INDEX/00000<index_id>.page

它将记录输出到stdout,将LOAD DATA命令输出到stderr。


您先生救了我的命
Buddhi741 '19

2

这就是我所做的。在mysql目录中(对于Ubuntu,这是/ var / lib / mysql,对于使用Homebrew的Mac,这是/ usr / local / var / mysql),我找到了一些文件。首先,我将包含特定模式的myapp_development /目录复制到本地mysql目录中。然后,备份本地ibdata1,并将服务器的ibdata1复制到mysql目录中。杀死了mysqld。(ps aux然后找到PID kill PID)。重新启动mysql,它以崩溃恢复模式启动。然后启动本地mysql客户端,并生成所需表的完整转储。

并且,保存了15,000行,这些行代表输入我们认为已经永远消失的元数据的工作时间,!!

希望这对某人有帮助。


这是一个不错的努力,但是我肯定不会对这种可靠的技术寄予太多希望。不过,请+1以进行一些创造性思考。
John Gardeniers

是的,你是正确的。最终之所以起作用,是因为我们不小心删除了mysql用户的所有权限,因此该用户对该数据库显示为空。
公爵

2

除了不幸的是,关于需要一个好的备份计划的宝贵经验教训之外,您几乎无能为力。

根据表的类型,您也许可以找到专家,他们可以将数据从磁盘上剩余的数据中整理出来,但是这种法医分析将非常非常非常昂贵(因为它需要相对少见的技能),而且根本无法保证真正有用。


还有其他选择吗?

1
正如FractalizeR所建议的,如果表是简单的MyISAM表,则您可以取消删除与它们关联的文件。如果您想尝试,然后,那么你需要关闭服务器现在因为时间越长,系统激活更多的机会,也就是通过将文件所占用的空间会使得反删除是不可能的(或使未删除的文件已损坏的内容被重用)。如何取消删除取决于所使用的文件系统。ntfsundelete.com是Google搜索NTFS上取消删除的第一个有用的链接。
David Spillett

0

如果这是MyISAM表,则只需取消删除/ var / log / mysql或任何数据目录中的表文件。例如,您可以使用ext3grep实用程序。


ext3grep用于ext3文件系统。如果使用Windows,则不太可能使用ext3文件系统(可能使用的是NTFS,尽管它可能是FAT32)。如果要尝试恢复已删除文件,则无论服务器上正在运行什么其他服务,都需要尽快关闭服务器,因为服务器处于活动状态的时间越长,撤消删除的可能性就越大。你呢
David Spillett

如果在存储MyISAM表的卷上打开了卷影副本,则可以尝试以这种方式将它们恢复。
凯瑟琳·麦金尼斯

要恢复已删除的数据库文件,您可以在Google中搜索“ ntfs undelete”。我不知道数据目录在您的PC上的位置。您需要为此检查my.ini或搜索带有MYD扩展名的文件。
Vladislav Rastrusny 2010年

0

您不能“撤消” DROP TABLE

您可以查看并查看MySQL是否启用了二进制日志记录,也许您可​​以从那里提取一些数据。

除此之外,您可能会忘记MySQL,并且遇到了“我不小心从文件系统中删除了一些文件”这类问题。有一些工具可以尝试恢复文件,也有一些公司会专业地恢复文件。


-1

如果您打开了二进制日志记录,那么如果您具有模式,则可以先重新创建一个表。确保在关闭二进制日志的同时创建架构。或者,您可以跳过该会话。然后,您可以重播binlog,直到最后一个语句是drop table本身。

如果没有,则可以使用备份转储进行还原(如果有)。如果您有csv文件,则可以在infile方法中加载数据以恢复数据。如果要从mysqldump恢复,则可以考虑从转储文件还原单个表,而不是还原完整数据库。如果数据大小太大,则可以考虑在加载之前禁用密钥,这将大大增加还原过程。

为了将来,您可能希望延迟奴隶,比如晚10-24小时。您可以使用percona工具箱创建延迟的从站(pt-slave-delay)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.