Amazon Aurora 故障排除 - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Amazon Aurora 故障排除

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

有关使用 Amazon RDS API 调试问题的信息,请参阅 对 Aurora 上的应用程序进行故障排除

无法连接到 Amazon RDS 数据库实例

当您无法连接到数据库实例时,常见原因如下:

  • 入站规则 – 由本地防火墙强制执行的访问规则与您授权用于访问数据库实例的 IP 地址可能不匹配。该问题很可能是由安全组中的入站规则所致。

    默认情况下,数据库实例不允许访问。通过与 VPC 关联的安全组授予访问权限,该安全组允许流量进出数据库实例。如有必要,请将针对您具体情况的入站和出站规则添加到安全组。您可以指定一个 IP 地址、IP 地址范围或另一个 VPC 安全组。

    注意

    添加新入站规则时,您可以为选择我的 IP,以允许从浏览器中检测到的 IP 地址访问数据库实例。

    有关设置安全组的更多信息,请参阅通过创建安全组提供对 VPC 中数据库集群的访问

    注意

    不允许来自 169.254.0.0/16 范围内的 IP 地址的客户端连接。这是自动私有 IP 寻址范围 (APIPA),它用于本地链路寻址。

  • 公开可用性 – 要从 VPC 外部连接到您的数据库实例(例如通过使用客户端应用程序),实例必须具有向其分配的公有 IP 地址。

    要使实例公开可用,请修改它,在公开可用性下选择。有关更多信息,请参阅对互联网隐藏 VPC 中的数据库集群

  • 端口 – 由于您的本地防火墙限制,无法使用您在创建数据库实例时指定的端口来发送和接收通信。如需确定您的网络是否允许指定端口用于入站和出站通信,请向您的网络管理员咨询。

  • 可用性 – 对于新创建的数据库实例,数据库实例具有 creating 状态,直到该数据库实例可供使用。当状态变为 available 时,您可以连接到该数据库实例。根据数据库实例的大小,可能要用最长 20 分钟,实例才可用。

  • 互联网网关 – 对于希望可公开访问的数据库实例,其数据库子网组中的子网必须具有互联网网关。

    为子网配置互联网网关
    1. 登录Amazon Web Services Management Console并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

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

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

    4. 通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/

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

    6. 在导航窗格中,选择 Subnets,然后选择您的子网。

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

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

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

      2. Routes (路由) 选项卡上,选择 Edit routes (编辑路由)。选择 Add route (添加路由),将 0.0.0.0/0 用作目的地并将 Internet 网关用作目标。

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

      3. 选择 Save routes(保存路由)。

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

    有关更多信息,请参阅在 VPC 中使用数据库集群

测试与数据库实例的连接

您可以使用常见 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。

对连接身份验证进行故障排除

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

Amazon RDS 安全性问题

若要避免安全性问题,切勿使用用户账户的主 Amazon 用户名和密码。最佳做法是使用您的主 Amazon Web Services 账户来创建用户并将这些用户分配给数据库用户账户。您还可使用您的主账户创建其他用户账户 (如有必要)。

有关创建用户的信息,请参阅在 Amazon Web Services 账户 中创建 IAM 用户。有关在 Amazon IAM Identity Center 中创建用户的信息,请参阅管理 IAM Identity Center 中的身份

错误消息“无法检索账户属性,某些控制台功能可能受损。”

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

重置数据库实例拥有者密码

如果您被锁定在数据库集群之外,则可以以主用户身份登录。然后,您可以重置其他管理用户或角色的凭证。如果您无法以主用户身份登录,Amazon 账户所有者可以重置主用户密码。有关可能需要重置哪些管理账户或角色的详细信息,请参阅主用户账户权限

您可以使用 Amazon RDS 控制台、Amazon CLI 命令 modify-db-instance,或者使用 ModifyDBInstance API 操作更改数据库实例密码。有关修改数据库集群中的数据库实例的更多信息,请参阅 修改数据库集群中的数据库实例

Amazon RDS 数据库实例中断或重新引导

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

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

在出现下列情况之一时,会立即发生数据库实例重启:

  • 您将数据库实例的备份保留期从 0 更改为非零值或从非零值更改为 0。然后,将 Apply Immediately(立即应用)设置为 true

  • 更改数据库实例类,并将立即应用设置为 true

在维护时段内,如果出现下列情况之一,则会发生数据库实例重启:

  • 将数据库实例的备份保留期从 0 更改为非零值或从非零值更改为 0 并将立即应用设置为 false

  • 更改数据库实例类,并将立即应用设置为 false

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

Amazon RDS 数据库参数更改未生效

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

您可以使用 RDS 控制台重启数据库实例。或者,您可以显式调用 RebootDBInstance API 操作。如果数据库实例处于多可用区部署中,则可以在不进行故障转移的情况下重启。在静态参数更改后重新引导关联的数据库实例的要求,可帮助缓解影响 API 调用的参数误配置的风险。调用 ModifyDBInstance 以更改数据库实例类就是这样的一个例子。有关更多信息,请参阅修改数据库参数组中的参数

Amazon Aurora 中的可用内存问题

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

您可以使用 Amazon CloudWatch 中的 FreeableMemory 指标来监控可用内存。有关更多信息,请参阅监控 Amazon Aurora 中指标的概览

如果数据库实例始终可用内存不足或使用交换空间,则考虑纵向扩展至更大的数据库实例类。有关更多信息,请参阅Aurora 数据库实例类

您还可以更改内存设置。例如,在 Aurora MySQL 上,您可以调整 innodb_buffer_pool_size 参数的大小。默认情况下,此参数设置为物理内存的 75%。有关更多 MySQL 故障排除提示,请参阅如何对 Amazon RDS for MySQL 数据库中的可用内存不足问题进行故障排除?

