

# Amazon RDS 故障排除
<a name="CHAP_Troubleshooting"></a>

利用以下部分帮助排查您使用 Amazon RDS 和 Amazon Aurora 中的数据库实例时遇到的问题。

**Topics**
+ [无法连接到 Amazon RDS 数据库实例](#CHAP_Troubleshooting.Connecting)
+ [Amazon RDS 安全性问题](#CHAP_Troubleshooting.Security)
+ [排查网络不兼容状态问题](#CHAP_Troubleshooting.IncompatibleNetworkMode)
+ [重置数据库实例拥有者密码](#CHAP_Troubleshooting.ResetPassword)
+ [Amazon RDS 数据库实例中断或重新引导](#CHAP_Troubleshooting.Reboots)
+ [Amazon RDS 数据库参数更改未生效](#CHAP_Troubleshooting.Parameters)
+ [Amazon RDS 数据库实例用完存储空间](#CHAP_Troubleshooting.Storage)
+ [Amazon RDS 可用数据库实例不足](#CHAP_Troubleshooting.Capacity)
+ [Amazon RDS 中的可用内存问题](#Troubleshooting.FreeableMemory)
+ [MySQL 和 MariaDB 问题](#CHAP_Troubleshooting.MySQL)
+ [无法将备份保留期设置为 0](#CHAP_Troubleshooting.Backup.Retention)

 有关使用 Amazon RDS API 调试问题的信息，请参阅[对 Amazon RDS 上的应用程序进行故障排除](APITroubleshooting.md)。

## 无法连接到 Amazon RDS 数据库实例
<a name="CHAP_Troubleshooting.Connecting"></a>

当您无法连接到数据库实例时，常见原因如下：
+ **入站规则** – 由本地防火墙强制执行的访问规则与您授权用于访问数据库实例的 IP 地址可能不匹配。该问题很可能是由安全组中的入站规则所致。

  默认情况下，数据库实例不允许访问。通过与 VPC 关联的安全组授予访问权限，该安全组允许流量进出数据库实例。如有必要，请将针对您具体情况的入站和出站规则添加到安全组。您可以指定一个 IP 地址、IP 地址范围或另一个 VPC 安全组。
**注意**  
添加新入站规则时，您可以为**源**选择**我的 IP**，以允许从浏览器中检测到的 IP 地址访问数据库实例。

  有关设置安全组的更多信息，请参阅[通过创建安全组提供对 VPC 中的数据库实例的访问](CHAP_SettingUp.md#CHAP_SettingUp.SecurityGroup)。
**注意**  
不允许来自 169.254.0.0/16 范围内的 IP 地址的客户端连接。这是自动私有 IP 寻址范围 (APIPA)，它用于本地链路寻址。
+ **公开可用性** – 要从 VPC 外部连接到您的数据库实例（例如通过使用客户端应用程序），实例必须具有向其分配的公有 IP 地址。

  要使实例公开可用，请修改它，在**公开可用性**下选择**是**。有关更多信息，请参阅 [对互联网隐藏 VPC 中的数据库实例](USER_VPC.WorkingWithRDSInstanceinaVPC.md#USER_VPC.Hiding)。
+ **端口** – 由于您的本地防火墙限制，无法使用您在创建数据库实例时指定的端口来发送和接收通信。如需确定您的网络是否允许指定端口用于入站和出站通信，请咨询您的网络管理员。
+ **可用性** – 对于新创建的数据库实例，数据库实例具有 `creating` 状态，直到该数据库实例可供使用。当状态变为 `available` 时，您可以连接到该数据库实例。根据数据库实例的大小，可能要用最长 20 分钟，实例才可用。
+ **互联网网关** – 对于希望可公开访问的数据库实例，其数据库子网组中的子网必须具有互联网网关。

**为子网配置互联网网关**

  1. 登录AWS 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

  1. 在导航窗格中，选择 **Databases (数据库)**，然后选择数据库实例的名称。

  1. 在 **Connectivity & security (连接和安全)** 选项卡中，记录 **VPC** 下 VPC ID 的值以及 **Subnets (子网)** 下子网 ID 的值。

  1. 通过以下网址打开 Amazon VPC 控制台：[https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)。

  1. 在导航窗格中，选择 **Internet Gateways（互联网网关）**。验证是否有 Internet 网关附加到您的 VPC。否则，选择 **Create Internet Gateway** 以创建 Internet 网关。选择 Internet 网关，然后选择 **Attach to VPC** 并按照说明将其附加到您的 VPC。

  1. 在导航窗格中，选择 **Subnets**，然后选择您的子网。

  1. 在 **Route Table** 选项卡上，验证 `0.0.0.0/0` 的路由是否为目的地以及您的 VPC 的 Internet 网关是否为目标。

     如果您使用实例的 IPv6 地址连接到实例，请检查是否有一个路由可以将所有 IPv6 流量 (`::/0`) 指向 Internet 网关。否则请执行以下操作：

     1. 选择路由表的 ID (rtb-*xxxxxxxx*) 以导航到路由表。

     1. 在 **Routes（路由）**选项卡上，选择 **Edit routes（编辑路由）**。选择 **Add route (添加路由)**，将 `0.0.0.0/0` 用作目的地并将 Internet 网关用作目标。

        对于 IPv6，选择 **Add route (添加路由)**，将 `::/0` 用作目的地并将 Internet 网关用作目标。

     1. 选择 **Save routes（保存路由）**。

     此外，如果您尝试连接到 IPv6 端点，请确保客户端 IPv6 地址范围已获得连接到数据库实例的授权。

  有关更多信息，请参阅 [在 VPC 中使用数据库实例](USER_VPC.WorkingWithRDSInstanceinaVPC.md)。

有关引擎特定的连接问题，请参阅以下主题：
+  [排除与 SQL Server 数据库实例的连接故障](USER_ConnectToMicrosoftSQLServerInstance.Troubleshooting.md)
+ [排除与 Oracle 数据库实例的连接故障](USER_ConnectToOracleInstance.Troubleshooting.md)
+ [排除与您的 RDS for PostgreSQL 实例的连接故障](USER_ConnectToPostgreSQLInstance.Troubleshooting.md)
+ [最大 MySQL 和 MariaDB 连接](#USER_ConnectToInstance.max_connections)

### 测试与数据库实例的连接
<a name="CHAP_Troubleshooting.Connecting.Test"></a>

您可以使用常见 Linux 或 Microsoft Windows 工具测试与数据库实例的连接。

从 Linux 或 Unix 终端，您可以通过输入以下命令来测试连接。将 `DB-instance-endpoint` 替换为端点，并将 `port` 替换为数据库实例的端口。

```
nc -zv DB-instance-endpoint port 
```

例如，下面显示了示例命令和返回值。

```
nc -zv postgresql1.c6c8mn7fake0.us-west-2.rds.amazonaws.com 8299

  Connection to postgresql1.c6c8mn7fake0.us-west-2.rds.amazonaws.com 8299 port [tcp/vvr-data] succeeded!
```

Windows 用户可使用 Telnet 测试与数据库实例的连接。Telnet 操作不支持除测试连接之外的用途。如果连接成功，则该操作不返回任何消息。如果连接失败，则您将收到一条错误消息，诸如以下内容。

```
C:\>telnet sg-postgresql1.c6c8mntfake0.us-west-2.rds.amazonaws.com 819

  Connecting To sg-postgresql1.c6c8mntfake0.us-west-2.rds.amazonaws.com...Could not open
  connection to the host, on port 819: Connect failed
```

如果 Telnet 操作返回成功值，则您的安全组配置正确。

**注意**  
Amazon RDS 不接受 Internet 控制消息协议 (ICMP) 流量，包括 ping。

### 排查连接身份验证错误
<a name="CHAP_Troubleshooting.Connecting.Authorization"></a>

在某些情况下，您可以连接到数据库实例，但会收到身份验证错误。在这些情况下，您可能需要重置数据库实例的主用户密码。您可以通过修改 RDS 实例来做到这一点。

有关修改 数据库实例的更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

## Amazon RDS 安全性问题
<a name="CHAP_Troubleshooting.Security"></a>

为避免出现安全性问题，切勿为用户账户使用您的 AWS 账户根用户电子邮件地址和密码。最佳做法是使用根用户来创建用户，并将这些用户分配给数据库用户账户。还可使用根用户创建其他用户账户（如有必要）。

有关创建用户的信息，请参阅[在 AWS 账户 中创建 IAM 用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)。有关在 AWS IAM Identity Center 中创建用户的信息，请参阅[管理 IAM Identity Center 中的身份](https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-identity-source-sso.html)。

### 错误消息“无法检索账户属性，某些控制台功能可能受损。”
<a name="CHAP_Troubleshooting.Security.AccountAttributes"></a>

您可能会由于几个原因而收到此错误。这可能是因为您的账户缺少权限，或者您的账户尚未正确设置。如果您的账户是新账户，可能该账户还没准备好。如果是现有账户，您的访问策略中可能缺少执行特定操作的权限（如，创建数据库实例）。要修复该问题，您的管理员需要为您的账户提供必要的角色。有关更多信息，请参阅 [IAM 文档](https://docs.aws.amazon.com/IAM/latest/UserGuide/)。

## 排查网络不兼容状态问题
<a name="CHAP_Troubleshooting.IncompatibleNetworkMode"></a>

网络不兼容状态意味着可能仍然可以在数据库级别访问数据库，但您无法对其进行修改或重启。

### 原因
<a name="CHAP_Troubleshooting.IncompatibleNetworkMode.Causes"></a>

您的数据库实例的网络不兼容状态可能是以下操作之一造成的：
+ 修改数据库实例类。
+ 修改数据库实例以使用多可用区数据库集群部署。
+ 因维护事件更换主机。
+ 启动替换数据库实例。
+ 从快照备份进行还原。
+ 启动已停止的数据库实例。

### 解决方案
<a name="CHAP_Troubleshooting.IncompatibleNetworkMode.Resolution"></a>

#### 使用 start-db-instance 命令
<a name="CHAP_Troubleshooting.IncompatibleNetworkMode.Resolution1"></a>

要修复处于网络不兼容状态的数据库，请按照以下说明进行操作：

1. 打开 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)，然后从导航窗格中选择**数据库**。

1. 从**连接和安全**选项卡中选择处于网络不兼容状态的数据库实例，并记下数据库实例标识符、VPC ID 和子网 ID。

1. 使用 AWS CLI 运行 `start-db-instance` 命令。指定 `--db-instance-identifier` 值。
**注意**  
当数据库处于不兼容模式时运行此命令可能会导致一些停机时间。  
`start-db-instance` 命令无法解决 RDS for SQL Server 数据库实例的这一问题。

如果命令成功执行，则您的数据库状态更改为**可用**。

如果您的数据库重新启动，则数据库实例可能会在实例变为网络不兼容状态之前，执行上一次在实例上运行的操作。这可能会将实例移回网络不兼容状态。

如果 `start-db-instance` 命令未成功或实例移回网络不兼容状态，请在 RDS 控制台中打开**数据库**页面并选择表。导航到**日志和事件**部分。**近期事件**部分显示了要遵循的进一步解决步骤。消息分类如下：
+ **内部资源检查**：您的内部资源可能存在问题。
+ **DNS 检查**：在 VPC 控制台中检查 VPC 的 DNS 解析和主机名。
+ **ENI 检查**：数据库的弹性网络接口（ENI）可能不存在。
+ **网关检查**：公开可用的数据库的互联网网关未连接到 VPC。
+ **IP 检查**：子网中没有可用的 IP 地址。
+ **安全组检查**：没有与您的数据库关联的安全组或安全组无效。
+ **子网检查**：您的数据库子网组中没有有效的子网，或者您的子网存在问题。
+ **VPC 检查**：与您的数据库关联的 VPC 无效。

#### 执行时间点恢复
<a name="CHAP_Troubleshooting.IncompatibleNetworkMode.Resolution2"></a>

最佳做法是进行备份（快照或逻辑），以防数据库进入网络不兼容状态。请参阅[备份简介](USER_WorkingWithAutomatedBackups.md)。如果启用了自动备份，则暂时停止对数据库的任何写入并执行时间点恢复。

**注意**  
实例进入网络不兼容状态后，可能无法访问该数据库实例来执行逻辑备份。

如果您没有开启自动备份，请创建新的数据库实例。然后，使用 [AWS Database Migration Service（AWS DMS）](https://docs.aws.amazon.com/dms/latest/userguide/;Welcome.html)或使用备份和还原工具迁移数据。

如果这仍无法解决问题，请联系 支持 寻求进一步的帮助。

## 重置数据库实例拥有者密码
<a name="CHAP_Troubleshooting.ResetPassword"></a>

如果您被锁定在数据库实例之外，则可以以主用户身份登录。然后，您可以重置其他管理用户或角色的凭证。如果您无法以主用户身份登录，AWS 账户所有者可以重置主用户密码。有关可能需要重置哪些管理账户或角色的详细信息，请参阅[主用户账户权限](UsingWithRDS.MasterAccounts.md)。

您可以使用 Amazon RDS 控制台、AWS CLI 命令 [modify-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html)，或者使用 [ModifyDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBInstance.html) API 操作更改数据库实例密码。有关修改 数据库实例的更多信息，请参阅 [修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

## Amazon RDS 数据库实例中断或重新引导
<a name="CHAP_Troubleshooting.Reboots"></a>

重新启动数据库实例时可能会发生数据库实例中断。在将数据库实例置于某种禁止对其访问的状态，以及重新启动数据库时会出现这种情况。当您手动重启数据库实例时，可能会发生重启。当您更改需要在重启后才生效的数据库实例设置时，也可能会发生重启。

 当您更改需要重启的设置或手动引起重启时，才会发生数据库实例重启。如果您更改某个设置并请求此更改立即生效，则可能会立即发生重启。或者，可能在数据库实例的维护时段内发生重启。

 在出现下列情况之一时，会立即发生数据库实例重启：
+ 您将数据库实例的备份保留期从 0 更改为非零值或从非零值更改为 0。然后，将 **Apply Immediately**（立即应用）设置为 `true`。
+ 更改数据库实例类，并将**立即应用**设置为 `true`。
+ 将存储类型从**磁性（标准）**更改为**通用型 (SSD)** 或**预置 IOPS (SSD)**，或从**预置 IOPS (SSD)** 或**通用型 (SSD)** 更改为**磁性（标准）**。

在维护时段内，如果出现下列情况之一，则会发生数据库实例重启：
+ 将数据库实例的备份保留期从 0 更改为非零值或从非零值更改为 0 并将**立即应用**设置为 `false`。
+ 更改数据库实例类，并将**立即应用**设置为 `false`。

当您更改数据库参数组中的静态参数时，在与该参数组关联的数据库实例重启之前，此更改将不会生效。更改需要手动重新启动。在维护时段内，数据库实例不会自动重新启动。

要查看显示数据库实例操作的表以及设置**立即应用**值的效果，请参阅[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

## Amazon RDS 数据库参数更改未生效
<a name="CHAP_Troubleshooting.Parameters"></a>

在某些情况下，您可能会更改数据库参数组中的参数，但未看到更改生效。如果是这样，您可能需要重新启动与数据库参数组关联的数据库实例。当您更改动态参数时，更改将立即生效。当您更改静态参数时，在与该参数组关联的数据库实例重启之前，此更改将不会生效。

您可以使用 RDS 控制台重启数据库实例。或者，您可以显式调用 [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RebootDBInstance.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RebootDBInstance.html) API 操作。如果数据库实例处于多可用区部署中，则可以在不进行失效转移的情况下重启。在静态参数更改后重新引导关联的数据库实例的要求，可帮助缓解影响 API 调用的参数误配置的风险。调用 `ModifyDBInstance` 以更改数据库实例类就是这样的一个例子。有关更多信息，请参阅 [在 Amazon RDS 中修改数据库参数组中的参数](USER_WorkingWithParamGroups.Modifying.md)。

## Amazon RDS 数据库实例用完存储空间
<a name="CHAP_Troubleshooting.Storage"></a>

如果数据库实例用完存储空间，则该实例可能不再可用。我们强烈建议您持续监控 CloudWatch 内发布的 `FreeStorageSpace` 指标，以确保数据库实例具有足够的可用存储空间。

如果数据库实例的存储空间不足，其状态将更改为 `storage-full`。例如，为存储空间已用完的数据库实例调用 `DescribeDBInstances` API 操作将输出以下内容。

```
aws rds describe-db-instances --db-instance-identifier mydbinstance

DBINSTANCE  mydbinstance  2009-12-22T23:06:11.915Z  db.m5.large  mysql8.0  50  sa
storage-full  mydbinstance.clla4j4jgyph.us-east-1.rds.amazonaws.com  3306
us-east-1b  3
	SECGROUP  default  active
	PARAMGRP  default.mysql8.0  in-sync
```

要从这种情况下恢复，请使用 `ModifyDBInstance` API 操作或以下 AWS CLI 命令为实例添加更多存储空间。

对于 Linux、macOS 或 Unix：

```
aws rds modify-db-instance \
    --db-instance-identifier mydbinstance \
    --allocated-storage 60 \
    --apply-immediately
```

对于：Windows

```
aws rds modify-db-instance ^
    --db-instance-identifier mydbinstance ^
    --allocated-storage 60 ^
    --apply-immediately
```

```
DBINSTANCE  mydbinstance  2009-12-22T23:06:11.915Z  db.m5.large  mysql8.0  50  sa
storage-full  mydbinstance.clla4j4jgyph.us-east-1.rds.amazonaws.com  3306
us-east-1b  3  60
	SECGROUP  default  active
	PARAMGRP  default.mysql8.0  in-sync
```

现在，当您描述您的数据库实例时，您将看到数据库实例处于 `modifying` 状态，这表示正在扩展存储。

```
1. aws rds describe-db-instances --db-instance-identifier mydbinstance 
```

```
DBINSTANCE  mydbinstance  2009-12-22T23:06:11.915Z  db.m5.large  mysql8.0  50  sa
modifying  mydbinstance.clla4j4jgyph.us-east-1.rds.amazonaws.com
3306  us-east-1b  3  60
	SECGROUP  default  active
	PARAMGRP  default.mysql8.0  in-sync
```

存储扩展完成后，数据库实例的状态将更改为 `available`。

```
aws rds describe-db-instances --db-instance-identifier mydbinstance 
```

```
DBINSTANCE  mydbinstance  2009-12-22T23:06:11.915Z  db.m5.large  mysql8.0  60  sa
available  mydbinstance.clla4j4jgyph.us-east-1.rds.amazonaws.com  3306
us-east-1b  3
	SECGROUP  default  active
	PARAMGRP  default.mysql8.0  in-sync
```

使用 `DescribeEvents` 操作，您可在存储空间用完后接收通知。例如，在这种情况下，如果在完成这些操作后执行 `DescribeEvents` 调用，您将看到以下输出。

```
aws rds describe-events --source-type db-instance --source-identifier mydbinstance 
```

```
2009-12-22T23:44:14.374Z  mydbinstance  Allocated storage has been exhausted db-instance
2009-12-23T00:14:02.737Z  mydbinstance  Applying modification to allocated storage db-instance
2009-12-23T00:31:54.764Z  mydbinstance  Finished applying modification to allocated storage
```

## Amazon RDS 可用数据库实例不足
<a name="CHAP_Troubleshooting.Capacity"></a>

在您尝试创建、启动或修改数据库实例时，可能返回 `InsufficientDBInstanceCapacity` 错误。在您尝试从数据库快照还原数据库实例时，也可能返回此错误。返回此错误时，常见原因是特定的数据库实例类在请求的可用区中不可用。您可以尝试以下方法之一来解决问题：
+ 使用不同的数据库实例类重试请求。
+ 使用不同的可用区返回请求。
+ 重试请求而不明确指定可用区。

有关排查 Amazon EC2 的实例容量问题的信息，请参阅**《Amazon EC2 用户指南》中的[实例容量不足](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/troubleshooting-launch.html#troubleshooting-launch-capacity)。

有关修改数据库实例的信息，请参阅[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)。

## Amazon RDS 中的可用内存问题
<a name="Troubleshooting.FreeableMemory"></a>

*可用内存* 是数据库实例上可供数据库引擎使用的总随机存取内存 (RAM)。这是可用操作系统 (OS) 内存以及可用缓冲区和页面缓存的总和。数据库引擎使用主机上的大部分内存，但操作系统进程也使用一些 RAM。当前分配给数据库引擎或操作系统进程使用的内存不包括在可用内存中。当数据库引擎内存不足时，数据库实例可以使用通常用于缓冲和缓存的临时空间。如前所述，这个临时空间包含在可用内存中。

您可以使用 Amazon CloudWatch 中的 `FreeableMemory` 指标来监控可用内存。有关更多信息，请参阅 [Amazon RDS 的监控工具](MonitoringOverview.md)。

如果数据库实例始终可用内存不足或使用交换空间，则考虑纵向扩展至更大的数据库实例类。有关更多信息，请参阅[数据库实例类](Concepts.DBInstanceClass.md)。

您还可以更改内存设置。例如，在 RDS for MySQL 上，您可以调整 `innodb_buffer_pool_size` 参数的大小。默认情况下，此参数设置为物理内存的 75%。有关更多 MySQL 故障排除提示，请参阅[如何排查 Amazon RDS for MySQL 数据库中的可用内存不足问题？](https://aws.amazon.com/premiumsupport/knowledge-center/low-freeable-memory-rds-mysql-mariadb/)

## MySQL 和 MariaDB 问题
<a name="CHAP_Troubleshooting.MySQL"></a>

可以使用 MySQL 和 MariaDB 数据库实例诊断和纠正问题。

**Topics**
+ [最大 MySQL 和 MariaDB 连接](#USER_ConnectToInstance.max_connections)
+ [诊断并解决内存限制的不兼容参数状态](#CHAP_Troubleshooting.incompatible-parameters-memory)
+ [诊断并解决只读副本之间的滞后](#CHAP_Troubleshooting.MySQL.ReplicaLag)
+ [诊断并解决 MySQL 或 MariaDB 读取复制故障](#CHAP_Troubleshooting.MySQL.RR)
+ [在启用二进制日志记录的情况下创建触发器需要 SUPER 权限](#CHAP_Troubleshooting.MySQL.CreatingTriggers)
+ [诊断并解决时间点还原故障](#CHAP_Troubleshooting.MySQL.PITR)
+ [复制已停止错误](#CHAP_Troubleshooting.MySQL.ReplicationStopped)
+ [只读副本创建失败或复制中断，出现严重错误 1236](#CHAP_Troubleshooting.MySQL.ReadReplicas)
+ [只读副本复制未能初始化元数据结构](#CHAP_Troubleshooting.MySQL.ReadReplicas.ReplicationErrorMetadata)

### 最大 MySQL 和 MariaDB 连接
<a name="USER_ConnectToInstance.max_connections"></a>

允许与 RDS for MySQL 或 RDS for MariaDB 数据库实例的最大连接数，基于可用于其数据库实例类的内存量。可用于数据库实例类的内存量越大，允许的连接数就越多。有关数据库实例类的更多信息，请参阅[数据库实例类](Concepts.DBInstanceClass.md)。

默认情况下，数据库实例的连接限制设置为数据库实例类的最大数量。您可以将并行连接的数量限制为不超过所允许的最大连接数的任何值。在参数组中为数据库实例使用 `max_connections` 参数。有关更多信息，请参阅“[最大数据库连接数](CHAP_Limits.md#RDS_Limits.MaxConnections)”和“[Amazon RDS 的参数组](USER_WorkingWithParamGroups.md)”。

您可以通过运行以下查询来检索 MySQL 或 MariaDB 数据库实例允许的最大连接数。

```
SELECT @@max_connections;
```

您可以通过运行以下查询来检索与 MySQL 或 MariaDB 数据库实例的活动连接数。

```
SHOW STATUS WHERE `variable_name` = 'Threads_connected';
```

### 诊断并解决内存限制的不兼容参数状态
<a name="CHAP_Troubleshooting.incompatible-parameters-memory"></a>

当满足以下条件时，可以将 MariaDB 或 MySQL 数据库实例置于 **incompatible-parameters** 状态以获得内存限制：
+ 当数据库实例状态为**可用**时，数据库实例在一小时内至少重新启动三次，或在一天内至少重新启动五次。
+ 尝试重新启动数据库实例失败，因为维护操作或监控过程无法重新启动数据库实例。
+ 数据库实例的潜在内存使用量超过分配给其数据库实例类的内存的 1.2 倍。

当数据库实例在一小时内第三次重新启动或一天内第五次重新启动时，它将执行内存使用情况检查。该检查将计算数据库实例的潜在内存使用情况。计算返回的值是以下值的总和：
+ **值 1** – 以下参数的总和：
  + `innodb_additional_mem_pool_size`
  + `innodb_buffer_pool_size`

    您可以修改 `innodb_buffer_pool_size` 的值。但是，该值并不总是与您输入的值相匹配。出现这种不匹配有以下几个原因。首先，如果数据库实例是微型数据库实例，我们会覆盖默认值并将其设置为 256 MB。有关更多信息，请参阅 [覆盖 innodb\$1buffer\$1pool\$1size](MySQL.KnownIssuesAndLimitations.md#MySQL.Concepts.KnownIssuesAndLimitations.innodb-bp-size)。

    其次，我们确保在数据库实例上为主机管理器、引擎、操作系统和内核预留 500 MB 的内存。

    最后，我们通过将 `innodb_buffer_pool_size` 划分为单位来对其进行优化。主机管理器向下舍入到最接近这些单位的倍数。单位是通过将 `innodb_buffer_pool_chunk_size` 乘以 `innodb_buffer_pool_instances` 计算得出的。有关更多信息，请参阅 MySQL 文档中的[配置 InnoDB 缓冲池大小](https://dev.mysql.com/doc/refman/8.0/en/innodb-buffer-pool-resize.html)。

    `innodb_buffer_pool_instances` 的默认值为 8，除非 `innodb_buffer_pool_size` 小于 1 GB。如果 `innodb_buffer_pool_size` 小于 1 GB，则 `innodb_buffer_pool_instances` 的默认值为 1。`innodb_buffer_pool_chunk_size` 的默认值为 128 MB。
  + `innodb_log_buffer_size`
  + `key_buffer_size`
  + `query_cache_size`（仅限 MySQL 版本 5.7）
  + `tmp_table_size`
+ **值 2** – `max_connections` 参数乘以下参数的总和：
  + `binlog_cache_size`
  + `join_buffer_size`
  + `read_buffer_size`
  + `read_rnd_buffer_size`
  + `sort_buffer_size`
  + `thread_stack`
+ **值 3** – 如果 `performance_schema` 参数已启用，则将 `max_connections` 参数乘以 `429498`。

  如果 `performance_schema` 参数被禁用，则此值为零。

因此，计算返回的值如下：

`Value 1 + Value 2 + Value 3`

当此值超过分配给数据库实例使用的数据库实例类的内存的 1.2 倍时，数据库实例将处于 **incompatible-parameters** 状态。有关分配给数据库实例类的内存的信息，请参阅 [数据库实例类的硬件规格](Concepts.DBInstanceClass.Summary.md)。

计算将参数的值乘以多个 `max_connections` 参数的总和。如果 `max_connections` 参数设置为较大的值，则可能会导致检查返回过高的数据库实例潜在内存使用量值。在这种情况下，请考虑降低 `max_connections` 参数的值。

要解决此问题，请完成以下步骤：

1. 调整与数据库实例关联的数据库参数组中的内存参数。为此，使潜在的内存使用量低于分配给其数据库实例类的内存的 1.2 倍。

   有关设置参数的信息，请参阅[在 Amazon RDS 中修改数据库参数组中的参数](USER_WorkingWithParamGroups.Modifying.md)。

1. 重新启动数据库实例。

   有关设置参数的信息，请参阅 [启动之前停止的 Amazon RDS 数据库实例](USER_StartInstance.md)。

### 诊断并解决只读副本之间的滞后
<a name="CHAP_Troubleshooting.MySQL.ReplicaLag"></a>

在创建一个 MySQL 或 MariaDB 只读副本且该只读副本可用后，Amazon RDS 首先将复制自只读副本创建操作启动以来对源数据库实例所做的更改。在此期间，只读副本的复制滞后时间将大于 0。您可以在 Amazon CloudWatch 中通过查看 Amazon RDS `ReplicaLag` 指标来监控此滞后时间。

`ReplicaLag` 指标报告 MariaDB 或 MySQL `Seconds_Behind_Master` 命令的 `SHOW REPLICA STATUS` 字段的值。有关更多信息，请参阅 MySQL 文档中的 [SHOW REPLICA STATUS 语句](https://dev.mysql.com/doc/refman/8.0/en/show-replica-status.html)。

当 `ReplicaLag` 指标达到 0 时，即表示副本已赶上源数据库实例进度。如果 `ReplicaLag` 指标返回 -1，则副本可能为未激活状态。要纠正复制错误，请参阅[诊断并解决 MySQL 或 MariaDB 读取复制故障](#CHAP_Troubleshooting.MySQL.RR)。`ReplicaLag` 值为 -1 还可能意味着 `Seconds_Behind_Master` 值无法确定或为 `NULL`。

**注意**  
以前的 MariaDB 版本使用的是 `SHOW SLAVE STATUS`，而不是 `SHOW REPLICA STATUS`。如果您使用的 MariaDB 版本低于 10.5，请使用 `SHOW SLAVE STATUS`。

`ReplicaLag` 指标将在网络中断期间或在维护时段内应用修补程序时返回 -1。在这种情况下，在再次检查 `ReplicaLag` 指标之前，需等待网络连接恢复或维护时段结束。

MySQL 和 MariaDB 只读复制技术是异步的。因此，预计源数据库实例上的 `BinLogDiskUsage` 指标和只读副本上的 `ReplicaLag` 指标偶尔会增加。例如，请考虑对源数据库实例并行进行大量写入操作的情况。同时，对只读副本的写入操作会使用单个 I/O 线程序列化。这种情况可能会导致源实例与只读副本之间的滞后。

有关只读副本和 MySQL 的更多信息，请参阅 MySQL 文档中的[复制实施详细信息](https://dev.mysql.com/doc/refman/8.0/en/replication-implementation-details.html)。有关只读副本和 MariaDB 的更多信息，请参阅 MariaDB 文档中的[复制概述](http://mariadb.com/kb/en/mariadb/replication-overview/)。

您可降低对源数据库实例的更新与对只读副本的后续更新之间的滞后，方式如下：
+ 将只读副本的数据库实例类的存储大小设置为与源数据库实例的类似。
+ 确保源数据库实例和只读副本使用的数据库参数组中的参数设置兼容。有关更多信息和示例，请参阅下一部分中有关 `max_allowed_packet` 参数的讨论。
+ 禁用查询缓存。对于经常修改的表，使用查询缓存可能会加大副本滞后，因为缓存已锁定且会频繁刷新。如果是这样的话，您可能会发现在禁用查询缓存的情况下副本滞后较少。您可通过在数据库实例的数据库参数组中将 `query_cache_type parameter` 设置为 0 来禁用查询缓存。有关查询缓存的更多信息，请参阅[查询缓存配置](https://dev.mysql.com/doc/refman/5.7/en/query-cache-configuration.html)。
+ 为 MySQL 或 MariaDB 的 InnoDB 预热只读副本上的缓冲池。例如，假设您有少量经常更新的表，并且您正在使用 InnoDB 或 XtraDB 表架构。在这种情况下，将这些表转储到只读副本上。这样做将促使数据库引擎从磁盘扫描这些表的行，然后将它们缓存到缓冲池中。此方法可以减少副本滞后。下面是一个示例。

  对于 Linux、macOS 或 Unix：

  ```
  PROMPT> mysqldump \
      -h <endpoint> \
      --port=<port> \
      -u=<username> \
      -p <password> \
      database_name table1 table2 > /dev/null
  ```

  对于：Windows

  ```
  PROMPT> mysqldump ^
      -h <endpoint> ^
      --port=<port> ^
      -u=<username> ^
      -p <password> ^
      database_name table1 table2 > /dev/null
  ```

### 诊断并解决 MySQL 或 MariaDB 读取复制故障
<a name="CHAP_Troubleshooting.MySQL.RR"></a>

Amazon RDS 会监控只读副本的复制状态。如果由于任何原因停止复制，则 RDS 将只读副本实例的 **Replication State**（复制状态）字段更新为 `Error`。您可通过查看**复制错误**字段，检查 MySQL 或 MariaDB 引擎引发的关联错误的详细信息。还生成指示只读副本状态的事件，包括 [RDS-EVENT-0045](USER_Events.Messages.md#RDS-EVENT-0045)、[RDS-EVENT-0046](USER_Events.Messages.md#RDS-EVENT-0046) 和 [RDS-EVENT-0057](USER_Events.Messages.md#RDS-EVENT-0057)。有关这些事件和事件订阅的详细信息，请参阅 [使用 Amazon RDS 事件通知](USER_Events.md)。如果返回 MySQL 错误消息，则在 [MySQL 错误消息文档](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html)中查看错误。如果返回 MariaDB 错误消息，则在 [MariaDB 错误消息文档](http://mariadb.com/kb/en/mariadb/mariadb-error-codes/)中查看错误。

可导致复制出错的常见情况包括：
+ 只读副本的 `max_allowed_packet` 参数的值小于源数据库实例的 `max_allowed_packet` 参数。

  `max_allowed_packet` 参数是您可以在数据库参数组中设置的自定义参数。`max_allowed_packet` 参数用于指定可在数据库上运行的数据操作语言 (DML) 的最大大小。在某些情况下，源数据库实例的 `max_allowed_packet` 值可能大于只读副本的 `max_allowed_packet` 值。如果是这样，复制过程可能会引发错误并停止复制。最常见的错误是 `packet bigger than 'max_allowed_packet' bytes`。通过将源和只读副本设置为使用具有相同 `max_allowed_packet` 参数值的数据库参数组，即可更正此错误。
+ 对只读副本上的表进行写入操作。如果是在只读副本上创建索引，则需要将 `read_only` 参数设置为 *0* 才能创建索引。如果对只读副本上的表进行写入操作，则会中断复制。
+ 使用 MyISAM 等非事务性存储引擎。只读副本需要使用事务性存储引擎。只有以下存储引擎支持复制：适用于 MySQL 或 MariaDB 的 InnoDB。

  您可以使用以下命令将 MyISAM 表转换为 InnoDB：

  `alter table <schema>.<table_name> engine=innodb;`
+ 使用不安全的不确定性查询，如 `SYSDATE()`。有关更多信息，请参阅 MySQL 文档中的[确定二进制日志记录中的安全和不安全语句](https://dev.mysql.com/doc/refman/8.0/en/replication-rbr-safe-unsafe.html)。

下列步骤可帮助您纠正复制错误：
+ 如果您遇到逻辑错误并且您可安全跳过该错误，则可执行[跳过 RDS for MySQL 的当前复制错误](Appendix.MySQL.CommonDBATasks.SkipError.md)中所述的步骤。您的 MySQL 或 MariaDB 数据库实例必须运行包括 `mysql_rds_skip_repl_error` 过程的版本。有关更多信息，请参阅 [mysql.rds\$1skip\$1repl\$1error](mysql-stored-proc-replicating.md#mysql_rds_skip_repl_error)。
+ 如果您遇到二进制日志（binlog）位置问题，则可使用 [mysql.rds\$1next\$1source\$1log（RDS for MySQL 主要版本 8.4 及更高版本）](mysql-stored-proc-replicating.md#mysql_rds_next_source_log) 或 [mysql.rds\$1next\$1master\$1log（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）](mysql-stored-proc-replicating.md#mysql_rds_next_master_log) 命令更改副本重放位置。
+ 由于 DML 负载高，您可能会遇到暂时的性能问题。如果是这样，您可以在只读副本上的数据库参数组中将 `innodb_flush_log_at_trx_commit` 参数设置为 2。这样做有助于只读副本保持同步，但这会临时降低原子性、一致性、隔离和持久性（ACID）属性。
+ 您可以删除只读副本，使用相同的数据库实例标识符创建实例。如果您这样做，则端点将保持与旧只读副本的端点相同。

如果复制错误得到纠正，则**复制状态**将更改为**正在复制**。有关更多信息，请参阅“[排查 MySQL 只读副本问题](USER_ReadRepl.Troubleshooting.md)”。

### 在启用二进制日志记录的情况下创建触发器需要 SUPER 权限
<a name="CHAP_Troubleshooting.MySQL.CreatingTriggers"></a>

当尝试在 RDS for MySQL 或 RDS for MariaDB 数据库实例中创建触发器时，您可能会收到以下错误。

```
"You do not have the SUPER privilege and binary logging is enabled" 
```

在启用了二进制日志记录时使用触发器需要 SUPER 权限（对于 RDS for MySQL 和 RDS for MariaDB 数据库实例会限制该权限）。您可以通过将 `log_bin_trust_function_creators` 参数设置为 true，在启用了二进制日志记录时创建触发器而无需 SUPER 权限。要将 `log_bin_trust_function_creators` 设置为 true，请创建新的数据库参数组或修改现有数据库参数组。

您可以创建一个新的数据库参数组，这样，您就可以在启用了二进制日志记录的情况下，在 RDS for MySQL 或 RDS for MariaDB 数据库实例中创建触发器。为此，请使用以下 CLI 命令。要修改现有参数组，请从步骤 2 开始。

**使用 CLI 创建新参数组以允许在启用了二进制日志记录时使用触发器**

1. 创建新的参数组。

   对于 Linux、macOS 或 Unix：

   ```
   aws rds create-db-parameter-group \
       --db-parameter-group-name allow-triggers \
       --db-parameter-group-family mysql8.0 \
       --description "parameter group allowing triggers"
   ```

   对于：Windows

   ```
   aws rds create-db-parameter-group ^
       --db-parameter-group-name allow-triggers ^
       --db-parameter-group-family mysql8.0 ^
       --description "parameter group allowing triggers"
   ```

1. 修改数据库参数组以允许使用触发器。

   对于 Linux、macOS 或 Unix：

   ```
   aws rds modify-db-parameter-group \
       --db-parameter-group-name allow-triggers \
       --parameters "ParameterName=log_bin_trust_function_creators, ParameterValue=true, ApplyMethod=pending-reboot"
   ```

   对于：Windows

   ```
   aws rds modify-db-parameter-group ^
       --db-parameter-group-name allow-triggers ^
       --parameters "ParameterName=log_bin_trust_function_creators, ParameterValue=true, ApplyMethod=pending-reboot"
   ```

1. 修改数据库实例以使用新的数据库参数组。

   对于 Linux、macOS 或 Unix：

   ```
   aws rds modify-db-instance \
       --db-instance-identifier mydbinstance \
       --db-parameter-group-name allow-triggers \
       --apply-immediately
   ```

   对于：Windows

   ```
   aws rds modify-db-instance ^
       --db-instance-identifier mydbinstance ^
       --db-parameter-group-name allow-triggers ^
       --apply-immediately
   ```

1. 要使更改生效，请手动重启数据库实例。

   ```
   aws rds reboot-db-instance --db-instance-identifier mydbinstance
   ```

### 诊断并解决时间点还原故障
<a name="CHAP_Troubleshooting.MySQL.PITR"></a>

**还原包含临时表的数据库实例**

在尝试对 MySQL 或 MariaDB 数据库实例进行时间点还原 (PITR) 时，您可能遇到以下错误。

```
Database instance could not be restored because there has been incompatible database activity for restore
functionality. Common examples of incompatible activity include using temporary tables, in-memory tables,
or using MyISAM tables. In this case, use of Temporary table was detected.
```

PITR 依靠 MySQL 或 MariaDB 中的备份快照和二进制日志 (binlog) 将数据库实例还原为特定时间的状态。二进制日志中的临时表信息不可靠，并且可能导致 PITR 失败。如果在 MySQL 或 MariaDB 数据库实例中使用临时表，则可通过执行更频繁的备份来降低 PITR 失败的可能性。在创建临时表和下一次备份快照之间的时间点最可能发生 PITR 失败。

**还原包含内存表的数据库实例**

在还原具有内存表的数据库时，您可能会遇到问题。重新启动过程中将清空内存表。因此，您的内存表在重新启动后可能为空。我们建议在使用内存表时，构建解决方案以便在重新启动时处理空表。如果您将内存中表与复制的数据库实例一起使用，则可能需要在重新启动后重新创建只读副本。如果只读副本重新启动并且无法从空内存表中还原数据，则可能需要执行此操作。

有关备份和 PITR 的更多信息，请参阅[备份简介](USER_WorkingWithAutomatedBackups.md)和[将 Amazon RDS 的数据库实例还原到指定时间](USER_PIT.md)。

### 复制已停止错误
<a name="CHAP_Troubleshooting.MySQL.ReplicationStopped"></a>

调用 `mysql.rds_skip_repl_error` 命令时，您可能会收到一条错误消息，指出副本已关闭或禁用。

出现该错误消息是由于复制已停止且无法重新启动。

如果您需要跳过大量错误，复制滞后时间可能会超出二进制日志文件的默认保留期。在这种情况下，您可能会遇到一个因二进制日志文件在副本上进行重放之前被清除而引发的严重错误。此清除会导致复制停止，而您将无法再调用 `mysql.rds_skip_repl_error` 命令以跳过复制错误。

您可以通过增加二进制日志文件在复制源上保留的小时数来缓解该问题。在增加二进制日志保留时间后，您可以重新启动复制进程，并根据需要调用 `mysql.rds_skip_repl_error` 命令。

若要设置 binlog 保留时间，请使用 [mysql.rds\$1set\$1configuration](mysql-stored-proc-configuring.md#mysql_rds_set_configuration) 过程。指定二进制日志保留小时数的配置参数以及要在数据库集群上保留二进制日志文件的小时数（最多 720 个小时，即 30 天）。以下示例将 binlog 文件的保留期设置为 48 个小时。

```
CALL mysql.rds_set_configuration('binlog retention hours', 48);
```

### 只读副本创建失败或复制中断，出现严重错误 1236
<a name="CHAP_Troubleshooting.MySQL.ReadReplicas"></a>

在更改 MySQL 或 MariaDB 数据库实例的默认参数值后，您可能会遇到下列问题之一：
+ 您无法为数据库实例创建只读副本。
+ 复制失败，出现 `fatal error 1236`。

MySQL 和 MariaDB 数据库实例的一些默认参数值有助于确保数据库符合 ACID，并且只读副本是崩溃安全的。它们在提交之前将事务写入二进制日志来确保每个提交完全同步，从而实现这一点。在尚未将事务写入二进制日志的情况下，如果更改这些参数的默认值来提高性能，则可能会导致复制失败。

要解决该问题，请设置以下参数值：
+ `sync_binlog = 1`
+ `innodb_support_xa = 1`
+ `innodb_flush_log_at_trx_commit = 1`

### 只读副本复制未能初始化元数据结构
<a name="CHAP_Troubleshooting.MySQL.ReadReplicas.ReplicationErrorMetadata"></a>

在您尝试启动复制时，收到了以下错误消息：

```
Read Replica Replication Error - SQLError: 13124, reason: Replica failed to initialize applier metadata structure from the repository
```

当副本的元数据结构有问题时，就会出现此错误。要修复元数据结构，您必须创建新副本。

为了防止以后出现此问题，请执行以下操作之一：
+ 如果可能，请在副本上禁用多线程。从 MySQL 8.0.27 开始，默认情况下启用了多线程。
+ 如果您需要在副本上使用多线程，建议您使用基于 GTID 的复制。有关更多信息，请参阅 [使用基于 GTID 的复制](mysql-replication-gtid.md)。

## 无法将备份保留期设置为 0
<a name="CHAP_Troubleshooting.Backup.Retention"></a>

您可能出于多个原因需要将备份保留期设置为 0。例如，您可以通过将保留期设置为 0 来立即禁用自动备份。

在某些情况下，您可能会将值设置为 0 并收到一条消息，说明保留期必须介于 1 到 35 之间。在这些情况下，请检查以确保您没有为实例设置只读副本。只读副本需要备份来管理只读副本日志，因此不能将保留期设置为 0。