Amazon RDS for MySQL 的已知问题和限制 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Amazon RDS for MySQL 的已知问题和限制

下面给出了有关使用 Amazon RDS for MySQL 的已知问题和限制。

InnoDB 保留字

InnoDB 是 RDS for MySQL 的保留字。您不能将此名称用于 MySQL 数据库。

Amazon RDS for MySQL 存储已满行为

当 MySQL 数据库实例的存储空间已满时,可能存在元数据不一致、字典不匹配和孤立表。为防止出现这些问题,Amazon RDS 自动停止达到 storage-full 状态的数据库实例。

在以下情况下,MySQL 数据库实例达到 storage-full 状态:

  • 数据库实例的存储空间少于 20000 MiB,可用存储空间达到 200 MiB 或更少。

  • 数据库实例的存储空间多于 102400 MiB,可用存储空间达到 1024 MiB 或更少。

  • 数据库实例的存储空间介于 20000 MiB 到 102400 MiB 之间,可用存储空间不到 1%。

在由于数据库实例达到 storage-full 状态而 Amazon RDS 将其自动停止后,您仍然可以对其进行修改。要重新启动数据库实例,请至少完成以下操作之一:

进行这些更改之一后,数据库实例将自动重新启动。有关修改 数据库实例的信息,请参阅修改 Amazon RDS 数据库实例

不一致的 InnoDB 缓冲池大小

对于 MySQL 5.7,管理 InnoDB 缓冲池的方式当前存在错误。MySQL 5.7 可能将 innodb_buffer_pool_size 参数的值调整为较大的值,这会导致 InnoDB 缓冲池增长得过大并占用过多内存。此效果会导致 MySQL 数据库引擎停止运行或阻止该引擎启动。可用内存较少的数据库实例类更易出现此问题。

要解决此问题,请将 innodb_buffer_pool_size 参数的值设置为 innodb_buffer_pool_instances 参数值和 innodb_buffer_pool_chunk_size 参数值的积的倍数。例如,您可以将 innodb_buffer_pool_size 参数值设置为 innodb_buffer_pool_instances 参数值和 innodb_buffer_pool_chunk_size 参数值的积的 8 倍,如以下示例所示。

innodb_buffer_pool_chunk_size = 536870912 innodb_buffer_pool_instances = 4 innodb_buffer_pool_size = (536870912 * 4) * 8 = 17179869184

有关此 MySQL 5.7 错误的详细信息,请参阅 MySQL 文档中的 https://bugs.mysql.com/bug.php?id=79379

索引合并优化返回不正确的结果

使用索引合并优化的查询可能因 MySQL 5.5.37 中引入的 MySQL 查询优化程序中的错误而返回不正确的结果。当您针对一个带多条索引的表发出查询时,此优化器将基于多条索引扫描一系列行,但无法正确地合并这些结果。有关查询优化程序错误的详细信息,请参阅 MySQL 错误数据库中的 http://bugs.mysql.com/bug.php?id=72745http://bugs.mysql.com/bug.php?id=68194

例如,假设发出针对一个带两条索引的表的查询,其中搜索参数会引用索引列。

SELECT * FROM table1 WHERE indexed_col1 = 'value1' AND indexed_col2 = 'value2';

在此情况下,搜索引擎将搜索这两条索引。但由于出现错误,导致合并结果不正确。

要解决此问题,您可以执行下列操作之一:

  • 在 MySQL 数据库实例的数据库参数组中将 optimizer_switch 参数设置为 index_merge=off。有关设置数据库参数组参数的信息,请参阅使用参数组

  • 将 MySQL 数据库实例升级到 MySQL 5.7 或 8.0 版。有关更多信息,请参阅升级 MySQL 数据库引擎

  • 如果无法升级实例或更改 optimizer_switch 参数,您可以通过显式标识查询的索引来纠正错误,例如:

    SELECT * FROM table1 USE INDEX covering_index WHERE indexed_col1 = 'value1' AND indexed_col2 = 'value2';

有关更多信息,请参阅 MySQL 文档中的索引合并优化

Amazon RDS 数据库实例的 MySQL 参数异常错误

某些 MySQL 参数在与 Amazon RDS 数据库实例一起使用时需要考虑一些特殊的注意事项。

lower_case_table_names

因为 Amazon RDS 使用区分大小写的文件系统,所以不支持将 lower_case_table_names 服务器参数的值设置为 2(名称存储为给定名称,但按小写字母进行比较)。以下是 Amazon RDS for MySQL 数据库实例支持的值:

  • 所有 RDS for MySQL 版本均支持 0(名称存储为给定名称,而比较区分大小写)。

  • RDS for MySQLL 版本 5.7 和版本 8.0.28 及更高的 8.0 版本支持 1(以小写字母形式存储名称,并且比较不区分大小写)。

创建数据库实例前,请在自定义数据库参数组中设置 lower_case_table_names 参数。然后,您可以在创建数据库实例时指定自定义数据库参数组。

当参数组与版本低于 8.0 的 MySQL 数据库实例相关联时,建议您避免在参数组中修改 lower_case_table_names 参数。更改它可能导致时间点恢复备份与只读副本数据库实例不一致。

当参数组与版本低于 8.0 的 MySQL 数据库实例相关联时,建议您避免在参数组中修改 lower_case_table_names 参数。

只读副本应总是使用与源数据库实例相同的 lower_case_table_names 参数值。

