MySQL
MySQL高可用配置
MySQL Slave状态参数详解
基于二进制日志文件的复制
使用全局事务标识符GTID复制
MySQL安装升级
MySQL RPM包安装参考
MySQL编译化安装参考
MySQL Server版本升级
MySQL 操作手册/说明
MySQL导入导出操作
库,表,字段的字符集修改方法
根据字段生成自定义SQL语句
MySQL查询流程概述
MySQL 常用脚本
MySQL数据库冷备脚本
MySQL内存占用分析
MySQL内存消耗分析
检查MySQL引起的高内存占用
InnoDB下的内存分析和优化计算
MySQL常见问题
MySQL告警:Aborted connection日志的分析
MySQL使用命令kill进程后出现killed死锁问题
从库重起初始化relaylog失败
MySQL 8.0 报错 “The table '/tmp/#sqlxxx' is full”
安全插件Connection-Control导致无法登录的问题
MySQL题库资料
MySQL 8.0版本OCP证书题库(1Z0-908)
MySQL性能优化
MySQL查询慢性能分析
本文档使用 MrDoc 发布
-
+
首页
MySQL 8.0 报错 “The table '/tmp/#sqlxxx' is full”
在将MySQL Server 从 8.0.22-13 升级到 8.0.23-14 后,在执行包含 UNION、GROUP BY、ORDER BY 和多个 JOIN 的复杂查询时,遇到了如下错误: ```bash (HY000/1114): The table '/tmp/#sql1_f519f_7' is full ```  尽管系统拥有充足的磁盘空间(约 481GB 可用),但该错误仍然发生。 根据多个 MySQL 官方 Bug 报告(#98782、#98739、#99593、#99100)和社区讨论,MySQL 8.0 中出现 “The table '/tmp/#sql...' is full” 错误的根本原因主要与临时表引擎 TempTable 的内存和磁盘使用策略有关。 ## 错误根因分析 ### 1. 临时表引擎 TempTable 的内存限制 MySQL 8.0 引入了新的临时表引擎 TempTable,用于处理复杂查询中的临时数据。该引擎默认使用内存存储,但受以下两个参数限制: * `temptable_max_ram`:控制 TempTable 引擎使用内存的最大值,默认值为 1GB。 * `temptable_max_mmap`:控制使用内存映射文件(mmap)时的最大大小,默认值为 1GB。 当查询需要的临时表空间超过 `temptable_max_ram` 时,MySQL 会尝试使用 mmap 文件进行存储;如果 mmap 文件的大小超过 `temptable_max_mmap`,则会尝试使用 InnoDB 的磁盘临时表。 然而,如果系统配置或权限设置不当,可能导致无法创建 mmap 文件或使用 InnoDB 临时表,从而触发 “The table is full” 错误。 ### 2. mmap 文件性能问题 Bug 报告 #98739 指出,当 TempTable 引擎使用 mmap 文件存储临时数据时,性能可能会显著下降。例如,处理约 30MB 的数据时,使用 mmap 需要约 4 分钟,而使用 InnoDB 临时表仅需 0.25 秒。 这表明,在某些情况下,mmap 文件不仅可能导致错误,还可能严重影响查询性能。 ### 3. GROUP BY 查询中的错误 Bug 报告 #99100 描述了在执行包含 GROUP BY 的查询时,若临时表空间不足,可能会触发 “The table is full” 错误。即使系统有足够的磁盘空间,如果 `temptable_use_mmap` 被禁用,MySQL 可能无法正确地将临时表转换为磁盘存储,从而导致错误。 --- ## 解决方案 根据上述分析,以下是针对该错误的建议解决方案: ### 1. 调整临时表存储引擎 将内部临时表的存储引擎从默认的 TempTable 改为 MEMORY,可以避免使用 mmap 文件,从而减少错误发生的可能性。 ```sql SET GLOBAL internal_tmp_mem_storage_engine=MEMORY; ``` 要使更改永久生效,请在 MySQL 配置文件(如 `my.cnf`)中添加以下行: ```ini [mysqld] internal_tmp_mem_storage_engine=MEMORY ``` 然后重启 MySQL 服务以应用更改。 ### 2. 增加内存限制参数 如果希望继续使用 TempTable 引擎,可以考虑增加以下两个参数的值,以允许更大的内存使用: ```ini [mysqld] temptable_max_ram=2G temptable_max_mmap=2G ``` 同样,修改后需要重启 MySQL 服务以使更改生效。 ### 3. 启用 mmap 文件使用 确保 `temptable_use_mmap` 参数被启用,以允许 MySQL 在内存不足时使用 mmap 文件存储临时数据。可以通过以下命令启用: ```sql SET GLOBAL temptable_use_mmap=ON; ``` 要使更改永久生效,请在 MySQL 配置文件中添加: ```ini [mysqld] temptable_use_mmap=ON ``` 然后重启 MySQL 服务。 ### 4. 检查临时目录配置 确保 MySQL 的临时目录(由 `tmpdir` 参数指定)具有足够的可用空间,并且 MySQL 进程对该目录具有写权限。可以通过以下命令查看当前的临时目录: ```sql SHOW VARIABLES LIKE 'tmpdir'; ``` 如果需要更改临时目录,请在配置文件中设置: ```ini [mysqld] tmpdir=/path/to/new/tmpdir ``` 然后重启 MySQL 服务。 ## 结论 MySQL 8.0 中的临时表引擎 TempTable 在处理复杂查询时可能因内存和磁盘使用策略导致 “The table is full” 错误。通过调整相关参数和配置,可以有效地解决该问题。建议在执行复杂查询或处理大量数据时,提前评估和配置相关参数,以确保系统的稳定性和性能。 ---
Nathan
2025年6月5日 10:32
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文件
Docx文件
分享
链接
类型
密码
更新密码