Answers:
如果您实际上没有备份,那么我99%肯定您不走运。
如果您有任何形式的备份(无论多么旧),那么是否通过log-bin选项将二进制日志记录打开到MySQL配置文件(my.ini)中?如果是这样,他们也许可以自上次备份以来恢复。
不好意思,开始一个星期的家伙的方法很抱歉。
这个问题比较老,但是没有一个肯定的答案,所以我加一个。
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。
这就是我所做的。在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行,这些行代表输入我们认为已经永远消失的元数据的工作时间,!!
希望这对某人有帮助。
除了不幸的是,关于需要一个好的备份计划的宝贵经验教训之外,您几乎无能为力。
根据表的类型,您也许可以找到专家,他们可以将数据从磁盘上剩余的数据中整理出来,但是这种法医分析将非常非常非常昂贵(因为它需要相对少见的技能),而且根本无法保证真正有用。
如果这是MyISAM表,则只需取消删除/ var / log / mysql或任何数据目录中的表文件。例如,您可以使用ext3grep实用程序。
如果您打开了二进制日志记录,那么如果您具有模式,则可以先重新创建一个表。确保在关闭二进制日志的同时创建架构。或者,您可以跳过该会话。然后,您可以重播binlog,直到最后一个语句是drop table本身。
如果没有,则可以使用备份转储进行还原(如果有)。如果您有csv文件,则可以在infile方法中加载数据以恢复数据。如果要从mysqldump恢复,则可以考虑从转储文件还原单个表,而不是还原完整数据库。如果数据大小太大,则可以考虑在加载之前禁用密钥,这将大大增加还原过程。
为了将来,您可能希望延迟奴隶,比如晚10-24小时。您可以使用percona工具箱创建延迟的从站(pt-slave-delay)