关于RDS MySQL the table '/home/mysql/xxxx/xxxx/#tab_name' is full 的原因和处理简介
发布日期:2015-11-8 11:11:25
关于RDS MySQL the table '/home/mysql/xxxx/xxxx/#tab_name' is full 的原因和处理简介 有时候在使用RDS 的过程中,会碰到下面的出错信息: the table '/home/mysql/xxxx/xxxx/#tab_name' is full,比如the table '/home/mysql/data3077/tmp/#sql_19472_5' is full。 1. 出现这个错误信息的原因 在SQL查询进行 distinct、union、group by、order by、多表更新、count(distinct)、group_concat、子查询或表连接的情况下,有可能MySQL 会使用内部临时表。MySQL 首先在内存中创建Memory引擎临时表,当如果临时表的尺寸过大时,会自动转换为磁盘上的MyISAM 引擎临时表。而当查询涉及到 Blob 或 Text 类型字段,MySQL 会直接使用磁盘临时表。 这个错误信息,告诉我们磁盘上的临时表 #sql_19472_5 的物理尺寸会受到限制,已经不能再继续扩展了。 造成这个错误信息的原因是查询语句使用的内部磁盘临时表(MyISAM 引擎表)总大小已经达到了实例参数loose_rds_max_tmp_disk_space 指定的限制(默认 10GB)。如下图: 2. 如何处理该错误信息 在控制台=》参数设置中根据RDS实例当前空闲空间和应用空间使用情况,调高参数loose_rds_max_tmp_disk_space的设置,建议考虑设置为略小于当前空闲空间(保留一部分空间以便 binlog 和 数据文件使用),以避免磁盘临时表总占用空间过高,超过实例规格而导致实例锁定,影响业务。该参数单位是 字节(Byte),默认 10GB,上限 100GB。如下图: 注:修改该参数会自动重启 RDS 实例。 减少同时使用磁盘临时表的会话数量。因为参数 loose_rds_max_tmp_disk_space 指定的是磁盘临时表文件的总大小,因此减少并发使用磁盘临时表的会话数量可以避免超过该参数指定的限制。 可以通过在控制台 =》参数设置 中调高 tmp_table_size 参数值来调高内存临时表的上限。如下图: 注:tmp_table_size 单位字节(Byte),默认 256 KB,最大64 MB。 在查询中,尽量避免使用 Blog 和 Text 类型字段。 优化查询逻辑,避免过大的中间数据集操作。 3. 如何判断查询是否使用内部临时表 查看 explain SQL 命令的输出,在 Extra 字段中有 Using temporary 字样的代表会使用内部临时表。 比如: 如问题还未解决,请联系售后技术支持。
|