

# Amazon RDS for MySQL 的已知问题和限制
<a name="MySQL.KnownIssuesAndLimitations"></a>

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

**Topics**
+ [

## InnoDB 保留字
](#MySQL.Concepts.KnownIssuesAndLimitations.InnodbDatabaseName)
+ [

## Amazon RDS for MySQL 存储已满行为
](#MySQL.Concepts.StorageFullBehavior)
+ [

## 不一致的 InnoDB 缓冲池大小
](#MySQL.Concepts.KnownIssuesAndLimitations.InnodbBufferPoolSize)
+ [

## 索引合并优化返回不正确的结果
](#MySQL.Concepts.KnownIssuesAndLimitations.IndexMergeOptimization)
+ [

## Amazon RDS 数据库实例的 MySQL 参数异常错误
](#MySQL.Concepts.ParameterNotes)
+ [

## Amazon RDS 中的 MySQL 文件大小限制
](#MySQL.Concepts.Limits.FileSize)
+ [

## 不支持 MySQL 密钥环插件
](#MySQL.Concepts.Limits.KeyRing)
+ [

## 自定义端口
](#MySQL.Concepts.KnownIssuesAndLimitations.CustomPorts)
+ [

## MySQL 存储过程限制
](#MySQL.Concepts.KnownIssuesAndLimitations.KillProcedures)
+ [

## 与外部源实例之间的基于 GTID 的复制
](#MySQL.Concepts.KnownIssuesAndLimitations.GTID)
+ [

## MySQL 默认身份验证插件
](#MySQL.Concepts.KnownIssuesAndLimitations.authentication-plugin)
+ [

## 覆盖 innodb\$1buffer\$1pool\$1size
](#MySQL.Concepts.KnownIssuesAndLimitations.innodb-bp-size)
+ [

## 从 MySQL 5.7 升级到 MySQL 8.4
](#MySQL.Concepts.KnownIssuesAndLimitations.upgrade-8-4)
+ [

## InnoDB 页面压缩
](#MySQL.Concepts.KnownIssuesAndLimitations.innodb-page-compression)

## InnoDB 保留字
<a name="MySQL.Concepts.KnownIssuesAndLimitations.InnodbDatabaseName"></a>

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

## Amazon RDS for MySQL 存储已满行为
<a name="MySQL.Concepts.StorageFullBehavior"></a>

当 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 存储自动扩展功能自动管理容量](USER_PIOPS.Autoscaling.md)。
+ 修改数据库实例以增加其存储容量。

  有关增加存储容量的更多信息，请参阅 [增加数据库实例存储容量](USER_PIOPS.ModifyingExisting.md)。

进行这些更改之一后，数据库实例将自动重新启动。有关修改 数据库实例的信息，请参阅[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

## 不一致的 InnoDB 缓冲池大小
<a name="MySQL.Concepts.KnownIssuesAndLimitations.InnodbBufferPoolSize"></a>

对于 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](https://bugs.mysql.com/bug.php?id=79379)。

## 索引合并优化返回不正确的结果
<a name="MySQL.Concepts.KnownIssuesAndLimitations.IndexMergeOptimization"></a>

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

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

```
1. SELECT * FROM table1
2. WHERE indexed_col1 = 'value1' AND indexed_col2 = 'value2';
```

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

要解决此问题，您可以执行下列操作之一：
+ 在 MySQL 数据库实例的数据库参数组中将 `optimizer_switch` 参数设置为 `index_merge=off`。有关设置数据库参数组参数的信息，请参阅[Amazon RDS 的参数组](USER_WorkingWithParamGroups.md)。
+ 将 MySQL 数据库实例升级到 MySQL 5.7 或 8.0 版。有关更多信息，请参阅 [升级 RDS for MySQL 数据库引擎](USER_UpgradeDBInstance.MySQL.md)。
+ 如果无法升级实例或更改 `optimizer_switch` 参数，您可以通过显式标识查询的索引来纠正错误，例如：

  ```
  1. SELECT * FROM table1
  2. USE INDEX covering_index
  3. WHERE indexed_col1 = 'value1' AND indexed_col2 = 'value2';
  ```

有关更多信息，请参阅 MySQL 文档中的[索引合并优化](https://dev.mysql.com/doc/refman/8.0/en/index-merge-optimization.html)。

## Amazon RDS 数据库实例的 MySQL 参数异常错误
<a name="MySQL.Concepts.ParameterNotes"></a>

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

### lower\$1case\$1table\$1names
<a name="MySQL.Concepts.ParameterNotes.lower-case-table-names"></a>

因为 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 和 8.4 版本支持 1（以小写字母形式存储名称，并且比较不区分大小写）。

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

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

当参数组与 8.0 或 8.4 版 MySQL 数据库实例相关联时，您将无法在参数组中修改 `lower_case_table_names` 参数。

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

### long\$1query\$1time
<a name="MySQL.Concepts.ParameterNotes.long_query_time"></a>

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

## Amazon RDS 中的 MySQL 文件大小限制
<a name="MySQL.Concepts.Limits.FileSize"></a>

对于 MySQL 8.0 及更高版本的数据库实例，最大文件大小为 16 TiB。使用 file-per-table 表空间时，最大文件大小将 InnoDB 表的大小限制为 16 TiB。默认情况下，为 MySQL 数据库实例设置 InnoDB file-per-table 表空间 (表各自位于自己的表空间中)。有关更多信息，请参阅 MySQL 文档中的 [InnoDB limits](https://dev.mysql.com/doc/refman/8.0/en/innodb-limits.html)。

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

根据您的应用程序，使用 InnoDB file-per-table 表空间有一些优缺点。要确定适用于您的应用程序的最佳方法，请参阅 MySQL 文档中的 [File-Per-Table 表空间](https://dev.mysql.com/doc/refman/8.0/en/innodb-file-per-table-tablespaces.html)。

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

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

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

**确定 InnoDB 系统表空间和数据字典表空间的大小**
+ 使用以下 SQL 命令可确定任何表空间是否过大以及是否适合进行分区。
**注意**  
数据字典表空间特定于 MySQL 8.0 及更高版本。

  ```
  1. select FILE_NAME,TABLESPACE_NAME, ROUND(((TOTAL_EXTENTS*EXTENT_SIZE)
  2. /1024/1024/1024), 2)  as "File Size (GB)" from information_schema.FILES
  3. where tablespace_name in ('mysql','innodb_system');
  ```

**确定 InnoDB 系统表空间之外的 InnoDB 用户表的大小（针对 MySQL 5.7 版本）**
+ 使用以下 SQL 命令可确定任何表是否太大以及是否适合进行分区。

  ```
  1. SELECT SPACE,NAME,ROUND((ALLOCATED_SIZE/1024/1024/1024), 2)
  2. as "Tablespace Size (GB)"
  3. FROM information_schema.INNODB_SYS_TABLESPACES ORDER BY 3 DESC;
  ```

**确定 InnoDB 系统表空间之外的 InnoDB 用户表的大小（对于 MySQL 8.0 及更高版本）**
+ 使用以下 SQL 命令可确定任何表是否太大以及是否适合进行分区。

  ```
  1. SELECT SPACE,NAME,ROUND((ALLOCATED_SIZE/1024/1024/1024), 2)
  2. as "Tablespace Size (GB)"
  3. 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\$1file\$1per\$1table* 参数设置为 `1`。

**禁用 InnoDB file-per-table 表空间**
+ 请在数据库实例的参数组中将 *innodb\$1file\$1per\$1table* 参数设置为 `0`。

有关更新参数组的信息，请参阅[Amazon RDS 的参数组](USER_WorkingWithParamGroups.md)。

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

```
ALTER TABLE table_name TABLESPACE=innodb_file_per_table;
```

## 不支持 MySQL 密钥环插件
<a name="MySQL.Concepts.Limits.KeyRing"></a>

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

## 自定义端口
<a name="MySQL.Concepts.KnownIssuesAndLimitations.CustomPorts"></a>

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

## MySQL 存储过程限制
<a name="MySQL.Concepts.KnownIssuesAndLimitations.KillProcedures"></a>

在以下 RDS for MySQL 版本上，[mysql.rds\$1kill](mysql-stored-proc-ending.md#mysql_rds_kill) 和 [mysql.rds\$1kill\$1query](mysql-stored-proc-ending.md#mysql_rds_kill_query) 存储过程无法终止由用户名多于 16 个字符的 MySQL 用户所拥有的会话或查询：
+ 8.0.32 及更低的 8 版本
+ 5.7.41 及更低的 5.7 版本

## 与外部源实例之间的基于 GTID 的复制
<a name="MySQL.Concepts.KnownIssuesAndLimitations.GTID"></a>

Amazon RDS 支持基于全局事务标识符（GTID），从外部 MySQL 实例复制到需要在配置过程中设置 GTID\$1PURGED 的 Amazon RDS for MySQL 数据库实例。但是，只有 RDS for MySQL 8.0.37 及更高版本才支持此功能。

## MySQL 默认身份验证插件
<a name="MySQL.Concepts.KnownIssuesAndLimitations.authentication-plugin"></a>

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

RDS for MySQL 8.4 及更高版本使用 `caching_sha2_password` 插件作为默认身份验证插件。可以更改 MySQL 8.4 的默认身份验证插件。`mysql_native_password` 插件仍然适用于 MySQL 8.4，但对该插件的支持将在 MySQL 8.4 中终止。要更改默认身份验证插件，请创建自定义参数组并修改 `authentication_policy` 参数的值。有关更多信息，请参阅 [原定设置和自定义参数组](parameter-groups-overview.md#parameter-groups-overview.custom)。

## 覆盖 innodb\$1buffer\$1pool\$1size
<a name="MySQL.Concepts.KnownIssuesAndLimitations.innodb-bp-size"></a>

对于微型或小型数据库实例类，`innodb_buffer_pool_size` 参数的默认值可能与运行以下命令时返回的值不同：

```
mysql> SELECT @@innodb_buffer_pool_size;
```

当 Amazon RDS 在管理数据库实例类时需要覆盖默认值时，可能会出现这种差异。如有必要，您可以覆盖默认值并将其设置为数据库实例类支持的值。要确定有效值，请将内存使用量和数据库实例上的可用内存总量相加。有关更多信息，请参阅 [Amazon RDS 实例类型](https://aws.amazon.com/rds/instance-types/)。

如果您的数据库实例只有 4 GB 的内存，则无法将 `innodb_buffer_pool_size` 设置为 8 GB，但可以将其设置为 3 GB，具体取决于您为其他参数分配的内存量。

如果您输入的值太大，Amazon RDS 会将该值降低到以下限制范围内：
+ 微型数据库实例类：256 MB
+ db.t4g.micro 数据库实例类：128 MB

## 从 MySQL 5.7 升级到 MySQL 8.4
<a name="MySQL.Concepts.KnownIssuesAndLimitations.upgrade-8-4"></a>

您无法从 MySQL 5.7 直接升级到 MySQL 8.4。必须首先从 MySQL 5.7 升级到 MySQL 8.0，然后从 MySQL 8.0 升级到 MySQL 8.4。有关更多信息，请参阅 [RDS for MySQL 的主要版本升级](USER_UpgradeDBInstance.MySQL.Major.md)。

## InnoDB 页面压缩
<a name="MySQL.Concepts.KnownIssuesAndLimitations.innodb-page-compression"></a>

InnoDB 页面压缩不适用于文件系统块大小为 16k 的 Amazon RDS 数据库实例，因为文件系统块大小必须小于 InnoDB 页面大小。从 2024 年 2 月开始，所有新创建的数据库实例的文件系统块大小均为 16k，这会增加吞吐量并减少页面刷新期间的 IOPS 消耗。