我正在尝试运行一个相当大的查询,该查询应该每晚运行以填充表。我收到一条错误消息,Incorrect key file for table '/var/tmp/#sql_201e_0.MYI'; try to repair it
但我正在使用的存储引擎(我猜是什么默认值?)不支持修复表。
我该如何解决这个问题,以便我可以运行查询?
我正在尝试运行一个相当大的查询,该查询应该每晚运行以填充表。我收到一条错误消息,Incorrect key file for table '/var/tmp/#sql_201e_0.MYI'; try to repair it
但我正在使用的存储引擎(我猜是什么默认值?)不支持修复表。
我该如何解决这个问题,以便我可以运行查询?
您必须将 MySQL 的临时文件夹(大多数情况下为“/tmp”)的位置更改为具有更大磁盘空间的位置。在 MySQL 的配置文件中更改它。
基本上,您的服务器用完了 /tmp 所在的磁盘空间。
您需要从 MySQL 提示符运行此命令:
REPAIR TABLE tbl_name USE_FRM;
如果.MYI 索引文件丢失或其标头已损坏,则可以使用 USE_FRM 选项。此选项告诉 MySQL 不要信任 .MYI 文件头中的信息,并使用 .frm 文件中的信息重新创建它。这种修复不能用 myisamchk 完成。
您的查询正在生成一个非常大的结果集,以至于它需要构建一个临时表来保存一些结果或用于生成结果的一些中间产品。
临时表正在 /var/tmp 中生成。此临时表似乎已损坏。可能正在构建临时表的设备空间不足。但是,通常这通常会导致“空间不足”错误。也许在您的机器上运行的其他东西破坏了临时表。
尝试重新编写查询以使用更少的空间,或尝试重新配置数据库以便为临时表使用更大或更安全的分区。
存储引擎 (MyISAM) 支持修复表。你应该可以修复它。
如果修复失败,则表明该表已严重损坏,您别无选择,只能从备份中恢复它。
如果您有其他系统(例如,具有相同软件版本和架构的非生产系统)具有相同的表,那么您可能可以使用一些黑客来修复它(复制 frm 和 MYI 文件,然后进行修复)。
从本质上讲,诀窍是首先避免损坏表。这意味着始终干净地关闭您的数据库,永远不会崩溃,也永远不会出现硬件或电源问题。在实践中这不太可能,所以如果持久性很重要,您可能需要考虑更安全的存储引擎。
PHPMYADMIN 的简单“修复表”为我解决了这个问题。
就我而言,存在磁盘空间问题。我从我的服务器中删除了一些不需要的战争文件,然后它就可以工作了。
修复表 tbl_name USE_FRM;
命令仅在 MySQL 'Storage Engine' 类型应为 'MyISAM' 时运行
希望这可以帮助
这个问题是由于特定驱动器(c:\ 或 d:\ 等)的存储空间可用性低,释放一些内存然后它会工作。
谢谢 Saikumar.P
我刚刚解决了一个类似的问题“Incorrect key file:\bonga_process\alarms.MYI':try to repair it”</p>
我是如何解决的:
将正确的字符集和排序规则应用于数据库、表和列/字段。
我使用从一台服务器到另一台服务器的 sql 查询创建数据库和表结构。它创建数据库结构如下:
我将表和列的排序规则更改为utf8_general_ci
,它解决了错误。
发生这种情况可能是因为您的磁盘存储空间不足并且 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
更改为 MyISAM 引擎并运行此命令
REPAIR TABLE tbl_name USE_FRM;