如何对使用 Amazon RDS for MySQL 时遇到的 “MySQL HA_ERR_RECORD_FILE_FULL” 错误进行问题排查?

2 分钟阅读
0

我在尝试将数据写入 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 存储引擎

解决方案

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 的表,您可以将表分区为多个表空间文件。您可以使用不同的分区类型(例如 RANGELISTHASH)对表进行分区,具体取决于您的使用情形。例如,您可以根据您创建的年份截断旧数据,也可以为每年创建单独的分区。有关更多信息,请参阅 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 数据转储。然后,将数据导入具有更高限制的新数据库实例。


相关信息

如何解决 Amazon RDS 数据库实例用尽存储空间时出现的问题?

相关视频

AWS 官方
AWS 官方已更新 3 年前