如何解决使用 Amazon RDS for MySQL 时遇到的“MySQL HA_ERR_RECORD_FILE_FULL”错误?

上次更新时间:2019 年 2 月 27 日

我在尝试将数据写入 Amazon Relational Database Service (Amazon RDS) MySQL 数据库实例时遇到以下错误:

“Error_code: 1114; handler error HA_ERR_RECORD_FILE_FULL”

如何解决此错误?

简短描述

此错误最常发生在导致复制失败的只读副本上。但要写入数据的表已满时,也会发生此错误,或者可能由以下因素之一引起:

  1. 发送错误消息的表是 MEMORY 引擎表,并且表大小达到上限。
  2. 该表是 MyISAM 引擎表,并且表的指针大小达到上限。
  3. 该表使用 InnoDB 引擎,并且 InnoDB 表空间文件已满。
  4. Amazon RDS 数据库实例的磁盘空间不足。
  5. 表的文件大小已达到上限。

有关 Amazon RDS 支持的存储引擎的更多信息,请参阅 Amazon RDS 上支持的 MySQL 存储引擎

解决方法

1.MEMORY 引擎表达到大小上限

通过运行与下方类似的命令并检查引擎值,确认 MEMORY 引擎表的大小是否已达到其上限:

mysql> show table status from database_name like 'table_name'\G

如果输出中 data_length 变量的值大于 max_data_length 变量的值,则表示该表的大小已达到其上限。这就是您收到错误消息的原因。

您可以通过增加与数据库实例关联的自定义参数组中的 max_heap_table_size 参数的大小,来解决此错误。有关更多信息,请参阅创建数据库参数组。请确保不要超过所使用的 Amazon RDS 数据库实例类的数据库实例类内存限制。有关数据库实例可用内存的更多信息,请参阅 Amazon RDS 实例类型

2.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 参数设置为更高的值。

3.InnoDB 表空间文件已满

InnoDB 表的表空间大小上限为 40 亿页 (64 TB)。有关更多信息,请参阅 MySQL 文档中的 InnoDB 限制

对于大于 1 TB 的表,您可以将表分区为多个表空间文件。您可以使用不同的分区类型(例如 RANGELISTHASH 等等)对表进行分区,具体取决于您的使用情形。例如,您可以根据创建的年份截断旧数据,也可以为每年创建单独的分区。有关更多信息,请参阅 MySQL 文件大小限制和 MySQL 文档中的分区

重要:在生产环境中实施更改之前,应彻底测试分区可能对应用程序产生的影响。

您可以使用与下方类似的表修改语句,将现有表转换为分区表:

ALTER TABLE table_name 
PARTITION BY HASH(id)
PARTITIONS 8;

注意:将现有表转换为分区表不会恢复为 InnoDB 表空间分配的空间。要恢复 InnoDB 空间,请参阅如何解决 Amazon RDS MySQL 数据库实例使用的存储超过预期的问题?

4.Amazon RDS 数据库实例磁盘空间不足

如果 Amazon RDS 数据库实例处于 STORAGE_FULL 状态,则会遇到 HA_ERR_RECORD_FILE_FULL 错误。要解决此错误,请为数据库实例增加更多存储空间。有关更多信息,请参阅 Amazon RDS 数据库实例存储空间用尽

(可选)您可以使用 Amazon CloudWatch FreeStorageSpace 指标监控数据库实例的可用存储空间。有关更多信息,请参阅 Amazon RDS 监控概述。您还可以订阅低存储空间 Amazon RDS 事件通知,以便数据库实例占用分配的存储空间超过 90% 时收到通知。有关更多信息,请参阅 Amazon RDS 事件类型和事件消息

5.该表的文件大小已达到上限

Amazon RDS 中的文件大小限制将 InnoDB 文件每表的表空间限制为 16 TB,但 2014 年之前创建的某些数据库实例的上限比这要低。

如果数据库实例的大小限制较低,则可以使用 mysqldump 来转储数据。然后,将数据导入具有更高限制的新数据库实例。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?