long_query_time

您可以将 long_query_time 参数设置为浮点值,这样,您可以将慢速查询以微秒分辨率记录到 MySQL 慢速查询日志中。您可以设置一个值(如 0.1 秒,也就是 100 毫秒),在调试时间不到一秒的慢事务时提供帮助。

Amazon RDS 中的 MySQL 文件大小限制

对于 MySQL 数据库实例,最大预配置存储限制在使用 InnoDB file-per-table 表空间时将表的最大大小限制为 16 TB。此限制也将系统表空间的最大大小约束为 16 TB。默认情况下,为 MySQL 数据库实例设置 InnoDB file-per-table 表空间 (表各自位于自己的表空间中)。

注意

某些现有的数据库实例具有下限。例如,在 2014 年 4 月之前创建的 MySQL 数据库实例的文件和表大小限制为 2 TB。不管创建数据库实例的时间如何,此 2 TB 文件大小限制也适用于从 2014 年 4 月之前创建的数据库快照创建的数据库实例或只读副本。

根据您的应用程序,使用 InnoDB file-per-table 表空间有一些优缺点。要确定适用于您的应用程序的最佳方法,请参阅 MySQL 文档中的 File-Per-Table 表空间

建议不要允许表增长到最大文件大小。一般而言,更好的方法是将数据分区到较小的表中,这可以提高性能并缩短恢复时间。

可用于将大型表划分为多个较小表的一个选项是分区。分区 可基于您指定的规则将大型表的各个部分分布到单独的文件中。例如,如果您按日期存储事务,则可以创建分区规则,以便使用分区将较旧的事务分布到单独的文件中。随后您可以定期存档无需随时可供应用程序使用的历史事务数据。有关更多信息,请参阅 MySQL 文档中的分区

由于没有单个系统表或视图可以提供所有表和 InnoDB 系统表空间的大小,因此必须查询多个表才能确定表空间的大小。

确定 InnoDB 系统表空间和数据字典表空间的大小
  • 使用以下 SQL 命令可确定任何表空间是否过大以及是否适合进行分区。

    注意

    数据字典表空间特定于 MySQL 8.0。

    select FILE_NAME,TABLESPACE_NAME, ROUND(((TOTAL_EXTENTS*EXTENT_SIZE) /1024/1024/1024), 2) as "File Size (GB)" from information_schema.FILES where tablespace_name in ('mysql','innodb_system');
确定 InnoDB 系统表空间之外的 InnoDB 用户表的大小(针对 MySQL 5.7 版本)
  • 使用以下 SQL 命令可确定任何表是否太大以及是否适合进行分区。

    SELECT SPACE,NAME,ROUND((ALLOCATED_SIZE/1024/1024/1024), 2) as "Tablespace Size (GB)" FROM information_schema.INNODB_SYS_TABLESPACES ORDER BY 3 DESC;
确定 InnoDB 系统表空间之外的 InnoDB 用户表的大小(针对于 MySQL 8.0 版本)
  • 使用以下 SQL 命令可确定任何表是否太大以及是否适合进行分区。

    SELECT SPACE,NAME,ROUND((ALLOCATED_SIZE/1024/1024/1024), 2) as "Tablespace Size (GB)" FROM information_schema.INNODB_TABLESPACES ORDER BY 3 DESC;
确定非 InnoDB 用户表的大小
  • 使用以下 SQL 命令来确定是否有任何非 InnoDB 用户表过大。

    SELECT TABLE_SCHEMA, TABLE_NAME, round(((DATA_LENGTH + INDEX_LENGTH+DATA_FREE) / 1024 / 1024/ 1024), 2) As "Approximate size (GB)" FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema') and ENGINE<>'InnoDB';
启用 InnoDB file-per-table 表空间
  • 请在数据库实例的参数组中将 innodb_file_per_table 参数设置为 1

禁用 InnoDB file-per-table 表空间
  • 请在数据库实例的参数组中将 innodb_file_per_table 参数设置为 0

有关更新参数组的信息,请参阅使用参数组

启用或禁用 InnoDB file-per-table 表空间后,可以发出 ALTER TABLE 命令将一个表从全局表空间移至它自己的表空间,或从它自己的表空间移至全局表空间,如以下示例所示:

ALTER TABLE table_name ENGINE=InnoDB;

不支持 MySQL 密钥环插件

目前,Amazon RDS for MySQL 不支持 MySQL keyring_aws Amazon Web Services 密钥环插件。

自定义端口

Amazon RDS 禁止连接到 MySQL 引擎的自定义端口 33060。为您的 MySQL 引擎选择不同的端口。

MySQL 存储过程限制

在以下 RDS for MySQL 版本上,mysql.rds_killmysql.rds_kill_query 存储过程无法终止由用户名多于 16 个字符的 MySQL 用户所拥有的会话或查询:

  • 8.0.32 及更低的 8 版本

  • 5.7.41 及更低的 5.7 版本

与外部源实例之间的基于 GTID 的复制

Amazon RDS 不支持基于全局事务标识符(GTID)从外部 MySQL 实例复制到需要在配置过程中设置 GTID_PURGED 的 Amazon RDS for MySQL 数据库实例。

MySQL 默认身份验证插件

RDS for MySQL 版本 8.0.34 及更高版本使用 mysql_native_password 插件。您将无法更改 default_authentication_plugin 设置。