【问题标题】:How do you fix a MySQL "Incorrect key file" error when you can't repair the table?当您无法修复表时,如何修复 MySQL“不正确的密钥文件”错误?
【发布时间】: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看看

标签: mysql mysql-error-126


【解决方案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 的简单“修复表”为我解决了这个问题。

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

      【讨论】:

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

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

      【讨论】:

        【解决方案7】:

        修复表 tbl_name USE_FRM;

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

        希望对你有帮助

        【讨论】:

        【解决方案8】:

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

        谢谢 赛库玛.P

        【讨论】:

          【解决方案9】:

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

          我是如何解决的:

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

          【讨论】:

            【解决方案10】:

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

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

            1. 字符集为“utf8”的数据库,排序规则为“utf8_general_ci”
            2. 字符集为“utf8”且排序规则为“utf8_bin”的表。
            3. 表列/字段具有字符集“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;
                

                【讨论】:

                  猜你喜欢
                  • 2016-12-27
                  • 2014-12-11
                  • 2011-04-30
                  • 1970-01-01
                  • 2017-11-05
                  • 2013-11-18
                  • 2012-08-02
                  • 1970-01-01
                  • 2015-09-25
                  相关资源
                  最近更新 更多