![MySQL 数据恢复(innoDB)- 缺少 .frm 文件但 ibdata 完整](https://linux22.com/image/521104/MySQL%20%E6%95%B0%E6%8D%AE%E6%81%A2%E5%A4%8D%EF%BC%88innoDB%EF%BC%89-%20%E7%BC%BA%E5%B0%91%20.frm%20%E6%96%87%E4%BB%B6%E4%BD%86%20ibdata%20%E5%AE%8C%E6%95%B4.png)
最近一次服务器故障让我的 ibdata 文件看起来完好无损,但包含 .frm 的目录却只剩下一半。我已将所有这些复制到全新安装的 mysql 中,并成功恢复了仍有 .frm 文件的数据库。我的问题是 - 能否以某种方式从 ibdata 文件重新生成 .frm 文件?或者以某种方式修改同一数据库开发版本的 .frm 文件,以便可以使用它们进行恢复?
不幸的是,从备份恢复不是一个可行的选择。
编辑以澄清:我尝试使用包含相同模式的本地生成的.frm 文件来恢复数据库 - 没有成功,即使在 innodb_force_recovery = 1 时也是如此。
答案1
我从来没有真正这样做过,但你的问题与我使用的工具有关,所以我很好奇!看起来这实际上是可能的,下面是一个例子:
http://www.chriscalender.com/?p=28
有时您可能需要在只有 .ibd 文件的情况下恢复表。在这种情况下,如果您尝试将其加载到新实例中,则可能会遇到一些有关表 ID 不匹配的错误。而且实际上没有办法解决这个问题。
不过,我找到了两种解决方法:
注意:您将需要 .ibd 文件和要使用这些方法恢复的每个表的 CREATE TABLE 语句。
- 模拟内部 InnoDB 表计数器。即创建工作表(启用 innodb_file_per_table),直到表 id 的内部指针等于 (1 – id_of_ibd_table_you_need_to_restore)。(参见方法 #1)
- 手动对 .ibd 文件进行十六进制编辑,更改表 ID。(参见方法 2)
这些步骤本身有好几页长,所以我没有把它们粘贴在这里。
另一篇相关文章:http://www.mysqlperformanceblog.com/2011/05/13/connecting-orphaned-ibd-files/
我很好奇这是否有效,看起来已经有很多人成功使用了它。