错误“Table is full”本质是MySQL磁盘或表空间耗尽,需检查tmpdir和datadir所在分区空间,调整tmpdir路径、清理无用表、加索引优化查询,并在PHP中主动捕获mysqli_error。

PHP 连接 MySQL 时提示 ERROR 1114 (HY000): The table is full 怎么办
这不是 PHP 的问题,而是 MySQL 的存储引擎(通常是 MyISAM 或 InnoDB)在写入临时表、排序缓冲区或磁盘临时表时,碰到了磁盘空间不足、tmpdir 满、或 InnoDB 表空间(ibdata1 或独立表空间文件)耗尽的情况。PHP 只是触发了这个错误,真正要查的是 MySQL 侧的资源瓶颈。
SHOW VARIABLES LIKE 'tmpdir' 返回路径已满怎么处理
MySQL 在执行 GROUP BY、ORDER BY、大结果集 UNION 等操作时,会把中间结果写到 tmpdir 指向的目录。如果该目录所在分区只剩几十 MB,就极易触发 “The table is full”。
- 用
df -h查看tmpdir所在分区实际剩余空间 - 临时改路径:在 MySQL 配置文件(如
/etc/my.cnf)中添加tmpdir = /path/to/larger/partition/tmp,然后重启mysqld - 不重启的应急方式:登录 MySQL 后执行
SET GLOBAL tmpdir = '/new/path';(注意:仅对新连接生效,且要求 MySQL 用户对该路径有读写权限) - 避免依赖磁盘临时表:给
ORDER BY字段加索引;控制SELECT返回字段数量;用LIMIT分页代替全量拉取
使用 CREATE DATABASE 或建表失败,报错含 ibdata1 或 .ibd 相关提示
说明 InnoDB 共享表空间(ibdata1)或独立表空间文件(*.ibd)所在磁盘已满,或者配置的 innodb_data_file_path 已无法自动扩展。
- 检查
datadir路径磁盘使用率:SHOW VARIABLES LIKE 'datadir';,再df -h定位 - 确认是否启用了
innodb_file_per_table=ON(推荐开启):若关闭,所有表数据都挤在ibdata1,它无法收缩,只能扩容或重建实例 - 若启用了独立表空间但
.ibd文件所在分区满了,清理无用表(DROP TABLE)后记得OPTIMIZE TABLE回收空间(对 InnoDB 有效) - 切勿手动删除
ibdata1或.ibd文件——MySQL 会直接崩溃
PHP 中调用 mysqli_query() 创建数据库返回 false,但没具体错误信息
默认情况下,mysqli_query() 不抛异常,也不自动打印 MySQL 原始错误。你看到的 “table full” 很可能被静默吞掉了。
立即学习“PHP免费学习笔记(深入)”;
- 务必检查返回值并主动获取错误:
if (!$result) { echo mysqli_error($link); } - 开启 MySQLi 错误报告模式:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);,后续查询失败会直接 throw 异常 - 注意:错误信息里出现
The table is full时,99% 是磁盘/表空间问题,不是 SQL 写错了 - 不要在 PHP 层尝试“重试创建数据库”——底层空间不释放,重试多少次都是同一个错误
真正卡住人的地方,往往不是不会写 SQL,而是看到 “table is full” 就去查 PHP 配置或重写逻辑。先盯死 df -h 和 SHOW VARIABLES,比翻 PHP 手册快十倍。











