ERROR 126 根本原因是 tmpdir 磁盘空间不足或不可写,而非权限或语法问题;错误指向 MySQL 在 /tmp(或配置的 tmpdir)创建临时 MYI 文件失败,常见于 df -h 显示分区满、目录无 mysql 用户读写权限、SELinux 限制或 tmpdir 配置错误。

MySQL 报 ERROR 126 “Incorrect key file for table” 的根本原因,几乎总是磁盘空间不足或 tmpdir 不可写,而不是权限或语法问题。
ERROR 126 实际指向的是临时文件系统故障
这个错误不是说“你没权限建表”,而是 MySQL 在 /tmp(或你配置的 tmpdir)里尝试创建 MYI/MYD 文件失败了。典型报错形如:ERROR 126 (HY000): Incorrect key file for table '/tmp/#sql_1d87_0.MYI'; try to repair it。注意路径里的 /tmp/ —— 它暴露了问题发生地。
- 执行
df -h查看tmpdir所在分区是否 100% 满(常见于/或/tmp单独挂载时) - 运行
SHOW VARIABLES LIKE 'tmpdir';确认当前生效的临时目录位置 - 检查该目录属主和权限:
ls -ld /tmp,MySQL 进程用户(如mysql)必须有读写权限 - 若用 SELinux,
getenforce为Enforcing且未放行 MySQL 写tmpdir,也会静默失败(需setenforce permissive或配策略)
tmpdir 配置错误或被覆盖
MySQL 启动时会按顺序读取配置:命令行参数 > my.cnf 中 [mysqld] 段 > 编译默认值。如果 tmpdir 指向一个不存在的路径、权限受限的路径,或被 slave_load_tmpdir(复制场景)意外覆盖,就会在需要落盘临时表时崩出 ERROR 126。
- 确认两个变量是否一致:
SHOW VARIABLES LIKE 'tmpdir';和SHOW VARIABLES LIKE 'slave_load_tmpdir';;不一致时,LOAD DATA 或复制过程中可能走错目录 - 修改配置需加到
[mysqld]段,例如:[mysqld] tmpdir = /data/tmp slave_load_tmpdir = /data/tmp
(确保/data/tmp存在且chown mysql:mysql /data/tmp) - 改完必须重启 MySQL,
SET GLOBAL tmpdir = '...'不生效(该变量只读)
别被“key file”字面意思误导
报错里提到 “key file” 并不意味着索引损坏——它只是 MyISAM 引擎对索引文件(.MYI)的旧称。即使你用的是 InnoDB,只要查询触发了磁盘临时表(比如含 GROUP BY + 大结果集 + 超过 tmp_table_size),MySQL 内部仍可能用 MyISAM 格式在 tmpdir 里暂存中间结果,于是复用同一套错误码。
- 用
EXPLAIN FORMAT=TREE查看查询是否用了磁盘临时表(输出含Using temporary; Using filesort且数据量大) - 调大内存阈值可缓解但不根治:
SET SESSION tmp_table_size = 268435456;(256MB),但前提是max_heap_table_size也同步设为相同值 - 真正要盯住的,是
df -h输出里那个爆满的挂载点——99% 的 ERROR 126 都卡在这一步
排查时最容易忽略的是:错误发生在查询执行阶段,而非 CREATE TEMPORARY TABLE 语句本身。哪怕你 CREATE 成功了,后续 INSERT 或 JOIN 触发磁盘临时表时仍可能崩出 ERROR 126。所以不能只看建表语句,得盯住整个操作链路的临时文件生命周期。


















