我不小心丢掉了所有的桌子。 我可以恢复吗? 我没有备份副本。
如果你真的没有备份,那么我99%肯定你运气不好。
如果你确实有任何forms的备份,那么你是否已经通过log-bin选项打开了二进制日志到MySQLconfiguration文件(my.ini)? 如果是这样,他们可能能够从上次备份以来恢复。
糟糕的方式开始一个星期哥们,对不起。
这个问题相当老,但没有一个肯定的答案,所以我会加一个。
MySQL删除一个表后,数据仍在媒体上一会儿。 所以你可以获取logging并重build表格。 稍后我会写博客,但现在快速草图。
你需要有你的表的结构(CREATE TABLE语句)。
如果innodb_file_per_table为ON,则删除的表位于磁盘分区上。 停止MySQL并重新安装它作为只读ASAP。 如果MySQL位于根分区(这不是个好主意btw),则可以拍摄一张映像或将磁盘取出并插入另一台服务器。 换句话说,停止所有的写入。
如果innodb_file_per_tableclosures,那么就停止MySQL。
然后从https://github.com/twindb/undrop-for-innodb/下载并编译InnoDB的卸载工具。 查看“ 编译TwinDB恢复工具包 ”的文章了解详情。
然后使用stream_parserparsing磁盘分区或ibdata1(取决于innodb_file_per_table设置):
./stream_parser -f /path/to/diskimage_or_ibdata1
然后恢复InnoDB字典来知道被删除的表是哪个index_id。
然后采取表结构并获取logging
./c_parser -f pages-diskimage_or_ibdata1/FIL_PAGE_INDEX/00000<index_id>.page
它将输出logging到标准输出,并将LOAD DATA命令输出到标准错误。
不幸的是,你可以做的很less,除了拿出一个非常有价值的less了一个好的备份计划的需要。
根据表格的types,你可能会find一位专家,他们可以将数据从光盘上留下来,但是这样的鉴定分析将非常昂贵(因为这需要相对不常见的技能),而且完全没有保证真正有用。
这是我做的。 在mysql目录中(对于Ubuntu,这是/ var / lib / mysql,对于使用Homebrew的这是/ usr / local / var / mysql),我find了一些文件。 首先,我将包含特定模式的myapp_development /目录复制到我的本地mysql目录中。 然后我备份了我的本地ibdata1,并将服务器的ibdata1复制到mysql目录中。 杀死了mysqld。 ( ps auxfindPID,然后kill PID )。 重新启动mysql,它以崩溃恢复模式启动。 然后激发我的本地mysql客户端,并生成我需要的表的完整转储。
而且,代表几周工作的15,000行input了元数据,我们认为这些行已经永远消失了!
希望这有助于某人。
如果这是MyISAM表,您只需要取消删除/ var / log / mysql中的表格文件或任何您的数据目录。 例如,你可以使用ext3grep工具。
您不能“撤消” DROP TABLE 。
你可以看看MySQL是否启用了二进制日志logging ,也许你可以从那里提取一些数据。
除此之外,你可以忘记MySQL,并在“我不小心从我的文件系统中删除了一些文件”的同类问题。 有一些工具可以恢复文件,还有一些公司是专业的。
如果打开了二进制日志logging,那么如果有架构,则可以先重新创build一个表。 确保在closuresbinlog时创build模式。 或者你可以跳过会议。 然后,您可以重放binlog直到最后一个语句是drop table本身。
如果没有,那么你可以使用备份转储进行恢复,如果有的话。 如果你有csv文件,那么你可以加载数据infile方法来恢复数据。 如果您正在从mysqldump恢复,那么您可以考虑从转储文件中恢复单个表,而不是恢复完整的数据库。 如果数据太大,那么在加载之前可能会考虑禁用密钥,这将显着增加恢复过程。
为了将来你可能会喜欢有一个延迟的奴隶,像10-24小时后面。 您可以使用percona工具包(pt-slave-delay)创build延迟的从站