如何从.myd、.myi、.frm文件中恢复MySQL数据库

199

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


10
虽然我已经回答了这个问题,但它确实更适合在Serverfault上发布。 - derobert
31
@chandrajeet,你应该真的接受最高票的答案。 - Tower
2
嘿,chandrajeet,为什么不接受derobert的答案呢?我确认它对我也有效。难道对你无效吗?http://stackoverflow.com/help/someone-answers - Taz
11个回答

180
如果这些表是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(索引)。
唯一的限制是,如果您正在降级,最好检查发行说明(并可能运行repair table)。新的MySQL版本当然添加了功能。
[虽然应该显而易见,但如果您混合和匹配表,这些表之间关系的完整性是您的问题;MySQL不会关心,但您的应用程序和用户可能会。此方法对InnoDB表根本不起作用。只有MyISAM,但考虑到您拥有的文件,您拥有的是MyISAM]

4
information_schema表并不存在,它们只是对内部数据库状态的一种可视化。请参考http://dev.mysql.com/doc/refman/5.0/en/information-schema.html。 - brian-brazil
5
哇,我感觉很不爽,但是将整个目录从我认为是MySQL4安装的地方放到了我的MySQL5.1中,竟然神奇地重新创建了表格。在Windows上没有重新启动或者其他操作。 - Dave
4
它是有效的,你只需要记得针对每个表运行以下命令:check table sometable;然后运行修复命令(只有在必要时):repair table sometable; - Nux
我无法使用“修复”功能,因为它显示“表XX不存在”。尽管我可以在对象浏览器中看到它,但似乎它无法检测到它。有什么解决办法吗? - Alvaro
4
这个方法很有效!我已经将文件放在了正确位置,但直到我将所有权更改为“mysql:mysql”,mysql才能“看到”它们。 - sean.boyer
显示剩余8条评论

27

请注意,如果您想重建MYI文件,则正确使用REPAIR TABLE的方法是:

REPAIR TABLE sometable USE_FRM;

否则,您很可能会遇到另一个错误。


25

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

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

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


按照以下步骤(在其他所有尝试失败后)并使用innodb_force_recovery = 4级别(不确定在这种情况下是否需要)。谢天谢地! - Joshua Stewardson
6
FYI:"ibdata1" 是 InnoDB,而不是 MyISAM。 - derobert

18

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

将所有的.myd、.myi和.frm文件复制到mysql\data\abc目录下。其中mysql\data\是存放所有数据库的.myd、.myi和.frm文件的地方。

然后打开phpMyadmin,在数据库abc中找到你的数据库。


最短和精确的答案。 - Serak Shiferaw
最佳的数据恢复方式是...我安装了WAMP,然后创建了一个新的数据库,在新的数据库目录C:\WAMP64\bin\mysql\mysqlxx\data\newdatabase中复制文件,打开phpmyadmin和你的新数据库,你将看到数据。 - Alexandre georges
是的,我也用过这种方法来使用XAMPP。安装XAMPP,创建一个同名的新空数据库,将这些文件复制到数据库文件夹中(frm、myd、ibdata...)。然后在本地主机上启动PhpMyAdmin,列出数据库并导出转储文件。最后在生产服务器上进行导入。非常简单易行。 - mira

14

需要注意的一点是:

.FRM文件中包含了表结构,而且它只适用于你所使用的MySQL版本。

.MYD文件并不依赖版本号,至少对于不同的小版本来说是不依赖的。

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

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


11

我找到了一种解决方案,可以将文件转换为.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文件。然后会弹出窗口询问在哪里保存文件

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


这个解决方案在Windows上运行得非常好,谢谢。 - rekotc

7

我认为你可以在mysql内部进行修复myi文件。

如果你看到这些来自MySQL的错误消息: Database failed to execute query (query) 1016: Can't open file: 'sometable.MYI'. (errno: 145) Error Msg: 1034: Incorrect key file for table: 'sometable'. Try to repair it 那么你可能有一个崩溃或损坏的表。

你可以像这样从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 |
+------------------+-------+----------+----------+

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

如果我没有完全相同版本的MySQL,该怎么办? - Jo Sprague

2

以上描述对我来说不足以让事情顺利进行(可能是因为我太愚钝或懒惰了),所以我在找到答案后创建了这个脚本,希望能帮助我将来的工作。希望它也能帮助其他人。

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;

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接