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


183

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


10
尽管我回答了这个问题,但它确实属于Serverfault。
德罗伯特

31
@chandrajeet,您应该真正接受投票最多的答案。

2
嘿,钱德拉吉特,你为什么不接受德罗伯特的回答?我确认它也对我有效。不是吗?stackoverflow.com/help/someone-answers
塔兹(Taz)2015年

Answers:


173

如果这些是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需要知道查找这些文件,对吗?
Zenshai

4
information_schema表实际上并不存在,它们只是内部数据库状态的视图。参见dev.mysql.com/doc/refman/5.0/en/information-schema.html
brian-brazil 2009年

4
哇,我感觉很脏,但是将整个目录从我认为是MySQL4的安装放到MySQL5.1中,只是神奇地重新创建了表。没有重新启动或任何操作(在Windows上)。
戴夫

4
它可以正常工作,您只需要记住运行(针对每个表): check table sometable; 然后运行修复(仅在需要时):repair table sometable;
Nux 2010年

3
这很棒!我已经将文件放置到位,但是直到将所有权更改为“ mysql:mysql”,mysql才“看到”它们。
sean.boyer 2014年

26

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

修复表sometable USE_FRM;

否则,您可能只会得到另一个错误。


24

我刚刚发现解决方案。我在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关卡(不确定在这种情况下是否需要这样做)。谢天谢地!
约书亚·史蒂文斯

6
仅供参考:ibdata1是InnoDB,不是MyISAM。
derobert

14

需要注意的一件事:

.FRM文件具有您的表结构,并且特定于您的MySQL版本。

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

.MYI文件是特定的,但可以REPAIR TABLE像其他答案一样被忽略并重新生成。

该答案的重点是让您知道,如果您有表的模式转储,则可以使用它来生成表结构,然后用备份替换那些.MYD文件,删除MYI文件并进行修复。所有。这样,您可以将备份还原到另一个MySQL版本,或者完全不使用来移动数据库mysqldump。我发现在移动大型数据库时,此超级有用。


14

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

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

然后转到phpMyadmin,转到db abc,然后找到您的数据库。


最短,最准确的答案
Serak Shiferaw

恢复数据的最佳方法...我安装了WAMP,然后创建了一个新数据库,将文件复制到新数据库目录C:\ WAMP64 \ bin \ mysql \ mysqlxx \ data \ newdatabase中,打开phpmyadmin和您的新数据库,您将查看数据
Alexandre georges

7

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

如果您从MySQL中看到以下类型的错误消息:数据库无法执行查询(查询)1016:无法打开文件:'sometable.MYI'。(错误号:145)错误消息:1034:表“ sometable”的密钥文件不正确。尝试修复它,然后可能表已损坏或损坏。

您可以从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 |
+------------------+-------+----------+----------+

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将其导入到另一台服务器:


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

对于具有Windows XP和MySQL Server 5.5的用户-数据库的位置为C:\ Documents and Settings \ All Users \ Application Data \ MySQL \ MySQL Server 5.5 \ data,除非您在MySql Workbench安装中更改了位置GUI。


3
问题是关于从特定文件类型恢复,而不是在Windows XP MySQL 5.5上可以找到这些文件的位置。
Danpe 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.