【问题标题】:How to recover MySQL database from .myd, .myi, .frm files如何从 .myd、.myi、.frm 文件中恢复 MySQL 数据库
【发布时间】:2010-10-27 02:56:45
【问题描述】:

如何从.myd.myi.frm 文件恢复我的 MySQL 数据库之一?

【问题讨论】:

  • 虽然我回答了这个问题,但它确实属于Serverfault。
  • @chandrajeet 你真的应该接受投票最多的答案。
  • 嘿chandrajeet,你为什么不接受derobert的回答?我确认它也适用于我。不适合你吗? stackoverflow.com/help/someone-answers

标签: mysql recovery


【解决方案1】:

如果这些是 MyISAM 表,则将 .FRM、.MYD 和 .MYI 文件放入数据库目录(例如,/var/lib/mysql/dbname)将使该表可用。它不必是来自相同的数据库、相同的服务器、相同的 MySQL 版本或相同的架构。您可能还需要更改文件夹的所有权(例如,chown -R mysql:mysql /var/lib/mysql/dbname

请注意,权限(GRANT 等)是 mysql 数据库的一部分。因此它们不会与表格一起恢复;您可能需要运行适当的GRANT 语句来创建用户、授予访问权限等(可以恢复mysql 数据库,但您需要注意MySQL 版本和mysql_upgrade 实用程序的任何需要运行。 )

实际上,您可能只需要 .FRM(表结构)和 .MYD(表数据),但您必须修复表以重建 .MYI(索引)。

唯一的限制是,如果您要降级,最好检查发行说明(并且可能运行修复表)。当然,较新的 MySQL 版本增加了功能。

[虽然应该很明显,如果你混合和匹配表,这些表之间关系的完整性是你的问题; MySQL 不会在意,但您的应用程序和您的用户可能会。此外,此方法根本不适用于 InnoDB 表。只有 MyISAM,但考虑到你拥有的文件,你有 MyISAM]

【讨论】:

  • 如果不向 information_schema 表中添加适当的条目,这真的可行吗?我的意思是 MySQL 需要知道查找这些文件对吗?
  • information_schema 表实际上并不存在,它们只是内部数据库状态的视图。见dev.mysql.com/doc/refman/5.0/en/information-schema.html
  • 哇,我感觉很脏,但是将整个目录从我认为是 MySQL4 安装的目录中删除到我的 MySQL5.1 中,只是神奇地重新创建了表。没有重启或任何东西(在 Windows 上)。
  • 它工作你只需要记住运行(对于每个表):check table sometable; 然后运行修复(仅在需要时):repair table sometable;
  • 这很棒!我已将文件放置到位,但 mysql 并没有“看到”它们,直到我将所有权更改为“mysql:mysql”。
【解决方案2】:

请注意,如果您要重建 MYI 文件,那么 REPAIR TABLE 的正确用法是:

修复表某个表 USE_FRM;

否则你可能会得到另一个错误。

【讨论】:

    【解决方案3】:

    我刚刚发现了解决方案。我在 Windows 7 上使用 MySQL 5.1 或 5.6。

    1. 从位于“C:\Program Data\MySQL\MSQLServer5.1\Data”的旧文件中复制 .frm 文件和 ibdata1
    2. 停止当前 SQL 实例中的 SQL Server 实例
    3. 转到位于“C:\Program Data\MySQL\MSQLServer5.1\Data”的数据文件夹
    4. 从您要恢复的文件中粘贴 ibdata1 和包含 .frm 文件的数据库的文件夹。
    5. 启动 MySQL 实例。

    此恢复无需查找 .MYI 和 .MYD 文件。

    【讨论】:

    • 按照这些步骤(在其他一切都失败之后)并使用innodb_force_recovery = 4 级别(不确定在这种情况下是否需要)。谢天谢地!
    • 仅供参考:ibdata1 是 InnoDB,而不是 MyISAM。
    【解决方案4】:

    简单!创建一个虚拟数据库(比如 abc)

    将所有这些.myd、.myi、.frm 文件复制到mysql\data\abc,其中mysql\data\ 是所有数据库的.myd、.myi、.frm 的存储位置。

    然后去 phpMyadmin,去 db abc 你找到你的数据库。

    【讨论】:

    • 最短准确的答案
    • 恢复数据的最佳方式...我安装了WAMP,然后新建了一个数据库,将文件复制到新的数据库目录C:\WAMP64\bin\mysql\mysqlxx\data\newdatabase open phpmyadmin 和你的新数据库,你会看到数据
    • 是的,我在 XAMPP 中也使用过这种方式。安装 XAMPP,创建新的同名空数据库,将这些文件复制到数据库文件夹(frm、myd、ibdata...)。然后在 localhost 上启动 PhpMyAdmin,列出数据库并导出转储文件。并在实时服务器上导入。就像一个魅力一样工作。
    【解决方案5】:

    需要注意的一点:

    .FRM 文件中包含您的表结构,并且特定于您的 MySQL 版本。

    .MYD 文件不是特定于版本的,至少不是次要版本。

    .MYI 文件是特定的,但可以省略并使用REPAIR TABLE 重新生成,就像其他答案所说的那样。

    这个答案的重点是让您知道,如果您有表的模式转储,那么您可以使用它来生成表结构,然后用您的备份替换那些 .MYD 文件,删除 MYI 文件,并修复它们。通过这种方式,您可以将备份恢复到另一个 MySQL 版本,或者完全移动您的数据库,而无需使用 mysqldump。我发现这在移动大型数据库时非常有用。

    【讨论】:

      【解决方案6】:

      我找到了将文件转换为.sql 文件的解决方案(然后您可以将.sql 文件导入服务器并恢复数据库),而无需访问/var 目录,因此您不需要也需要成为服务器管理员才能执行此操作。

      它确实需要在您的计算机上安装 XAMPP 或 MAMP。

      • 安装 XAMPP 后,导航到安装目录(通常为 C:\XAMPP)和子目录 mysql\data。完整路径应为C:\XAMPP\mysql\data
      • 您将在其中看到您创建的任何其他数据库的文件夹。将包含 .myd.myi.frm 文件的文件夹复制并粘贴到那里。该文件夹的路径应该是

        C:\XAMPP\mysql\data\foldername\.mydfiles

      • 然后在浏览器中访问localhost/phpmyadmin。选择您刚刚粘贴到mysql\data 文件夹中的数据库,然后单击导航栏中的导出。选择将其导出为.sql 文件。然后它会弹出询问保存文件的位置

      就是这样!您(应该)现在有一个 .sql 文件,其中包含最初为 .myd.myi.frm 文件的数据库。然后,您可以通过 phpMyAdmin 将其导入到另一台服务器,方法是创建一个新数据库并在导航栏中按“导入”,然后按照步骤导入它

      【讨论】:

      • 此解决方案在 Windows 中运行良好,谢谢。
      【解决方案7】:

      我认为.myi你可以从mysql内部修复。

      如果您从 MySQL 中看到这些类型的错误消息: 数据库无法执行查询(查询)1016:无法打开文件:'sometable.MYI'。 (错误号:145) 错误消息:1034:表的密钥文件不正确:'sometable'。尝试修复它 那么b 你可能有一个崩溃或损坏的表。

      您可以像这样从 mysql 提示符检查和修复表:

      check table sometable;
      +------------------+-------+----------+----------------------------+
      | Table | Op | Msg_type | Msg_text | 
      +------------------+-------+----------+----------------------------+ 
      | yourdb.sometable | check | warning | Table is marked as crashed | 
      | yourdb.sometable | check | status | OK | 
      +------------------+-------+----------+----------------------------+ 
      
      repair table sometable;
      +------------------+--------+----------+----------+ 
      | Table | Op | Msg_type | Msg_text | 
      +------------------+--------+----------+----------+ 
      | yourdb.sometable | repair | status | OK | 
      +------------------+--------+----------+----------+
      

      现在你的桌子应该没问题了:

      check table sometable;
      +------------------+-------+----------+----------+ 
      | Table | Op | Msg_type | Msg_text |
      +------------------+-------+----------+----------+ 
      | yourdb.sometable | check | status | OK |
      +------------------+-------+----------+----------+
      

      【讨论】:

        【解决方案8】:

        您可以将文件复制到数据文件夹的适当命名的子目录目录中,只要它与 mySQL 的版本完全相同,并且您在该目录中保留了所有相关文件。如果您没有所有文件,我很确定您会遇到问题。

        【讨论】:

        • 如果我没有完全相同版本的 MySQL,我该怎么办?
        【解决方案9】:

        http://forums.devshed.com/mysql-help-4/mysql-installation-problems-197509.html

        它说要重命名 ib_* 文件。我已经完成了,它还给了我数据库。

        【讨论】:

          【解决方案10】:

          以上描述不足以让事情为我工作(可能是密集或懒惰),所以一旦我找到了对我未来有帮助的答案,我就创建了这个脚本。希望对其他人有所帮助

          vim fixperms.sh 
          
          #!/bin/sh
          for D in `find . -type d`
          do
                  echo $D;
                  chown -R mysql:mysql $D;
                  chmod -R 660 $D;
                  chown mysql:mysql $D;
                  chmod 700 $D;
          done
          echo Dont forget to restart mysql: /etc/init.d/mysqld restart;
          

          【讨论】:

            【解决方案11】:

            对于那些安装了 Windows XP 并安装了 MySQL 服务器 5.5 - 数据库的位置是 C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.5\data,除非您在MySql Workbench 安装界面。

            【讨论】:

            • 问题是关于从特定文件类型中恢复,而不是在 Windows XP MySQL 5.5 上可以找到这些文件的位置。
            猜你喜欢
            • 1970-01-01
            • 2013-05-07
            • 2012-03-12
            • 1970-01-01
            • 2014-08-13
            • 2012-11-01
            • 1970-01-01
            • 1970-01-01
            • 2020-08-06
            相关资源
            最近更新 更多