Amazon Relational Database Service
用户指南 (API Version 2014-10-31)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

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

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

不一致的 InnoDB 缓冲池大小

对于 MySQL 5.7,管理 InnoDB 缓冲池的方式当前存在错误。MySQL 5.7 可能将 innodb_buffer_pool_size 参数的值调整为较大的值,这会导致 InnoDB 缓冲池增长得过大并占用过多内存。此效果会导致 MySQL 数据库引擎停止运行或阻止 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.40 异步 I/O

如果您具有在 2014 年 4 月 23 日之前创建并在 2014 年 10 月 17 之后升级到 MySQL 版本 5.5.40 的 MySQL 数据库实例,则可能会发现 I/O 性能降低情况。此性能降低可能是由某个错误导致的,出现该错误时将禁用 innodb_use_native_aio 参数 (即使相应的数据库参数组启用了 innodb_use_native_aio 参数)。

要纠正此错误,建议将运行版本 5.5.40 的 MySQL 数据库实例升级到运行版本 5.5.40a 的 MySQL 数据库实例,这将更正此行为。有关次要版本升级的信息,请参阅将 MySQL 数据库引擎

有关 MySQL 异步 I/O 的更多信息,请转至 MySQL 文档中的 Linux 中的异步 I/O

索引合并优化返回错误结果

使用索引合并优化的查询可能因 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.6 或 5.7。有关更多信息,请参阅升级 MySQL 数据库快照

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

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

有关更多信息,请转至索引合并优化

日志文件大小

对于 MySQL 5.6.20 版和更高版本,写入到重做日志的 BLOB 存在大小限制。要解决此限制,请确保您的 MySQL 数据库实例的 innodb_log_file_size 参数是在您的表中找到的最大 BLOB 数据大小与同一表中其他可变长度字段 (VARCHARVARBINARYTEXT) 的长度的和的 10 倍。有关如何设置参数值的信息,请参阅使用数据库参数组。有关重做日志 BLOB 大小限制的信息,请转至 MySQL 5.6.20 中的更改

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

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

lower_case_table_names

因为 Amazon RDS 使用区分大小写的文件系统,所以不支持将 lower_case_table_names 服务器参数的值设置为 2 (“按原样存储名称,但按小写字母进行比较”)。Amazon RDS 数据库实例的受支持的值为 0 (默认值)(“按原样存储名称,比较时区分大小写”) 或 1 (“以小写字母存储名称,比较时不区分大小写”)。

在创建数据库实例前,应将 lower_case_table_names 参数设置为自定义数据库参数组的一部分。您应该避免更改现有数据库实例的 lower_case_table_names 参数,否则可能导致时间点恢复备份与只读副本数据库实例不一致。

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

long_query_time

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

MySQL 文件大小限制

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

注意

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

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

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

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

确定表的文件大小

  • 使用以下 SQL 命令可确定任何表是否太大以及是否适合进行分区。

    SELECT TABLE_SCHEMA, TABLE_NAME, round(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024), 2) As "Approximate size (MB)" FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema');

启用 InnoDB file-per-table 表空间

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

禁用 InnoDB file-per-table 表空间

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

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

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

ALTER TABLE table_name ENGINE=InnoDB;