RDS上,MySQL实例中某张表数据小于tmp_table_size,但有查询时会报错临时空间满 The table '/data/mysql/zst/tmp/#sql_13975_23' is full. 原因可能是什么?

RDS上,MySQL实例中某张表数据小于tmp_table_size,但有查询时会报错临时空间满 The table '/data/mysql/zst/tmp/#sql_13975_23' is full. 原因可能是什么?


一、可能有下面几种情况:
    1、在SQL中执行group byorder bydistinctunion、多表update、子查询、多表JOIN等情况下,可能需要生成内部临时表,当内部临时表超过tmp-table-size时,就会产生磁盘临时表。
    2、接上,若查询包含BLOB、TEXT类型字段时,MySQL会直接使用磁盘临时表。
    3、云数据库购买的磁盘空间,是包括数据库文件、日志文件(binlog、relay log、error log等)、临时文件&临时表(关注 Created_tmp_disk_tables、Created_tmp_tables、Binlog_cache_disk_use、Binlog_stmt_cache_disk_use等指标)所消耗占用的磁盘空间。
    4、发生table...is full报错,说明可能生成磁盘临时表太多,超过云数据库购买的空间限制。


二、解决办法可以有:
    1、关注slow query log,或者查看processlist,及时发现需要用到临时文件、临时表的SQL,尽快优化。
    2、调高 tmp_table_size 参数值来调高内存临时表的上限。
    3、调高参数loose_rds_max_tmp_disk_space值,可设置为当前空闲空间的80%(阿里云RDS专属参数)。
    4、优化表DDL设计,尽量避免使用BLOB、TEXT类型字段,并且在SQL中减少对这些大字段的访问。
    5、优化查询逻辑,避免使用UNION或者需要中间数据集的子查询等SQL。
原文地址:https://www.cnblogs.com/zhouwanchun/p/13152668.html