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

Posted

技术标签:

【中文标题】当您无法修复表时,如何修复 MySQL“不正确的密钥文件”错误?【英文标题】:How do you fix a MySQL "Incorrect key file" error when you can't repair the table? 【发布时间】:2011-01-26 14:09:32 【问题描述】:

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

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

【问题讨论】:

tmp文件夹一般有2GB的限制,试试df -h看看 【参考方案1】:

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

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

【讨论】:

我在更改 mysql 数据目录的位置后遇到了这个问题,因为 fs 空间不足.. 所以只是 sudo rm -rf /var/lib/mysql/ibdata1 为我做了。谢谢!!! tmpdir = /mnt/mysql_tmp got 1.2 T space 还是报错?为什么 ? [root@ADM-PROD-PERCONA-SL-RP-03 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda1 7.8G 1.6G 6.1G 21% / devtmpfs 61G 80K 61G 1% /dev tmpfs 61G 0 61G 0% /dev/shm /dev/md0 3.0T 1.9T 1.2T 62% /mnt 如果我的 tempdir 是 /var/folders/zz/zyxvpxvq6csfxvn_n000009800002_/T,我可以删除其中的文件以释放空间吗? 必须运行 REPAIR TABLE tbl_name USE_FRM;清除一些空间后【参考方案2】:

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

REPAIR TABLE tbl_name USE_FRM;

来自MySQL's documentation on the Repair command:

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

【讨论】:

谢谢,修好了我的桌子。但实际上应该是REPAIR TABLE tbl_name USE_FRM 这对我也有用 - 生产系统的救生员! 谢谢,这是最好的答案。像魅力一样工作。 没有其他人提到我一直在寻找的 USE_FRM 选项。非常感谢! 为什么显示“表的存储引擎不支持修复”?帮助...【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

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

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

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

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

【讨论】:

【参考方案5】:

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

    转到 phpmyadmin 打开有问题的表 转到“操作”选项卡(在我的 PMA 版本中) 您会在底部找到“修复表”链接

【讨论】:

这仅适用于可修复类型的表。通常InnoDB 表不会有这个选项。【参考方案6】:

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

【讨论】:

【参考方案7】:

修复表 tbl_name USE_FRM;

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

希望对你有帮助

【讨论】:

这似乎没有为an existing and upvoted answer添加任何新内容。【参考方案8】:

此问题是由于特定驱动器(c:\ 或 d:\ 等)的可用存储空间不足,释放一些内存即可工作。

谢谢 赛库玛.P

【讨论】:

【参考方案9】:

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

我是如何解决的:

    我启动了服务器配置应用程序 ServerConfiguration.exe 维护选项卡 单击修复表命令按钮 使用“管理存储”命令显示删除文件以释放磁盘空间的提示 按钮 单击管理存储命令,这将运行一个带您到需要删除的一些文件以释放更多磁盘空间的文件。删除所有无用的文件。 重新启动系统审计应用程序

【讨论】:

【参考方案10】:

对数据库、表和列/字段应用适当的字符集和排序规则。

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

    字符集为“utf8”的数据库,排序规则为“utf8_general_ci” 字符集为“utf8”且排序规则为“utf8_bin”的表。 表列/字段具有字符集“utf8”和“utf8_bin”排序规则。

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

【讨论】:

【参考方案11】:

发生这种情况可能是因为您的磁盘存储空间不足并且 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

【讨论】:

【参考方案12】:

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

REPAIR TABLE tbl_name USE_FRM;

【讨论】:

以上是关于当您无法修复表时,如何修复 MySQL“不正确的密钥文件”错误?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pandas 附加 BigQuery 表时如何修复无效架构

使用PHPMyAdmin管理工具修复MySQL数据库表

如何修复生产中找不到的 vue 动态异步组件?

如何修复此错误 3734:无法在 MySQL WorkBench 上添加外键约束?

如何修复 Chrome 中的 https“不安全”消息?

如何修复 CSS 导航闪烁问题