当你无法修复表时,如何修复MySQL“错误的密钥文件”错误?

时间:2010-03-11 21:15:37

标签: mysql mysql-error-126

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

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

11 个答案:

答案 0 :(得分:45)

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

基本上,您的服务器没有/ tmp所在的磁盘空间。

答案 1 :(得分:32)

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

REPAIR TABLE tbl_name USE_FRM;

来自MySQL's documentation on the Repair command

  

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

答案 2 :(得分:8)

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

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

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

MySQL Manual - B.5.4.4. Where MySQL Stores Temporary Files

答案 3 :(得分:1)

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

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

如果您有其他系统(例如,具有相同软件版本和架构的非生产)具有相同的表,那么您可能能够通过一些hackery来修复它(复制frm和MYI文件,然后进行修复)。 / p>

从本质上讲,诀窍是避免首先破坏表格。这意味着始终干净地关闭数据库,不要让它崩溃,也不要遇到硬件或电源问题。在实践中,这不太可能,因此如果耐久性很重要,您可能需要考虑更安全的存储引擎。

答案 4 :(得分:1)

就我而言,存在光盘空间问题。我从服务器上删除了一些不需要的war文件,之后就可以了。

答案 5 :(得分:1)

REPAIR TABLE tbl_name USE_FRM;

命令仅在MySQL'存储引擎'类型应该是“MyISAM'

希望这有帮助

答案 6 :(得分:1)

简单"修理表"来自PHPMYADMIN为我解决了这个问题。

  1. 转到phpmyadmin
  2. 打开有问题的表格
  3. 转到“操作”标签(在我的PMA版本中)
  4. 在底部你会发现"修理表"链路

答案 7 :(得分:0)

将适当的字符集和排序规则应用于数据库,表格和列/字段。

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

  1. 数据库,字符串为“utf8”,整理为“utf8_general_ci”
  2. 使用“utf8”字符集和“utf8_bin”整理的表格。
  3. 表格列/字段具有charset“utf8”和“utf8_bin”的整理。
  4. 我将表格和列的排序规则更改为utf8_general_ci,并解决了错误。

答案 8 :(得分:0)

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

由于 Saikumar.P

答案 9 :(得分: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文件可用于写入数据库

第一步,您需要编辑/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

答案 10 :(得分:0)

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

REPAIR TABLE tbl_name USE_FRM;