如何撤消 DROP Table?

如何撤消 DROP Table?

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

答案1

如果您真的没有备份,那么我 99% 确信您运气不佳。

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

老兄,这周的开始方式很糟糕,抱歉。

答案2

这个问题相当老了,但是没有一个肯定的答案,所以我来添加一个。

MySQL 删除表后,数据仍会在媒体上保留一段时间。因此,您可以获取记录并重建表。稍后我会在博客中介绍这一点,但现在先快速概述一下。

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

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

如果 innodb_file_per_table OFF 那么就停止 MySQL。

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

然后使用 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。[1]:https://twindb.com/how-to-recover-innodb-dictionary/

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

答案3

这是我所做的。在 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 行记录代表了数周的元数据输入工作,现在却被保存了下来!!

希望这对某人有帮助。

答案4

您无法“撤消” DROP TABLE

你可以看看 MySQL 是否有二进制日志启用后,也许您可​​以从那里提取一些数据。

除此之外,您可以忘记 MySQL,并面临“我意外从文件系统中删除了一些文件”的同类问题。有一些工具可以尝试恢复文件,也有一些公司专业地提供此类服务。

相关内容