MySQL错误1017(HY000):无法找到文件:'./"DatabaseName/Table.frm'(errno: 13)

5 浏览
0 Comments

MySQL错误1017(HY000):无法找到文件:'./"DatabaseName/Table.frm'(errno: 13)

你能通过简单地复制.frm文件来创建表的副本吗?

我打算做类似这样的事情:

假设我的数据库名字是mydb,它有一个叫做mytab的表。

在文件系统中浏览到名为mydb的文件夹,里面有一个mytab.frm文件。

然后将mytab.frm的内容复制到一个名为copy.frm的文件中。

然后我登录到mysql并运行以下命令:

use mydb;  //选择数据库mydb
show tables; //查看表的列表。我可以看到名为copy的表。
select * from copy; //这会抛出标题中提到的错误。

那么我错过了什么?备份数据库时需要复制哪些文件?

我知道可以通过几个SQL语句来复制表,但我想学点新东西,所以我在尝试一些实验。谢谢! 🙂

0
0 Comments

MySQL错误1017(HY000):无法找到文件:“./“DatabaseName / Table.frm”(errno:13)的出现原因可能是由于权限问题。为了解决这个问题,您可以执行以下步骤:

1. 复制三个文件:copy.frm,copy.MYD和copy.MYI

2. 为文件设置权限,所有者和组

   chown mysql.mysql copy.*
   chmod 660 copy.*
   

3. 在MySQL中刷新表:

   mysql DATABASE
   mysql> flush tables;
   

除非是InnoDB表,否则这些步骤应该可以解决问题。在InnoDB表中,所有表都存储在一个文件中,没有.MYD或.MYI文件。为了复制InnoDB表,您需要使用SQL语句来执行复制操作。所以,如果您尝试复制.frm文件,就会遇到上述错误。

0
0 Comments

MySQL错误1017 (HY000): 无法找到文件: './"数据库名/表.frm' (errno: 13)的出现原因是由于尝试通过直接修改底层文件来复制/移动MySQL表,这在某些情况下是可能的,但是强烈不推荐这样做。应该始终使用MySQL命令来完成。

.frm文件仅包含表的定义,数据和索引存储在其他文件中,并且它们取决于表的存储引擎。

对于MyISAM存储引擎,每个表在磁盘上存储为三个文件,其中.frm文件存储表的格式,.MYD文件存储数据,.MYI文件存储索引。

对于InnoDB存储引擎,默认情况下,每个新创建的InnoDB表及其关联的索引存储在单独的文件中。当innodb_file_per_table选项被禁用时,InnoDB将所有的表和索引存储在单个系统表空间中。

MySQL在数据库目录中的.frm文件中存储表的数据字典信息。与其他MySQL存储引擎不同,InnoDB还将关于表的信息编码在其自己的内部数据字典中。当MySQL删除表或数据库时,它不仅删除一个或多个.frm文件,还删除相应的InnoDB数据字典中的条目。因此,不能通过移动.frm文件来在数据库之间移动InnoDB表。

根据表的存储引擎和innodb_file_per_table设置的情况,可以采取不同的复制/移动表的方法:

- 如果要复制的表使用的是MyISAM引擎,则需要复制/重命名与表同名的.frm、.MYD和.MYI文件。

- 如果要复制的表使用的是InnoDB引擎,并且在创建表时innodb_file_per_table设置为ON,则需要复制/重命名与表同名的.frm和.ibd文件。

- 如果要复制的表使用的是InnoDB引擎,并且在创建表时innodb_file_per_table设置为OFF,则无法从MySQL外部复制或移动表数据。

- 如果要复制的表使用的是MEMORY表,则只需复制.frm文件并重新启动服务器。表的数据和索引存储在内存中,没有文件存储它们,服务器重启后源表将为空,因此可以获得一个空表的精确副本。

值得注意的是,如果要复制的服务器是复制集群的一部分,那么通过更改底层文件进行复制的更改要么被忽略(如果更改从属服务器,则不会传播到集群中的其他服务器),要么会破坏复制(如果更改主服务器,则需要查询和更新从属服务器上不存在的表)。

总之,尽管在某些情况下,通过更改底层文件来复制或移动表是可能的,但是强烈不推荐这样做。正确(也是许多情况下唯一)复制表的方法是使用MySQL提供的命令。

可以使用"CREATE TABLE new_tbl LIKE orig_tbl;"创建一个基于另一个表的定义的空表,并且可以使用"INSERT INTO `new_tbl` SELECT * FROM `orig_tbl`"来复制数据。

另一种复制表的方法是使用mysqldump导出表的定义和数据,使用文本编辑器打开导出文件,在文件中将表名更改为所需的名称,保存文件,并使用mysql命令行工具(或其他MySQL客户端)将其导入到数据库中。

0
0 Comments

MySQL错误1017 (HY000): 无法找到文件:'./"DatabaseName/Table.frm' (errno: 13) 的原因是在InnoDB表中尝试的操作是无法实现的。InnoDB将所有表数据存储在一个单独的文件中 - ibdata。可以通过my.cnf中的innodb_file_per_table设置进行修改,但它不是具有追溯性的,它只适用于新表。即使设置了每个表一个文件,也不应该尝试直接复制数据文件,因为InnoDB可能尚未将所有更改从ib_logfile刷新到ibdata/.ibd文件中,因此可能会导致数据损坏。

对于MyISAM表,可以这样做,但不应该这样做(还有其他文件需要复制,因为.FRM只是表的定义。.MYD文件包含数据,.MYI文件包含索引)。为什么?因为你将你的数据交给了一个数据库,你应该使用数据库工具来复制它。唯一应该直接操作数据文件的情况是在数据恢复期间,且服务器未运行时 - 你不希望在文件被写入时复制文件。

要复制一个表,只需执行以下操作:create table new_table as select * from old_table

要备份整个数据库,可以使用mysqldump或其他可用的备份工具。

以上就是解决这个问题的方法。这个答案解决了所有问题!太棒了!谢谢。我不知道谁给你点了踩,但我给你点了赞并选择了你的答案作为我的解决方案!:D

CREATE TABLE AS SELECT不会创建一个精确的表副本。新表只从旧表中复制字段名(实际上,它们是从SELECT产生的结果集中复制的);字段的类型与源表中的大致相同,但是细节(有符号/无符号、长度、可空、默认值)不会被复制(因为它们不在源结果集中出现)。新表不会创建索引。

0