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

Aurora 故障排除

利用以下部分帮助排查您使用 Amazon RDS 和 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 地址。

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

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

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

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

    为子网配置互联网网关

    1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台:https://console.amazonaws.cn/rds/

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

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

    4. 打开 Amazon VPC 控制台 https://console.amazonaws.cn/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 (保存路由)

    有关更多信息,请参阅 在 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 安全性问题

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

有关创建 IAM 用户的更多信息,请参阅创建 IAM 用户

错误消息“Failed to retrieve account attributes, certain console functions may be impaired.”

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

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

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

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

Amazon RDS 数据库实例中断或重启

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

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

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

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

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

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

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

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

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

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

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

您可以使用 RDS 控制台或明确调用 RebootDBInstance API 操作以重新引导数据库实例(在数据库实例位于Multi-AZ deployment时,没有故障转移)。在静态参数更改后重新引导关联的数据库实例的要求,可帮助缓解影响 API 调用的参数误配置的风险。调用 ModifyDBInstance 以更改数据库实例类就是这样的一个例子。有关更多信息,请参阅修改数据库参数组中的参数

Amazon Aurora MySQL 内存不足问题

Aurora MySQL aurora_oom_response 实例级参数可以使数据库实例能够监控系统内存,并估计各种语句和连接消耗的内存。如果系统内存不足,它可能会执行一系列操作以释放该内存,以尝试避免内存不足 (OOM) 和数据库重新启动。该实例级参数使用一串以逗号分隔的操作,在内存不足时,数据库实例将执行这些操作。有效的操作包括 printtunedeclinekill_query,或这些操作的任意组合。空字符串表示不应执行任何操作,实际上是将该功能禁用。

以下是 aurora_oom_response 参数的用法示例:

  • print – 仅输出占用大量内存的查询。

  • tune – 调整内部表缓存以将一些内存释放回系统。

  • decline – 在实例内存不足后,拒绝新的查询。

  • kill_query – 按内存消耗量降序结束查询,直到实例内存高于下限阈值。不会结束数据定义语言 (DDL) 语句。

  • print, tune – 为 printtune 执行所述操作。

  • tune, decline, kill_query – 为 tunedeclinekill_query 执行所述操作。

对于 db.t2.small 数据库实例类,aurora_oom_response 参数默认设置为 print, tune。对于所有其他数据库实例类,该参数值默认为空(已禁用)。

Amazon Aurora MySQL 复制问题

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

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

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

AuroraBinlogReplicaLag 指标报告 MySQL SHOW SLAVE STATUS 命令的 Seconds_Behind_Master 字段的值。有关更多信息,请参阅 SHOW SLAVE STATUS。当 AuroraBinlogReplicaLag 指标达到 0 时,即表示副本已赶上源数据库实例进度。如果 AuroraBinlogReplicaLag 指标返回 -1,则副本可能处于未激活状态。要纠正复制错误,请参阅诊断并解决 MySQL 读取复制失败AuroraBinlogReplicaLag 值为 -1 还可能意味着 Seconds_Behind_Master 值无法确定或为 NULL

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

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

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

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

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

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

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

  • 为适用于 MySQL 的 InnoDB的 XtraDB 预热只读副本上的缓冲池。例如,假设您有少量经常更新的表,并且您正在使用 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 监控只读副本的复制状态,如果由于任何原因停止复制,则将只读副本实例的复制状态字段更新为 Error。您可通过查看复制错误字段,检查 MySQL 引擎引发的关联错误的详细信息。还生成指示只读副本状态的事件,包括 RDS-EVENT-0045RDS-EVENT-0046RDS-EVENT-0047。有关这些事件和事件订阅的详细信息,请参阅 使用 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 的 InnoDB、适用于 MariaDB 10.2 或更高版本的 InnoDB 或者适用于 MariaDB 10.1 或更低版本的 XtraDB。

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

    alter table <schema>.<table_name> engine=innodb;

  • 使用不安全的不确定性查询,如 SYSDATE()。有关更多信息,请参阅 MySQL 文档中的确定二进制日志记录中的安全和不安全语句

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

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

  • 如果您遇到二进制日志 (binlog) 位置问题,则可使用 mysql_rds_next_master_log 命令更改副本重放位置。您的 Aurora MySQL 数据库实例必须运行支持 mysql_rds_next_master_log 命令的版本以更改副本重放位置。有关版本信息,请参阅 mysql_rds_next_master_log

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

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

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

复制停止错误

调用 mysql.rds_skip_repl_error 命令时,您可能会收到以下错误消息:Slave is down or disabled.

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

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

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

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

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

设备上无剩余空间错误

您可能会遇到以下错误消息之一。

  • 来自 Amazon Aurora MySQL:

    ERROR 3 (HY000): Error writing file '/rdsdbdata/tmp/XXXXXXXX' (Errcode: 28 - No space left on device)
  • 来自 Amazon Aurora PostgreSQL:

    ERROR: could not write block XXXXXXXX of temporary file: No space left on device.

Amazon Aurora 数据库集群中的每个数据库实例都使用本地固态驱动器 (SSD) 存储为会话存储临时表。临时表的此本地存储不会像 Aurora 集群卷一样自动增长。相反,本地存储量是有限的。该限制取决于数据库集群中的数据库实例的数据库实例类。

要显示可用于临时表和日志的存储量,您可以使用 CloudWatch 指标 FreeLocalStorage。该指标针对每个实例的临时卷,而不是集群卷。有关可用指标的更多信息,请参阅 监控 Amazon Aurora 数据库集群指标

在某些情况下,您无法修改工作负载以减少所需的临时存储量。如果是这样,请修改数据库实例,使用具有更多本地 SSD 存储的数据库实例类。有关更多信息,请参阅 数据库实例类

有关更多故障排查信息,请参阅 Aurora for MySQL 本地存储中存储了什么内容以及如何对本地存储问题进行故障排查?或者 Amazon Aurora for PostgreSQL 本地存储中存储了什么内容以及如何对本地存储问题进行故障排查?