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

Posted

技术标签:

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

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

【问题讨论】:

虽然我回答了这个问题,但它确实属于Serverfault。 @chandrajeet 你真的应该接受投票最多的答案。 嘿chandrajeet,你为什么不接受derobert的回答?我确认它也适用于我。不适合你吗? ***.com/help/someone-answers 【参考方案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。

    从位于“C:\Program Data\MySQL\MSQLServer5.1\Data”的旧文件中复制 .frm 文件和 ibdata1 停止当前 SQL 实例中的 SQL Server 实例 转到位于“C:\Program Data\MySQL\MSQLServer5.1\Data”的数据文件夹 从您要恢复的文件中粘贴 ibdata1 和包含 .frm 文件的数据库的文件夹。 启动 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 上可以找到这些文件的位置。

以上是关于如何从 .myd、.myi、.frm 文件中恢复 MySQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

用(*.frm *.MYD *.MYI)文件恢复MySql数据库

使用(*.frm *.MYD *.MYI)文件恢复MySql数据库

mysql中的data下的数据文件(.FRM.MYD.MYI)恢复为数据

如何将frm格式MYD格式MYI格式文件导入MySQL中

mysql-.frm,.myd,myi备份如何导入mysql

.opt,frm,.MYD,.MYI文件如何转为.sql文件?