如何对使用 Amazon RDS for MySQL 时遇到的 “MySQL HA_ERR_RECORD_FILE_FULL” 错误进行问题排查?
上次更新时间:2020 年 11 月 30 日
我在尝试将数据写入 Amazon Relational Database Service (Amazon RDS) MySQL 数据库实例时遇到以下错误:
"Error_code: 1114; handler error HA_ERR_RECORD_FILE_FULL"
如何解决此错误?
简短描述
此错误通常发生在导致复制失败的只读副本上,或者写入数据的表已满时。此错误还可能有以下原因之一:
- 发送错误消息的表是 MEMORY 引擎表,并且表大小达到上限。
- 该表是 MyISAM 引擎表,并且表的指针大小达到上限。
- 该表使用 InnoDB 引擎,并且 InnoDB 表空间文件已满。
- Amazon RDS 数据库实例的磁盘空间不足。
- 表的文件大小已达到上限。
有关 Amazon RDS 支持的存储引擎的更多信息,请参阅 Amazon RDS 上支持的 MySQL 存储引擎。
解决方案
MEMORY 引擎表达到大小上限
通过运行与下方类似的命令并检查引擎值,确认 MEMORY 引擎表的大小是否已达到其上限:
mysql> show table status from database_name like 'table_name'\G
如果输出中 data_length 变量的值大于 max_data_length 变量的值,则表示该表的大小已达到其上限。这就是您收到错误消息的原因。
您可以通过增加与数据库实例关联的自定义参数组中的 max_heap_table_size 参数的大小,来解决此错误。有关更多信息,请参阅创建数据库参数组。请确保不要超过所使用的数据库实例类的数据库实例类内存限制。有关数据库实例可用内存的更多信息,请参阅 Amazon RDS 实例类型。
MyISAM 引擎表达到最大指针大小
通过运行与下方类似的命令并检查引擎值,确认 MyISAM 引擎表的指针大小是否已达到其上限:
mysql> show table status from database_name like 'table_name'\G
您可以使用 ALTER TABLE 命令来更改现有表的最大大小,来解决此错误:
mysql> ALTER TABLE tbl_name MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;
(可选)您可以更改所有 MyISAM 表的默认大小限制。然后,将自定义数据库参数组中的 myisam_data_pointer_size 参数设置为更高的值。
InnoDB 表空间文件已满
InnoDB 表的表空间大小上限为 40 亿页 (16 TB)。
对于大于 1 TB 的表,您可以将表分区为多个表空间文件。您可以使用不同的分区类型(例如 RANGE、LIST 和 HASH)对表进行分区,具体取决于您的使用情形。例如,您可以根据您创建的年份截断旧数据,也可以为每年创建单独的分区。有关更多信息,请参阅 MySQL 文件大小限制和 MySQL 文档中的分区 。
重要提示:在生产环境中实施更改之前,应彻底测试分区可能对应用程序产生的影响。
您可以使用与下方类似的表修改语句,将现有表转换为分区表:
ALTER TABLE table_name
PARTITION BY HASH(id)
PARTITIONS 8;
注意:将现有表转换为分区表不会恢复为 InnoDB 表空间分配的空间。要恢复 InnoDB 空间,请参阅如何解决 Amazon RDS MySQL 数据库实例使用的存储超过预期的问题?
Amazon RDS 数据库实例磁盘空间不足
如果 Amazon RDS 数据库实例处于 STORAGE_FULL 状态,则会遇到 HA_ERR_RECORD_FILE_FULL 错误。要解决此错误,请为数据库实例增加更多存储空间。有关更多信息,请参阅 Amazon RDS 数据库实例用尽存储空间。
(可选)您可以使用 Amazon CloudWatch FreeStorageSpace 指标监控数据库实例的可用存储空间。有关更多信息,请参阅 Amazon RDS 监控概述。您还可以订阅低存储空间 Amazon RDS 事件通知,以便数据库实例占用分配的存储空间超过 90% 时收到通知。有关更多信息,请参阅 Amazon RDS 事件类型和事件消息。
该表已达到文件大小限制
注意:一些现有数据库实例的限制较低。例如,2014 年 4 月之前创建的 MySQL 数据库实例的文件和表大小限制为 2 TB。此 2 TB 文件大小限制也适用于从 2014 年 4 月之前拍摄的数据库快照创建的数据库实例或只读副本,无论数据库实例是何时创建的。
如果数据库实例的大小限制较低,则可以使用 mysqldump 进行 MySQL 数据转储。然后,将数据导入具有更高限制的新数据库实例。