在使用RDS MySQL的过程中,出现了以下错误信息,[$Tab_Name]为临时表。
the table ‘/home/mysql/xxxx/xxxx/#[$Tab_Name]’ is full

在进行 group by、order by、distinct、union、多表更新、group_concat、count(distinct)、子查询或表连接的情况下,MySQL 有可能会使用内部临时表。MySQL 首先在内存中创建 Memory 引擎临时表,当临时表的尺寸过大时,会自动转换为磁盘上的 MyISAM 引擎临时表,当查询涉及到 Blob Text 类型字段,MySQL 会直接使用磁盘临时表。这个错误信息说明磁盘上的临时表的物理尺寸受到限制,已经无法再继续扩展了。导致这个错误信息的原因是查询语句使用的内部磁盘临时表(MyISAM 引擎表)总大小已经达到了实例参数 loose_rds_max_tmp_disk_space 指定的限制,默认值为 10 GB。

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于 ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启 RDS 日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。
  • 请按照实际情况选择以下步骤进行操作:
    • 在控制台的参数设置中,根据 RDS 实例当前空闲空间和应用空间使用情况,调高参数 loose_rds_max_tmp_disk_space(仅限 MySQL 5.5 5.6 支持该参数),建议设置为略小于当前空闲空间,保留一部分空间以便日志文件和数据文件使用,以避免磁盘临时表总占用空间过高,超过实例规格而导致实例锁定,影响业务。
      说明
    • loose_rds_max_tmp_disk_space 参数单位是字节(Byte)。默认 10737418240 字节,即 10 GB;上限 107374182400 字节,即 100 GB。
    • 实例当前空闲空间可前往监控与报警页面查看,具体操作,请参见 查看监控信息
    • 修改 loose_rds_max_tmp_disk_space 参数取值,不会重启实例。
    • 减少同时使用磁盘临时表的会话数量。因为 loose_rds_max_tmp_disk_space 参数指定的是磁盘临时表文件的总大小,因此减少并发使用磁盘临时表的会话数量可以避免超过该参数指定的限制。
    • 在控制台的参数设置中调高 tmp_table_size 参数来提高内存临时表的上限。
      说明 tmp_table_size 单位是字节(Byte),默认 2097152 字节,即 2 MB;上限 67108864 字节,即 64 MB。
    • 在查询中,尽量避免使用 Blog Text 类型字段。
    • 优化查询逻辑,避免过大的中间数据集操作。