Amazon Aurora
Aurora 用户指南 (API 版本 2014-10-31)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

故障排除

利用以下部分帮助排查您使用 Amazon RDS 时遇到的问题。

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

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

  • 由本地防火墙强制执行的访问规则与您在数据库实例的安全组中授权用于访问该实例的入口 IP 地址不同步。该问题很可能是由安全组中的入口规则所致。默认情况下,数据库实例不允许访问;访问权限是通过安全组授予的。若要授予访问权限,您必须使用针对您的情况的入口和出口规则创建自己的安全组。如有必要,请将规则添加到与 VPC 关联的安全组中,以允许与源相关的流量流入和流出数据库实例。您可以指定一个 IP 地址、IP 地址范围或另一个 VPC 安全组。

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

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

  • 数据库实例仍在创建中,尚不可用。根据数据库实例的大小,可能要用最长 20 分钟,实例才可用。

测试与 Amazon RDS 数据库实例的连接

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

可以从 Linux 或 Unix 终端测试此连接,方式为键入以下命令 (将 <DB-instance-endpoint> 替换为终端节点并将 <port> 替换为数据库实例的端口):

$nc -zv <DB-instance-endpoint> <port>

例如,下面显示了示例命令和返回值:

$nc -zv postgresql1.c6c8mn7tsdgv0.us-west-2.rds.amazonaws.com 8299 Connection to postgresql1.c6c8mn7tsdgv0.us-west-2.rds.amazonaws.com 8299 port [tcp/vvr-data] succeeded!

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

C:\>telnet sg-postgresql1.c6c8mntzhgv0.us-west-2.rds.amazonaws.com 819 Connecting To sg-postgresql1.c6c8mntzhgv0.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 账户来创建 IAM 用户并将这些用户分配给数据库用户账户。您还可使用您的主账户创建其他用户账户 (如有必要)。

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

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

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

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

您可以通过重置主密码来重置已为数据库实例分配的权限。例如,如果您将自己锁在 SQL Server 数据库上的 db_owner 角色之外,则可以通过修改数据库实例主密码来重置 db_owner 角色密码。通过更改数据库实例密码,您可以重新获取对数据库实例的访问权限、使用 db_owner 的已修改密码访问数据库以及为 db_owner 角色还原可能意外撤消的权限。您可以使用 Amazon RDS 控制台、AWS CLI 命令 modify-db-instance 或者使用 ModifyDBInstance 操作更改数据库实例密码。

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) 和数据库重新启动。该实例级参数使用一串以逗号分隔的操作,在内存不足时,数据库实例将执行这些操作。有效的操作包括“print”、“tune”、“decline”、“kill_query”或这些操作的任意组合。空字符串表示不应执行任何操作,实际上是将该功能禁用。

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

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

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

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

  • “kill_query”– 按内存消耗量降序终止查询,直到实例内存高于下限阈值。不会终止 DDL 语句。

  • “print, tune”– 执行为“print”和“tune”描述的操作。

  • “tune, decline, kill_query”– 执行为“tune”、“decline”和“kill_query”描述的操作。

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

Amazon Aurora MySQL 复制问题

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

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

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

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

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

由于 MySQL 和 MariaDB 读取复制技术为异步式,因此预计源数据库实例上的 BinLogDiskUsage 指标和只读副本上的 AuroraBinlogReplicaLag 指标偶尔会增加。例如,可并行向源数据库实例执行大量写入操作,同时使用一个 IO 线程将向只读副本执行的写入操作序列化,这会导致源实例与只读副本之间产生滞后。有关只读副本和 MySQL 的更多信息,请转至 MySQL 文档中的复制实施详细信息。有关只读副本和 MariaDB 的更多信息,请转到 MariaDB 文档中的复制概述

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

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

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

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

  • 为适用于 MySQL 的 InnoDB、适用于 MariaDB 10.2 或更高版本的 InnoDB 或者适用于 MariaDB 10.1 或更低版本的 XtraDB 预热只读副本上的缓冲池。如果您有少量要经常更新的表,并且您使用的是 InnoDB 或 XtraDB 表架构,则在只读副本上转储这些表。这样做将促使数据库引擎从磁盘扫描这些表的行,然后将它们缓存到缓冲池中,从而减少副本滞后。下面是一个示例。

    针对 Linux、OS X 或 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 读取复制失败

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

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

  • 只读副本的 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()。有关详细信息,请参阅 Determination of Safe and Unsafe Statements in Binary Logging(确定二进制日志记录中的安全和不安全语句)。

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

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

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

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

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

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

从属实例关闭或禁用错误

调用 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 发出的以下错误消息:

ERROR 3 (HY000): Error writing file '/rdsdbdata/tmp/XXXXXXXX' (Errcode: 28 - No space left on device)

Amazon Aurora 数据库集群中的每个数据库实例都使用本地 SSD 存储为会话存储临时表。临时表的此本地存储不会像 Aurora 集群卷一样自动增长。相反,本地存储量是有限的。该限制取决于数据库集群中的数据库实例的数据库实例类。要了解内存优化实例类型的本地 SSD 存储量,请转到 Amazon EC2 实例类型

如果无法修改工作负载以减少所需的临时存储容量,则您可以扩展数据库实例以使用具有更多本地 SSD 存储的数据库实例类。