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 存储自动扩展功能自动管理容量。
-
修改数据库实例以增加其存储容量。
有关增加存储容量的更多信息,请参阅 增加数据库实例存储容量。
进行这些更改之一后,数据库实例将自动重新启动。有关修改 数据库实例的信息,请参阅修改 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=72745
例如,假设发出针对一个带两条索引的表的查询,其中搜索参数会引用索引列。
SELECT * FROM table1 WHERE indexed_col1 = 'value1' AND indexed_col2 = 'value2';
在此情况下,搜索引擎将搜索这两条索引。但由于出现错误,导致合并结果不正确。
要解决此问题,您可以执行下列操作之一:
在 MySQL 数据库实例的数据库参数组中将
optimizer_switch
参数设置为index_merge=off
。有关设置数据库参数组参数的信息,请参阅Amazon RDS 的参数组。-
将 MySQL 数据库实例升级到 MySQL 5.7 或 8.0 版。有关更多信息,请参阅 升级 RDS for 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 MySQL 版本 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
。
有关更新参数组的信息,请参阅Amazon RDS 的参数组。
启用或禁用 InnoDB file-per-table 表空间后,可以发出 ALTER
TABLE
命令将一个表从全局表空间移至它自己的表空间,或从它自己的表空间移至全局表空间,如以下示例所示:
ALTER TABLE table_name TABLESPACE=innodb_file_per_table;
不支持 MySQL 密钥环插件
目前,Amazon RDS for MySQL 不支持 MySQL keyring_aws
Amazon Web Services 密钥环插件。
自定义端口
Amazon RDS 禁止连接到 MySQL 引擎的自定义端口 33060。为您的 MySQL 引擎选择不同的端口。
MySQL 存储过程限制
在以下 RDS for MySQL 版本上,mysql.rds_kill 和 mysql.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 数据库实例。但是,只有 RDS for MySQL 8.0.37 及更高版本才支持此功能。
MySQL 默认身份验证插件
RDS for MySQL 版本 8.0.34 及更高版本使用 mysql_native_password
插件。您将无法更改 default_authentication_plugin
设置。
覆盖 innodb_buffer_pool_size
对于微型或小型数据库实例类,innodb_buffer_pool_size
参数的默认值可能与运行以下命令时返回的值不同:
mysql> SELECT @@innodb_buffer_pool_size;
当 Amazon RDS 在管理数据库实例类时需要覆盖默认值时,可能会出现这种差异。如有必要,您可以覆盖默认值并将其设置为数据库实例类支持的值。要确定有效值,请将内存使用量和数据库实例上的可用内存总量相加。有关更多信息,请参阅 Amazon RDS 实例类型
如果您的数据库实例只有 4 GB 的内存,则无法将 innodb_buffer_pool_size
设置为 8 GB,但可以将其设置为 3 GB,具体取决于您为其他参数分配的内存量。
如果您输入的值太大,Amazon RDS 会将该值降低到以下限制范围内:
-
微型数据库实例类:256 MB
-
db.t4g.micro 数据库实例类:128 MB