29

我阅读了以下相关的问题,但回复并没有让我满意:MySQL:#126 - Incorrect key file for table


问题

运行查询时出现此错误

错误 126 (HY000): 表的密钥文件不正确`

问题

当我试图找到问题时,我找不到问题,所以我不知道如何使用修复命令修复它。是否有任何指示我如何以任何其他方式找到导致此问题的问题,然后我已经尝试过?


查询

mysql>       SELECT
    ->         Process.processId,
    ->         Domain.id AS domainId,
    ->         Domain.host,
    ->         Process.started,
    ->         COUNT(DISTINCT Joppli.id) AS countedObjects,
    ->         COUNT(DISTINCT Page.id)   AS countedPages,
    ->         COUNT(DISTINCT Rule.id)   AS countedRules
    ->       FROM Domain
    ->         JOIN CustomScrapingRule
    ->           AS Rule
    ->           ON Rule.Domain_id = Domain.id
    ->           LEFT JOIN StructuredData_Joppli
    ->             AS Joppli
    ->             ON Joppli.CustomScrapingRule_id = Rule.id
    ->         LEFT JOIN Domain_Page
    ->           AS Page
    ->           ON Page.Domain_id = Domain.id
    ->         LEFT JOIN Domain_Process
    ->           AS Process
    ->           ON Process.Domain_id = Domain.id
    ->       WHERE Rule.CustomScrapingRule_id IS NULL
    ->       GROUP BY Domain.id
    ->       ORDER BY Domain.host;
ERROR 126 (HY000): Incorrect key file for table '/tmp/#sql_2b5_4.MYI'; try to repair it

mysql检查

root@scraper:~# mysqlcheck -p scraper
Enter password: 
scraper.CustomScrapingRule                         OK
scraper.Domain                                     OK
scraper.Domain_Page                                OK
scraper.Domain_Page_Rank                           OK
scraper.Domain_Process                             OK
scraper.Log                                        OK
scraper.StructuredData_Joppli                      OK
scraper.StructuredData_Joppli_Product              OK

计数行

mysql> select count(*) from CustomScrapingRule;
+----------+
| count(*) |
+----------+
|       26 |
+----------+
1 row in set (0.04 sec)

mysql> select count(*) from Domain;
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.01 sec)

mysql> select count(*) from Domain_Page;
+----------+
| count(*) |
+----------+
|   134288 |
+----------+
1 row in set (0.17 sec)

mysql> select count(*) from Domain_Page_Rank;
+----------+
| count(*) |
+----------+
|  4671111 |
+----------+
1 row in set (11.69 sec)

mysql> select count(*) from Domain_Process;
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.02 sec)

mysql> select count(*) from Log;
+----------+
| count(*) |
+----------+
|       41 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from StructuredData_Joppli;
+----------+
| count(*) |
+----------+
|    11433 |
+----------+
1 row in set (0.16 sec)

mysql> select count(*) from StructuredData_Joppli_Product;
+----------+
| count(*) |
+----------+
|   130784 |
+----------+
1 row in set (0.20 sec)

更新


磁盘使用情况

root@scraper:/tmp# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       20G  4.7G   15G  26% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
udev            237M  4.0K  237M   1% /dev
tmpfs            49M  188K   49M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            245M     0  245M   0% /run/shm
none            100M     0  100M   0% /run/user
4

5 回答 5

41

您的查询似乎返回了一个需要创建临时表的大型中间结果集,并且 mysql 临时磁盘表 (/tmp) 的配置位置对于生成的临时表来说不够大。

您可以尝试通过重新挂载来增加 tmpfs 分区大小:

mount -t tmpfs -o remount,size=1G tmpfs /tmp

您可以通过编辑 /etc/fstab 使此更改永久生效

如果您无法做到这一点,您可以尝试通过编辑 my.cnf 文件中的“tmpdir”条目来更改磁盘临时表的位置(如果还没有,则添加它)。请记住,您选择的目录应该是 mysql 用户可写的

您还可以尝试通过增加 mysql 配置选项的值来防止创建磁盘临时表:

tmp_table_size
max_heap_table_size

到更大的值。您将需要增加上述两个参数

例子:

set global tmp_table_size = 1G;
set global max_heap_table_size = 1G;
于 2013-10-10T12:46:38.590 回答
4

如果您/tmp在 linux 文件系统上的挂载被挂载为溢出,通常大小为 1MB,即

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            7.9G   12K  7.9G   1% /dev
tmpfs           1.6G  348K  1.6G   1% /run
/dev/xvda1      493G  6.9G  466G   2% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
none            5.0M     0  5.0M   0% /run/lock
none            7.9G     0  7.9G   0% /run/shm
none            100M     0  100M   0% /run/user
overflow        1.0M  4.0K 1020K   1% /tmp               <------

这可能是由于您没有指定/tmp为自己的分区,并且您的根文件系统/tmp已填满并作为后备重新安装。

在 EC2 卷上的空间不足后,我遇到了这个问题。/tmp一旦我调整了卷的大小,我在执行一个复杂的视图时遇到了溢出分区。


要在您清除空间/调整大小后解决此问题,只需卸载回退,它应该重新安装在其原始点(通常是您的根分区):

sudo umount -l /tmp

注意:-l将延迟卸载磁盘。

于 2017-05-03T17:35:43.527 回答
1

将复杂查询拆分为多个查询会更快,而无需增加临时表大小

于 2016-04-05T07:50:17.720 回答
1

就我而言,我刚刚从临时位置清除了临时文件:

我的.ini

tmpdir = "D:/xampp/tmp"

它对我有用。

于 2016-11-21T12:55:47.683 回答
-8

您只需要修复在搜索查询中使用的表。这个问题一般发生在搜索查询上。

转到“ table_name ” ->操作->修复(只需单击)效果可能需要一些时间才能应用

于 2015-02-06T09:42:00.957 回答