昨晚,我意外删除了 Digital Ocean Droplet 上的生产 MySql 数据库。我立即关闭了 apache 和 MySql。我有以下 ib* 文件:
- ib_buffer_pool
- ib_logfile0
- ib_logfile1
- ibdata1
- ibtmp1
有什么办法可以从这些文件恢复我的数据库吗?有没有人有程序或知道可以重建数据库的程序?如果没有程序,有没有什么方法可以将最新的更改恢复到服务器?
我没有后援。
答案1
抱歉,不是。这些文件来自 innodb 存储引擎,包括日记、日志等。虽然日记确实可以确保数据一致性,但它仅使用元数据来实现这一点 - 因此,如果您没有数据,那么您就无法恢复任何内容。
但这可能并不像看上去那么严重。大多数文件系统都相对容易恢复数据只要你不以任何方式写信。写入可能会覆盖您之前删除的数据。删除后,文件会从“文件系统索引”中移除,而实际数据会保留下来(如果您使用文件系统,则可以使用新数据覆盖这些数据)。
testdisk
是一款出色的文件恢复(恢复删除)实用程序。您还可以使用其他几个实用程序,其中许多是特定于文件系统的。它们应该在未挂载的块设备上运行。因此,如果您想恢复这些数据,您应该立即停止使用此卷,并使用testdisk
或类似工具打开它。您还应该制作底层块设备的映像并从中工作,而不是在原始设备上操作。dd
是一款出色的实用程序。
也许您有某种卷快照?这样您就可以回滚此更改。您还可以使用它在尝试恢复之前对卷的当前状态进行快照,从而避免复制整个块设备。
答案2
首先,我想指出“否”的答案在逻辑上是错误的。因为如果你不知道解决方案,并不意味着它不存在。
现在,主要问题是innodb_file_per_table
,是开启还是关闭。最新版本的默认设置是开启,因此数据很可能与相应*.ibd
文件一起被删除。恢复成功与否很大程度上取决于您多快停止对 MySQL 分区的写入。尽快获取分区映像并使用该映像。我不建议取消删除 *.ibd 文件,事实证明这种方法恢复的数据较少。我怀疑主要原因是文件取消删除工具必须重建文件并可能牺牲包含数据的块。但是,您的目标是恢复记录,因此我建议您改为查找 InnoDB 页面。stream_parser
来自取消删除 InnoDB(我是作者)就是这样做的。请参阅我的博客文章中的分步说明https://twindb.com/recover-after-drop-table-innodb_file_per_table-on/
如果 innodb_file_per_table 处于 OFF 状态,则工作会更容易 - 所有数据都在 ibdata1 中,如果您立即停止 MySQL,则覆盖数据的可能性较小。请关注此帖子以了解这种情况 -https://twindb.com/recover-innodb-table-after-drop-table-innodb/。
在这两种情况下,您都需要恢复架构。您可以从旧备份(如果有)、安装脚本 - 任何类似的东西中获取它。如果您什么都没有,最后的办法是从 InnoDB 字典中恢复架构。它位于 ibdata1 中 - 有关如何执行此操作的帖子https://twindb.com/recover-table-structure-from-innodb-dictionary/。请注意——结构必须100%准确。
总的来说,我必须承认机会很小,但如果你行动迅速并且运气好的话,你可以恢复部分(即使不是全部)数据。
所以,祝你好运。