对于 Aurora Serverless v2,FreeableMemory 表示当 Aurora Serverless v2 数据库实例已扩展到其最大容量时,可用的未使用内存量。您可能已将实例缩减到相对较低的容量,但它仍然报告较高的 FreeableMemory 值,因为实例可以纵向扩展。该内存目前不可用,但如果您需要,您可以获取它。

对于当前容量低于最大容量的每个 Aurora 容量单位 (ACU),FreeableMemory 增加大约 2 GiB。因此,在数据库实例扩展到它可以达到的最大值之前,此指标不会接近零。

如果此指标接近值 0,则数据库实例已纵向扩展到它能达到的最大容量。它已接近其可用内存的极限。考虑增大集群的最大 ACU 设置。如果读取器数据库实例上的这个指标接近值 0,请考虑向集群添加额外的读取器数据库实例。这样,工作负载的只读部分可以分散到更多数据库实例上,从而减少每个读取器数据库实例的内存使用。有关更多信息,请参阅适用于 Aurora Serverless v2 的重要 Amazon CloudWatch 指标

对于 Aurora Serverless v1,您可以更改容量范围以使用更多 ACU。有关更多信息,请参阅修改 Aurora Serverless v1 数据库集群

Amazon Aurora MySQL 复制问题

一些 MySQL 复制问题也适用于 Aurora MySQL。您可以诊断并纠正这些问题。

诊断并解决只读副本之间的滞后

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

AuroraBinlogReplicaLag 指标报告 MySQL Seconds_Behind_Master 命令的 SHOW REPLICA STATUS 字段的值。有关更多信息,请参阅 MySQL 文档中的 SHOW REPLICA STATUS 语句

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

注意

以前的 Aurora MySQL 版本使用的是 SHOW SLAVE STATUS,而不是 SHOW REPLICA STATUS。如果您使用 Aurora MySQL 版本 1 或 2,那么请使用 SHOW SLAVE STATUS。将 SHOW REPLICA STATUS 用于 Aurora MySQL 版本 3 及更高版本。

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

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

有关只读副本和 MySQL 的更多信息,请参阅 MySQL 文档中的复制实施详细信息

您可降低对源数据库实例的更新与对只读副本的后续更新之间的滞后,方式如下:

  • 将只读副本的数据库实例类的存储大小设置为与源数据库实例的类似。

  • 确保源数据库实例和只读副本使用的数据库参数组中的参数设置兼容。有关更多信息和示例,请参阅下一部分中有关 max_allowed_packet 参数的讨论。

  • 禁用查询缓存。对于经常修改的表,使用查询缓存可能会加大副本滞后,因为缓存已锁定且会频繁刷新。如果是这样的话,您可能会发现在禁用查询缓存的情况下副本滞后较少。您可通过在数据库实例的数据库参数组中将 query_cache_type parameter 设置为 0 来禁用查询缓存。有关查询缓存的更多信息,请参阅查询缓存配置

  • 为 MySQL 的 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 读取复制故障

Amazon RDS 会监控只读副本的复制状态。如果由于任何原因停止复制,则 RDS 将只读副本实例的 Replication State(复制状态)字段更新为 Error。您可通过查看复制错误字段,检查 MySQL 引擎引发的关联错误的详细信息。还生成指示只读副本状态的事件,包括 RDS-EVENT-0045RDS-EVENT-0046RDS-EVENT-0057。有关这些事件和事件订阅的详细信息,请参阅 使用 Amazon RDS 事件通知。如果返回 MySQL 错误消息,则在 MySQL 错误消息文档中查看错误。

可导致复制出错的常见情况包括:

  • 只读副本的 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 文档中的确定二进制日志记录中的安全和不安全语句

下列步骤可帮助您纠正复制错误:

  • 如果您遇到逻辑错误并且可安全跳过该错误,则可执行跳过当前的复制错误中所述的步骤。您的 Aurora MySQL 数据库实例必须运行包括 mysql_rds_skip_repl_error 过程的版本。有关更多信息,请参阅 mysql_rds_skip_repl_error

  • 如果您遇到二进制日志(binlog)位置问题,则可使用更改副本重放位置。您可以使用 Aurora MySQL 版本 1 和 2 的 mysql.rds_next_master_log 命令来执行此操作。您可以使用 Aurora MySQL 版本 3 及更高版本的 mysql.rds_next_source_log 命令来执行此操作。您的 Aurora MySQL 数据库实例必须运行支持此命令的版本以更改副本重放位置。有关版本信息,请参阅 mysql_rds_next_master_log

  • 如果您遇到因高 DML 负载导致的临时性能问题,则可在只读副本的数据库参数组中将 innodb_flush_log_at_trx_commit 参数设置为 2。这样做有助于只读副本保持同步,但这会临时降低原子性、一致性、隔离和持久性 (ACID) 属性。

  • 您可以删除只读副本,使用相同的数据库实例标识符创建实例。这样,端点将保持与旧只读副本的端点相同。

如果复制错误得到纠正,则复制状态将更改为正在复制。有关更多信息,请参阅解决 MySQL 只读副本问题

复制已停止错误

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

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

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

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

若要设置二进制日志保留时间,请使用 mysql_rds_set_configuration 过程。指定“二进制日志保留小时数”的配置参数以及要在数据库集群上保留二进制日志文件的小时数(最多 2160 个小时,即 90 天)。Aurora MySQL 的默认值为 24(1 天)。以下示例将 binlog 文件的保留期设置为 48 个小时。

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