当我在 Amazon Relational Database Service 或 Amazon Aurora MySQL 兼容版数据库中运行查询时,会遇到临时表和存储空间已满的问题。
简短描述
当您在兼容 Amazon RDS 或 Aurora MySQL 的环境中运行查询时,可能会遇到以下错误消息:
“The table '/rdsdbdata/tmp/#sqlxx_###' is full”
当您在兼容 Amazon RDS 或 Aurora MySQL 的实例上使用所有临时表存储空间时,您会收到上述错误消息。当您运行生成超出配置存储配额的大型临时表的查询时,您也会收到此错误消息。
解决方法
解析完整的临时表
MySQL 8.0 和 Aurora MySQL 兼容版 3.x 使用 TempTable 存储引擎来处理需要您存储中间结果的复杂查询。
TempTable 存储引擎在内存中创建临时表,最高可达 temptable_max_ram 参数的默认大小。当您超出配额时,临时表会使用内存映射文件溢出到磁盘存储空间,最高可达 temptable_max_mmap 参数的默认大小。
如果查询生成的临时数据超出 temptable_max_mmap 参数的默认大小,则可能会出现“Table is full”错误。
要解决此问题,请执行以下操作:
- 增加 temptable_max_ram 和 temptable_max_mmap 参数,为临时表留出更多内存和磁盘空间。有关详细信息,请参阅 MySQL 网站上的 temptable_max_ram 和 temptable_max_mmap。
**注意:**temptable_max_mmap 参数不得超过 Aurora 实例上本地存储大小的 80%。
- 将 internal_tmp_mem_storage_engine 参数设置为 MEMORY,以避免 temptable_max_mmap 磁盘配额。此外,设置 tmp_table_size 和 max_heap_table_size 参数以限制单个内部临时表的大小。有关详细信息,请参阅 MySQL 网站上的 internal_temp_mem_storage_engine、tmp_table_size 和 max_heap_table_size。
**注意:**MEMORY 设置仅适用于 Aurora 写入器实例。在读取器实例上,Aurora MySQL 使用 TempTable 存储引擎。
- 打开 aurora_tmptable_enable_per_table_limit 和 tune tmp_table_size 参数以限制每个内部临时表的最大内存。
- 使用 FreeLocalStorage Amazon CloudWatch 指标监控与 Aurora 数据库实例关联的本地存储空间。要监控与 RDS MySQL 实例关联的空闲数据存储空间,请使用 FreeStorageSpace CloudWatch 指标。
优化查询以减少临时表
某些查询可能会生成可能导致错误的大型临时表。
要优化查询,请执行以下操作:
- 使用适当的索引,特别是对于涉及 GROUP BY、ORDER BY、子查询和分区表视图的查询。
- 对分区表进行查询时使用分区修剪,这样就不会扫描整个表。
- 使用索引进行文件排序的查询来生成隐式临时表。或者,调整 sort_buffer_size 参数。
解决存储空间已满问题的其他原因
以下问题也可能导致兼容 Amazon RDS 和 Aurora MySQL 的实例出现存储空间已满问题:
- 超出本地存储容量的大型数据库或表大小。
- 审计日志、慢速查询日志或常规查询日志的本地磁盘空间使用情况。
要解决这些错误,请执行以下操作:
- 对于 DDL 操作,例如索引重建或表更改,请使用 Percona 工具包,这样就不会生成大型临时表。有关详细信息,请参阅 Percona 网站上的 pt-online-schema-change。
- 监控本地存储使用情况。
- 优化查询和表结构。
- 关闭日志。
- 扩展您的 Aurora MySQL 实例以增加本地存储容量。
相关信息
Use the TempTable Storage Engine on Amazon RDS for MySQL and Amazon Aurora MySQL(在 Amazon RDS for MySQL 和 Amazon Aurora MySQL 上使用 TempTable 存储引擎)
Aurora MySQL 版本 3 中的新临时表行为
Aurora MySQL 的临时存储限制