Amazon RDS 故障排除
利用以下部分帮助排查您使用 Amazon RDS 和 Amazon 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 地址。
要使实例公开可用,请修改它,在公开可用性下选择是。有关更多信息,请参阅“对互联网隐藏 VPC 中的数据库实例”。
-
端口 – 由于您的本地防火墙限制,无法使用您在创建数据库实例时指定的端口来发送和接收通信。如需确定您的网络是否允许指定端口用于入站和出站通信,请向您的网络管理员咨询。
-
可用性 – 对于新创建的数据库实例,数据库实例具有
creating
状态,直到该数据库实例可供使用。当状态变为available
时,您可以连接到该数据库实例。根据数据库实例的大小,可能要用最长 20 分钟,实例才可用。 -
互联网网关 – 对于希望可公开访问的数据库实例,其数据库子网组中的子网必须具有互联网网关。
为子网配置互联网网关
登录Amazon Web Services Management Console并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 -
在导航窗格中,选择 Databases (数据库),然后选择数据库实例的名称。
-
在 Connectivity & security (连接和安全) 选项卡中,记录 VPC 下 VPC ID 的值以及 Subnets (子网) 下子网 ID 的值。
通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/
。 -
在导航窗格中,选择 Internet Gateways。验证是否有 Internet 网关附加到您的 VPC。否则,选择 Create Internet Gateway 以创建 Internet 网关。选择 Internet 网关,然后选择 Attach to VPC 并按照说明将其附加到您的 VPC。
-
在导航窗格中,选择 Subnets,然后选择您的子网。
-
在 Route Table 选项卡上,验证
0.0.0.0/0
的路由是否为目的地以及您的 VPC 的 Internet 网关是否为目标。如果您使用实例的 IPv6 地址连接到实例,请检查是否有一个路由可以将所有 IPv6 流量 (
::/0
) 指向 Internet 网关。否则请执行以下操作:-
选择路由表的 ID (rtb-xxxxxxxx) 以导航到路由表。
-
在 Routes (路由) 选项卡上,选择 Edit routes (编辑路由)。选择 Add route (添加路由),将
0.0.0.0/0
用作目的地并将 Internet 网关用作目标。对于 IPv6,选择 Add route (添加路由),将
::/0
用作目的地并将 Internet 网关用作目标。 -
选择 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 RDS 安全性问题
若要避免安全性问题,切勿使用用户账户的主 Amazon 用户名和密码。最佳做法是使用您的主 Amazon Web Services 账户来创建用户并将这些用户分配给数据库用户账户。您还可使用您的主账户创建其他用户账户 (如有必要)。
有关创建用户的信息,请参阅在 Amazon Web Services 账户 中创建 IAM 用户。有关在 Amazon IAM Identity Center (successor to Amazon Single Sign-On) 中创建用户的信息,请参阅管理 IAM Identity Center 中的身份。
错误消息“无法检索账户属性,某些控制台功能可能受损。”
您可能会由于几个原因而收到此错误。这可能是因为您的账户缺少权限,或者您的账户尚未正确设置。如果您的账户是新账户,可能该账户还没准备好。如果是现有账户,您的访问策略中可能缺少执行特定操作的权限(如,创建数据库实例)。要修复该问题,您的管理员需要为您的账户提供必要的角色。有关更多信息,请参阅 IAM 文档。
重置数据库实例拥有者密码
如果您被锁定在数据库实例之外,则可以以主用户身份登录。然后,您可以重置其他管理用户或角色的凭证。如果您无法以主用户身份登录,Amazon 账户所有者可以重置主用户密码。有关可能需要重置哪些管理账户或角色的详细信息,请参阅主用户账户权限。
您可以使用 Amazon RDS 控制台、Amazon CLI 命令 modify-db-instance,或者使用 ModifyDBInstance API 操作更改数据库实例密码。有关修改 数据库实例的更多信息,请参阅 修改 Amazon RDS 数据库实例。
Amazon RDS 数据库实例中断或重新引导
重新启动数据库实例时可能会发生数据库实例中断。在将数据库实例置于某种禁止对其访问的状态,以及重新启动数据库时会出现这种情况。当您手动重启数据库实例时,可能会发生重启。当您更改需要在重启后才生效的数据库实例设置时,也可能会发生重启。
当您更改需要重启的设置或手动引起重启时,才会发生数据库实例重启。如果您更改某个设置并请求此更改立即生效,则可能会立即发生重启。或者,可能在数据库实例的维护时段内发生重启。
在出现下列情况之一时,会立即发生数据库实例重启:
您将数据库实例的备份保留期从 0 更改为非零值或从非零值更改为 0。然后,将 Apply Immediately(立即应用)设置为
true
。更改数据库实例类,并将立即应用设置为
true
。-
将存储类型从磁性(标准)更改为通用型 (SSD) 或预置 IOPS (SSD),或从预置 IOPS (SSD) 或通用型 (SSD) 更改为磁性(标准)。
在维护时段内,如果出现下列情况之一,则会发生数据库实例重启:
将数据库实例的备份保留期从 0 更改为非零值或从非零值更改为 0 并将立即应用设置为
false
。更改数据库实例类,并将立即应用设置为
false
。
当您更改数据库参数组中的静态参数时,在与该参数组关联的数据库实例重启之前,此更改将不会生效。更改需要手动重新启动。在维护时段内,数据库实例不会自动重新启动。
要查看显示数据库实例操作的表以及设置立即应用值的效果,请参阅修改 Amazon RDS 数据库实例。
Amazon RDS 数据库参数更改未生效
在某些情况下,您可能会更改数据库参数组中的参数,但未看到更改生效。如果是这样,您可能需要重新启动与数据库参数组关联的数据库实例。当您更改动态参数时,更改将立即生效。当您更改静态参数时,在与该参数组关联的数据库实例重启之前,此更改将不会生效。
您可以使用 RDS 控制台重启数据库实例。或者,您可以显式调用 RebootDBInstance
API 操作。如果数据库实例处于多可用区部署中,则可以在不进行失效转移的情况下重启。在静态参数更改后重新引导关联的数据库实例的要求,可帮助缓解影响 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 操作或以下 Amazon CLI 命令为实例添加更多存储空间。
对于 Linux、macOS 或 Unix:
aws rds modify-db-instance \ --db-instance-identifier
mydbinstance
\ --allocated-storage60
\ --apply-immediately
对于 Windows:
aws rds modify-db-instance ^ --db-instance-identifier
mydbinstance
^ --allocated-storage60
^ --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-identifiermydbinstance
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 EC2 用户指南》中的实例容量不足。
有关修改数据库实例的信息,请参阅修改 Amazon RDS 数据库实例。
Amazon RDS 中的可用内存问题
可用内存 是数据库实例上可供数据库引擎使用的总随机存取内存 (RAM)。这是可用操作系统 (OS) 内存以及可用缓冲区和页面缓存的总和。数据库引擎使用主机上的大部分内存,但操作系统进程也使用一些 RAM。当前分配给数据库引擎或操作系统进程使用的内存不包括在可用内存中。当数据库引擎内存不足时,数据库实例可以使用通常用于缓冲和缓存的临时空间。如前所述,这个临时空间包含在可用内存中。
您可以使用 Amazon CloudWatch 中的 FreeableMemory
指标来监控可用内存。有关更多信息,请参阅监控 Amazon RDS 中指标的概览。
如果数据库实例始终可用内存不足或使用交换空间,则考虑纵向扩展至更大的数据库实例类。有关更多信息,请参阅 数据库实例类。
您还可以更改内存设置。例如,在 RDS for MySQL 上,您可以调整 innodb_buffer_pool_size
参数的大小。原定设置情况下,此参数设置为物理内存的 75%。有关更多 MySQL 故障排除提示,请参阅如何对 Amazon RDS for MySQL 数据库中的可用内存不足问题进行故障排除?
MySQL 和 MariaDB 问题
可以使用 MySQL 和 MariaDB 数据库实例诊断和纠正问题。
主题
最大 MySQL 和 MariaDB 连接
允许与 RDS for MySQL 或 RDS 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.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
参数乘以257700
。如果
performance_schema
参数被禁用,则此值为零。
因此,计算返回的值如下:
Value 1 + Value 2 + Value 3
当此值超过分配给数据库实例使用的数据库实例类的内存的 1.2 倍时,数据库实例将处于 incompatible-parameters 状态。有关分配给数据库实例类的内存的信息,请参阅 的数据库实例类的硬件规格。
计算将参数的值乘以多个 max_connections
参数的总和。如果 max_connections
参数设置为较大的值,则可能会导致检查返回过高的数据库实例潜在内存使用量值。在这种情况下,请考虑降低 max_connections
参数的值。
要解决此问题,请完成以下步骤:
-
调整与数据库实例关联的数据库参数组中的内存参数。为此,使潜在的内存使用量低于分配给其数据库实例类的内存的 1.2 倍。
有关设置参数的信息,请参阅 修改数据库参数组中的参数。
-
重新启动数据库实例。
有关设置参数的信息,请参阅 启动之前停止的 Amazon RDS 数据库实例。
诊断并解决只读副本之间的滞后
在创建一个 MySQL 或 MariaDB 只读副本且该只读副本可用后,Amazon RDS 首先将复制自只读副本创建操作启动以来对源数据库实例所做的更改。在此期间,只读副本的复制滞后时间将大于 0。您可以在 Amazon CloudWatch 中通过查看 Amazon RDS ReplicaLag
指标来监控此滞后时间。
ReplicaLag
指标报告 MariaDB 或 MySQL Seconds_Behind_Master
命令的 SHOW REPLICA STATUS
字段的值。有关更多信息,请参阅 MySQL 文档中的 SHOW REPLICA STATUS 语句
当 ReplicaLag
指标达到 0 时,即表示副本已赶上源数据库实例进度。如果 ReplicaLag
指标返回 -1,则副本可能为未激活状态。要纠正复制错误,请参阅诊断并解决 MySQL 或 MariaDB 读取复制故障。ReplicaLag
值为 -1 还可能意味着 Seconds_Behind_Master
值无法确定或为 NULL
。
注意
以前的 MariaDB 和 MySQL 版本使用的是 SHOW SLAVE STATUS
,而不是 SHOW REPLICA STATUS
。如果您使用的 MariaDB 版本低于 10.5 或者 MySQL 版本低于 8.0.23,那么请使用 SHOW SLAVE STATUS
。
ReplicaLag
指标将在网络中断期间或在维护时段内应用修补程序时返回 -1。在这种情况下,在再次检查 ReplicaLag
指标之前,需等待网络连接恢复或维护时段结束。
MySQL 和 MariaDB 只读复制技术是异步的。因此,预计源数据库实例上的 BinLogDiskUsage
指标和只读副本上的 ReplicaLag
指标偶尔会增加。例如,请考虑对源数据库实例并行进行大量写入操作的情况。同时,对只读副本的写入操作会使用单个 I/O 线程序列化。这种情况可能会导致源实例与只读副本之间的滞后。
有关只读副本和 MySQL 的更多信息,请参阅 MySQL 文档中的复制实施详细信息
您可降低对源数据库实例的更新与对只读副本的后续更新之间的滞后,方式如下:
-
将只读副本的数据库实例类的存储大小设置为与源数据库实例的类似。
-
确保源数据库实例和只读副本使用的数据库参数组中的参数设置兼容。有关更多信息和示例,请参阅下一部分中有关
max_allowed_packet
参数的讨论。 -
禁用查询缓存。对于经常修改的表,使用查询缓存可能会加大副本滞后,因为缓存已锁定且会频繁刷新。如果是这样的话,您可能会发现在禁用查询缓存的情况下副本滞后较少。您可通过在数据库实例的数据库参数组中将
query_cache_type parameter
设置为 0 来禁用查询缓存。有关查询缓存的更多信息,请参阅查询缓存配置。 -
为 MySQL 或 MariaDB 的 InnoDB 预热只读副本上的缓冲池。例如,假设您有少量经常更新的表,并且您正在使用 InnoDB 或 XtraDB 表架构。在这种情况下,将这些表转储到只读副本上。这样做将促使数据库引擎从磁盘扫描这些表的行,然后将它们缓存到缓冲池中。此方法可以减少副本滞后。下面是一个示例。
对于 Linux、macOS 或 Unix:
PROMPT> mysqldump \ -h
<endpoint>
\ --port=<port>
\ -u=<username>
\ -p<password>
\ database_nametable1 table2
> /dev/null对于 Windows:
PROMPT> mysqldump ^ -h
<endpoint>
^ --port=<port>
^ -u=<username>
^ -p<password>
^ database_nametable1 table2
> /dev/null
诊断并解决 MySQL 或 MariaDB 读取复制故障
Amazon RDS 会监控只读副本的复制状态。如果由于任何原因停止复制,则 RDS 将只读副本实例的 Replication State(复制状态)字段更新为 Error
。您可通过查看复制错误字段,检查 MySQL 或 MariaDB 引擎引发的关联错误的详细信息。还生成指示只读副本状态的事件,包括 RDS-EVENT-0045、RDS-EVENT-0046 和 RDS-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 或 MariaDB 的 InnoDB。
您可以使用以下命令将 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 创建新参数组以允许在启用了二进制日志记录时使用触发器
创建新的参数组。
对于 Linux、macOS 或 Unix:
aws rds create-db-parameter-group \ --db-parameter-group-name
allow-triggers
\ --db-parameter-group-familymysql8.0
\ --description "parameter group allowing triggers
"对于 Windows:
aws rds create-db-parameter-group ^ --db-parameter-group-name
allow-triggers
^ --db-parameter-group-familymysql8.0
^ --description "parameter group allowing triggers
"修改数据库参数组以允许使用触发器。
对于 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
"修改数据库实例以使用新的数据库参数组。
对于 Linux、macOS 或 Unix:
aws rds modify-db-instance \ --db-instance-identifier
mydbinstance
\ --db-parameter-group-nameallow-triggers
\ --apply-immediately对于 Windows:
aws rds modify-db-instance ^ --db-instance-identifier
mydbinstance
^ --db-parameter-group-nameallow-triggers
^ --apply-immediately要使更改生效,请手动重启数据库实例。
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
命令时,您可能会收到一条错误消息,指出副本已关闭或禁用。
出现该错误消息是由于复制已停止且无法重新启动。
如果您需要跳过大量错误,复制滞后时间可能会超出二进制日志文件的默认保留期。在这种情况下,您可能会遇到一个因二进制日志文件在副本上进行重放之前被清除而引发的严重错误。此清除会导致复制停止,而您将无法再调用 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。