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

Amazon RDS 故障排除

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

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

无法连接到 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 网关是否为目标。

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

      2. Routes (路由) 选项卡上,选择 Edit routes (编辑路由)。选择 Add route (添加路由),将 0.0.0.0/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 数据库实例

Amazon RDS 安全性问题

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 将存储类型从磁性(标准)更改为通用型 (SSD)预置 IOPS (SSD),或从预置 IOPS (SSD)通用型 (SSD) 更改为磁性(标准)

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

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

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

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

要查看显示数据库实例操作的表以及设置立即应用值的效果,请参阅修改 Amazon RDS 数据库实例

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

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

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

Amazon RDS 数据库实例用完存储空间

如果数据库实例用完存储空间,则该实例可能不再可用。我们强烈建议您持续监控 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 状态,这表示正在扩展存储。

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 数据库实例容量不足

在您尝试创建或修改数据库实例时,或者尝试从数据库快照还原数据库实例时,返回了 InsufficientDBInstanceCapacity 错误。返回此错误时,常见原因如下:

  • 指定的数据库实例类在请求的可用区中不可用。您可以尝试以下方法之一来解决问题:

    • 使用不同的数据库实例类重试请求。

    • 使用不同的可用区返回请求。

    • 重试请求而不明确指定可用区。

    有关排查 Amazon EC2 的实例容量问题的信息,请参阅 Amazon Elastic Compute Cloud 用户指南 中的实例容量不足

  • 数据库实例位于 EC2-Classic 平台上,因此不在 VPC 中。有些数据库实例类需要 VPC。例如,如果您在 EC2-Classic 平台上,并尝试通过切换到需要 VPC 的数据库实例类来增加容量,则会导致该错误。有关仅在 VPC 中可用的 Amazon EC2 实例类型的信息,请参阅 Amazon Elastic Compute Cloud 用户指南 中的在 EC2-Classic 中可用的实例类型。要更正该问题,您可以将数据库实例移到 VPC。有关更多信息,请参阅将不在 VPC 中的数据库实例移动到 VPC 中

有关修改数据库实例的信息,请参阅修改 Amazon RDS 数据库实例

MySQL 和 MariaDB 问题

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

最大 MySQL 和 MariaDB 连接

允许与 RDS for MySQLRDS for MariaDB 数据库实例的最大连接数,基于可用于其数据库实例类的内存量。可用于数据库实例类的内存量越大,允许的连接数就越多。有关数据库实例类的更多信息,请参阅数据库实例类

默认情况下,数据库实例的连接限制设置为数据库实例类的最大数量。您可以将并行连接的数量限制为不超过所允许的最大连接数的任何值。在参数组中为数据库实例使用 max_connections 参数。有关更多信息,请参阅 最大数据库连接数使用数据库参数组

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

SELECT @@max_connections;

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

SHOW STATUS WHERE `variable_name` = 'Threads_connected';

诊断并解决内存限制的不兼容参数状态

当满足以下两个条件时,可以将 MariaDB 或 MySQL 数据库实例置于 incompatible-parameters 状态以获得内存限制:

  • 数据库实例在一小时内至少重启三次,或者在一天内至少重启五次,或者尝试重启数据库实例失败。

  • 数据库实例的潜在内存使用量超过分配给其数据库实例类的内存的 1.2 倍。

当数据库实例在一小时内第三次重启或一天内第五次重启时,Amazon RDS for MySQL 将执行内存使用情况检查。该检查将计算数据库实例的潜在内存使用情况。计算返回的值是以下值的总和:

  • 值 1 – 以下参数的总和:

    • innodb_additional_mem_pool_size

    • innodb_buffer_pool_size

    • innodb_log_buffer_size

    • key_buffer_size

    • query_cache_size(仅限 MySQL 版本 5.6 和 5.7)

    • tmp_table_size

  • 值 2max_connections 参数乘以下参数的总和:

    • binlog_cache_size

    • join_buffer_size

    • read_buffer_size

    • read_rnd_buffer_size

    • sort_buffer_size

    • thread_stack

  • 值 3 – 如果 performance_schema 参数已启用,则将 max_connections 参数乘以 257700

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

因此,计算返回的值如下:

Value 1 + Value 2 + Value 3

当此值超过分配给数据库实例使用的数据库实例类的内存的 1.2 倍时,数据库实例将处于 incompatible-parameters 状态。有关分配给数据库实例类的内存的信息,请参阅 的数据库实例类的硬件规格

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

要解决此问题,请完成以下步骤:

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

    有关设置参数的信息,请参阅 修改数据库参数组中的参数

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

    有关设置参数的信息,请参阅 启动之前停止的 Amazon RDS 数据库实例

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

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

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

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

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

有关只读副本和 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、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 读取复制故障

Amazon RDS 监控只读副本的复制状态,如果由于任何原因停止复制,则将只读副本实例的复制状态字段更新为 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 参数是您可以在数据库参数组中设置的自定义参数。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 文档中的确定二进制日志记录中的安全和不安全语句

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

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

  • 如果您遇到二进制日志 (binlog) 位置问题,则可使用 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 只读副本问题

在启用二进制日志记录的情况下创建触发器需要 SUPER 权限

当尝试在 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"
  2. 修改数据库参数组以允许使用触发器。

    对于 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"
  3. 修改数据库实例以使用新的数据库参数组。

    对于 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
  4. 要使更改生效,请手动重启数据库实例。

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

诊断并解决时间点还原故障

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

在尝试对 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 的更多信息,请参阅使用备份将数据库实例还原至指定时间

复制已停止错误

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

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

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

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

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

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

只读副本创建失败或复制中断,出现严重错误 1236

在更改 MySQL 或 MariaDB 数据库实例的默认参数值后,您可能会遇到下列问题之一:

  • 您无法为数据库实例创建只读副本。

  • 复制失败,出现 fatal error 1236

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

要解决该问题,请设置以下参数值:

  • sync-binlog = 1

  • innodb_support_xa = 1

  • innodb_flush_log_at_trx_commit = 1

无法将备份保留期设置为 0

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

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