46

我正在尝试运行一个相当大的查询,该查询应该每晚运行以填充表。我收到一条错误消息,Incorrect key file for table '/var/tmp/#sql_201e_0.MYI'; try to repair it但我正在使用的存储引擎(我猜是什么默认值?)不支持修复表。

我该如何解决这个问题,以便我可以运行查询?

4

12 回答 12

58

您必须将 MySQL 的临时文件夹(大多数情况下为“/tmp”)的位置更改为具有更大磁盘空间的位置。在 MySQL 的配置文件中更改它。

基本上,您的服务器用完了 /tmp 所在的磁盘空间。

于 2010-11-02T07:48:49.000 回答
48

您需要从 MySQL 提示符运行此命令:

REPAIR TABLE tbl_name USE_FRM;

来自MySQL 关于修复命令的文档

如果.MYI 索引文件丢失或其标头已损坏,则可以使用 USE_FRM 选项。此选项告诉 MySQL 不要信任 .MYI 文件头中的信息,并使用 .frm 文件中的信息重新创建它。这种修复不能用 myisamchk 完成

于 2011-08-16T17:00:03.980 回答
11

您的查询正在生成一个非常大的结果集,以至于它需要构建一个临时表来保存一些结果或用于生成结果的一些中间产品。

临时表正在 /var/tmp 中生成。此临时表似乎已损坏。可能正在构建临时表的设备空间不足。但是,通常这通常会导致“空间不足”错误。也许在您的机器上运行的其他东西破坏了临时表。

尝试重新编写查询以使用更少的空间,或尝试重新配置数据库以便为临时表使用更大或更安全的分区。

MySQL 手册 - B.5.4.4。MySQL 存储临时文件的位置

于 2010-03-12T06:58:45.343 回答
5

存储引擎 (MyISAM) 支持修复表。你应该可以修复它。

如果修复失败,则表明该表已严重损坏,您别无选择,只能从备份中恢复它。

如果您有其他系统(例如,具有相同软件版本和架构的非生产系统)具有相同的表,那么您可能可以使用一些黑客来修复它(复制 frm 和 MYI 文件,然后进行修复)。

从本质上讲,诀窍是首先避免损坏表。这意味着始终干净地关闭您的数据库,永远不会崩溃,也永远不会出现硬件或电​​源问题。在实践中这不太可能,所以如果持久性很重要,您可能需要考虑更安全的存储引擎。

于 2010-03-12T07:41:09.723 回答
2

PHPMYADMIN 的简单“修复表”为我解决了这个问题。

  1. 去phpmyadmin
  2. 打开有问题的表
  3. 转到操作选项卡(在我的 PMA 版本中)
  4. 在底部你会找到“修复表”链接
于 2017-07-20T09:51:25.310 回答
1

就我而言,存在磁盘空间问题。我从我的服务器中删除了一些不需要的战争文件,然后它就可以工作了。

于 2016-07-04T10:47:54.030 回答
1

修复表 tbl_name USE_FRM;

命令仅在 MySQL 'Storage Engine' 类型应为 'MyISAM' 时运行

希望这可以帮助

于 2017-07-08T12:35:27.440 回答
1

这个问题是由于特定驱动器(c:\ 或 d:\ 等)的存储空间可用性低,释放一些内存然后它会工作。

谢谢 Saikumar.P

于 2018-04-08T10:35:33.787 回答
1

我刚刚解决了一个类似的问题“Incorrect key file:\bonga_process\alarms.MYI':try to repair it”</p>

我是如何解决的:

  1. 我启动了服务器配置应用程序 ServerConfiguration.exe
  2. 维护选项卡
  3. 单击修复表命令按钮
  4. 使用“管理存储”命令按钮显示删除文件以释放磁盘空间的提示
  5. 单击管理存储命令,这将运行带您到需要删除的一些文件以释放更多磁盘空间。删除所有无用的文件。
  6. 重新启动系统审计员应用程序
于 2022-01-13T12:38:14.300 回答
0

将正确的字符集和排序规则应用于数据库、表和列/字段。

我使用从一台服务器到另一台服务器的 sql 查询创建数据库和表结构。它创建数据库结构如下:

  1. 具有“utf8”字符集、“utf8_general_ci”排序规则的数据库
  2. 具有“utf8”字符集和“utf8_bin”排序规则的表。
  3. 表列/字段具有字符集“utf8”和“utf8_bin”排序规则。

我将表和列的排序规则更改为utf8_general_ci,它解决了错误。

于 2014-05-03T10:42:19.277 回答
0

发生这种情况可能是因为您的磁盘存储空间不足并且 mysql 文件和启动文件已损坏

要尝试的解决方案如下

首先我们将 tmp 文件移动到空间更大的地方

第 1 步:复制现有的 /etc/my.cnf 文件以进行备份

cp /etc/my.cnf{,.back-`date +%Y%m%d`}

第 2 步:创建新目录,并设置正确的权限

mkdir /home/mysqltmpdir
chmod 1777 /home/mysqltmpdir

第 3 步:打开您的 /etc/my.cnf 文件

nano /etc/my.cnf

第 4 步:在 [mysqld] 部分下添加以下行并保存文件

tmpdir=/home/mysqltmpdir

其次,您需要从 /var/lib/mysql/ib_* 中删除或错误文件和日志,这意味着删除以“ib”开头的任何内容

rm /var/lib/mysql/ibdata1和 rm /var/lib/mysql/ibda.... 等等

第三,您需要确保有一个 pid 文件可用于让数据库写入

第 1 步您需要编辑 /etc/my.cnf

pid-file= /var/run/mysqld/mysqld.pid 

步骤 2 创建包含要指向的文件的目录

 mkdir /var/run/mysqld
 touch /var/run/mysqld/mysqld.pid
 chown -R mysql:mysql /var/run/mysqld

最后一步重启mysql服务器

/etc/init.d/mysql restart
于 2020-03-29T17:18:33.583 回答
0

更改为 MyISAM 引擎并运行此命令

REPAIR TABLE tbl_name USE_FRM;
于 2021-02-01T03:11:14.777 回答