MySQL数据库中丢失了一些文件。如何以适当的方式重新创建它?

MySQL数据库中丢失了一些文件。如何以适当的方式重新创建它?,mysql,Mysql,问题是,MySQL数据库中的一个MYI和一个MYD文件被意外删除。唯一保存完好的文件是FRM one。整个数据库中只有一个表以这种方式损坏,所有其他表都正常,数据库工作正常,但带有已删除文件的表除外,该表显然无法访问 有一个纯SQL格式的完整数据库转储可用 问题是,如何以安全和适当的方式重新创建这些文件和表 我的第一个想法是从转储中提取完整的createtable命令,并在实时数据库上运行它。这并不容易,因为整个转储文件的容量超过10GB,所以其内容中的任何操作都非常痛苦。是的,我知道 SED并

问题是,MySQL数据库中的一个MYI和一个MYD文件被意外删除。唯一保存完好的文件是FRM one。整个数据库中只有一个表以这种方式损坏,所有其他表都正常,数据库工作正常,但带有已删除文件的表除外,该表显然无法访问

有一个纯SQL格式的完整数据库转储可用

问题是,如何以安全和适当的方式重新创建这些文件和表

我的第一个想法是从转储中提取完整的
createtable
命令,并在实时数据库上运行它。这并不容易,因为整个转储文件的容量超过10GB,所以其内容中的任何操作都非常痛苦。是的,我知道<代码> SED并知道如何使用它。但我认为这是最后的选择。

第二个也是当前的想法是在独立服务器上创建此数据库的副本,转储相关表,然后使用生成的SQL文件在生产服务器上再次创建表。我对MySQL管理任务没有太多经验(好吧,只是一些基本的任务),但是对我来说这个选项似乎是安全和合理的

  • 第二种选择会像我预期的那样有效吗
  • 这是最好的选择,还是有更多值得推荐的解决方案

  • 提前感谢您的帮助。

    最简单的解决方案是复制您删除的表。mysqld可能仍然有一个打开的文件句柄来处理您删除的数据文件。在UNIX/Linux/OS X上,当某个进程仍然有一个打开的文件句柄时,文件并没有真正被删除

    因此,您可以这样做:

    mysql> CREATE TABLE mytable_copy LIKE mytable;
    mysql> INSERT INTO mytable_copy SELECT * FROM mytable;
    
    如果在删除文件后重新启动了MySQL服务器,则此操作将不起作用。如果服务器已关闭其数据文件的文件句柄,则此操作将不起作用。如果你在Windows上,我不知道

    下一个最简单的解决方案是将现有10GB转储文件恢复到MySQL服务器的临时实例,如您所说。我会使用,但有些人会使用虚拟机,或者如果您使用的是AWS环境,请启动spot EC2实例或小型RDS实例

    然后只转储所需的表:

    mysqldump -h tempserver mydatabase mytable > mytable.sql
    
    然后将其恢复到真实服务器

    mysql -h realserver mydatabase < mytable.sql
    
    mysql-h realserver mydatabase

    (我省略了用户和密码选项,我更喜欢将它们放在
    .my.cnf
    中)

    最简单的解决方案是复制删除的表。mysqld可能仍然有一个打开的文件句柄来处理您删除的数据文件。在UNIX/Linux/OS X上,当某个进程仍然有一个打开的文件句柄时,文件并没有真正被删除

    因此,您可以这样做:

    mysql> CREATE TABLE mytable_copy LIKE mytable;
    mysql> INSERT INTO mytable_copy SELECT * FROM mytable;
    
    如果在删除文件后重新启动了MySQL服务器,则此操作将不起作用。如果服务器已关闭其数据文件的文件句柄,则此操作将不起作用。如果你在Windows上,我不知道

    下一个最简单的解决方案是将现有10GB转储文件恢复到MySQL服务器的临时实例,如您所说。我会使用,但有些人会使用虚拟机,或者如果您使用的是AWS环境,请启动spot EC2实例或小型RDS实例

    然后只转储所需的表:

    mysqldump -h tempserver mydatabase mytable > mytable.sql
    
    然后将其恢复到真实服务器

    mysql -h realserver mydatabase < mytable.sql
    
    mysql-h realserver mydatabase

    (我省略了用户和密码选项,我更喜欢把它们放在
    .my.cnf
    中)

    是的,第二个选项会起作用,对我来说似乎是你最好的选项。它就像一个符咒。快速、轻松、优雅。谢谢你的支持。是的,第二种选择很有效,对我来说似乎是你最好的选择。它很有魅力。快速、轻松、优雅。感谢您的支持。尽管MySQL服务器没有停止,但第一个选项不幸没有起作用。OpenBSD,如果它有什么关系的话。但第二个解决方案很有魅力。快速、轻松、优雅。谢谢你的支持。是的,这只是一个机会。MySQL可能会不时自行关闭文件句柄。不幸的是,尽管MySQL服务器没有停止,但第一个选项不起作用。OpenBSD,如果它有什么关系的话。但第二个解决方案很有魅力。快速、轻松、优雅。谢谢你的支持。是的,这只是一个机会。MySQL可能会不时自行关闭文件句柄。