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 分钟,实例才可用。 -
互联网网关 – 对于希望可公开访问的数据库实例,其数据库子网组中的子网必须具有互联网网关。
为子网配置互联网网关
登录AWS 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 安全性问题
为避免出现安全性问题,切勿为用户账户使用您的 AWS 账户根用户电子邮件地址和密码。最佳做法是使用根用户来创建用户,并将这些用户分配给数据库用户账户。还可使用根用户创建其它用户账户(如有必要)。
有关创建用户的信息,请参阅在 AWS 账户 中创建 IAM 用户。有关在 AWS IAM Identity Center 中创建用户的信息,请参阅管理 IAM Identity Center 中的身份。
错误消息“无法检索账户属性,某些控制台功能可能受损。”
您可能会由于几个原因而收到此错误。这可能是因为您的账户缺少权限,或者您的账户尚未正确设置。如果您的账户是新账户,可能该账户还没准备好。如果是现有账户,您的访问策略中可能缺少执行特定操作的权限(如,创建数据库实例)。要修复该问题,您的管理员需要为您的账户提供必要的角色。有关更多信息,请参阅 IAM 文档。
排查网络不兼容状态问题
网络不兼容状态意味着可能仍然可以在数据库级别访问数据库,但您无法对其进行修改或重启。
原因
您的数据库实例的网络不兼容状态可能是以下操作之一造成的:
-
修改数据库实例类。
-
修改数据库实例以使用多可用区数据库集群部署。
-
由于维护事件而替换主机。
-
启动替换数据库实例。
-
从快照备份进行还原。
-
启动已停止的数据库实例。
解决方案
使用 start-db-instance 命令
要修复处于网络不兼容状态的数据库,请按照以下说明进行操作:
-
打开 https://console.aws.amazon.com/rds/
,然后从导航窗格中选择数据库。 -
从连接和安全选项卡中选择处于网络不兼容状态的数据库实例,并记下数据库实例标识符、VPC ID 和子网 ID。
-
使用 AWS CLI 运行
start-db-instance
命令。指定--db-instance-identifier
值。注意
当数据库处于不兼容模式时运行此命令可能会导致一些停机时间。
start-db-instance
命令无法解决 RDS for SQL Server 数据库实例的这一问题。
如果命令成功执行,则您的数据库状态更改为可用。
如果您的数据库重新启动,则数据库实例可能会在实例变为网络不兼容状态之前,执行上一次在实例上运行的操作。这可能会将实例移回网络不兼容状态。
如果 start-db-instance
命令未成功或实例移回网络不兼容状态,请在 RDS 控制台中打开数据库页面并选择表。导航到日志和事件部分。近期事件部分显示了要遵循的进一步解决步骤。消息分类如下:
-
内部资源检查:您的内部资源可能存在问题。
-
DNS 检查:在 VPC 控制台中检查 VPC 的 DNS 解析和主机名。
-
ENI 检查:数据库的弹性网络接口(ENI)可能不存在。
-
网关检查:公开可用的数据库的互联网网关未连接到 VPC。
-
IP 检查:子网中没有可用的 IP 地址。
-
安全组检查:没有与您的数据库关联的安全组或安全组无效。
-
子网检查:您的数据库子网组中没有有效的子网,或者您的子网存在问题。
-
VPC 检查:与您的数据库关联的 VPC 无效。
执行时间点恢复
最佳做法是进行备份(快照或逻辑),以防数据库进入网络不兼容状态。请参阅 备份简介。如果启用了自动备份,则暂时停止对数据库的任何写入并执行时间点恢复。
注意
实例进入网络不兼容状态后,可能无法访问该数据库实例来执行逻辑备份。
如果您没有开启自动备份,请创建新的数据库实例。然后,使用 AWS Database Migration Service(AWS DMS)或使用备份和还原工具迁移数据。
如果这仍无法解决问题,请联系 AWS Support 寻求进一步的帮助。
重置数据库实例拥有者密码
如果您被锁定在数据库实例之外,则可以以主用户身份登录。然后,您可以重置其他管理用户或角色的凭证。如果您无法以主用户身份登录,AWS 账户所有者可以重置主用户密码。有关可能需要重置哪些管理账户或角色的详细信息,请参阅主用户账户权限。
您可以使用 Amazon RDS 控制台、AWS 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 中修改数据库参数组中的参数。
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-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
参数。有关更多信息,请参阅“最大数据库连接数”和“Amazon RDS 的参数组”。
您可以通过运行以下查询来检索 MySQL 或 MariaDB 数据库实例允许的最大连接数。
SELECT @@max_connections;
您可以通过运行以下查询来检索与 MySQL 或 MariaDB 数据库实例的活动连接数。
SHOW STATUS WHERE `variable_name` = 'Threads_connected';
诊断并解决内存限制的不兼容参数状态
当满足以下条件时,可以将 MariaDB 或 MySQL 数据库实例置于 incompatible-parameters 状态以获得内存限制:
-
当数据库实例状态为可用时,数据库实例在一小时内至少重新启动三次,或在一天内至少重新启动五次。
-
尝试重新启动数据库实例失败,因为维护操作或监控过程无法重新启动数据库实例。
-
数据库实例的潜在内存使用量超过分配给其数据库实例类的内存的 1.2 倍。
当数据库实例在一小时内第三次重新启动或一天内第五次重新启动时,它将执行内存使用情况检查。该检查将计算数据库实例的潜在内存使用情况。计算返回的值是以下值的总和:
-
值 1 – 以下参数的总和:
-
innodb_additional_mem_pool_size
-
innodb_buffer_pool_size
您可以修改
innodb_buffer_pool_size
的值。但是,该值并不总是与您输入的值相匹配。出现这种不匹配有以下几个原因。首先,如果数据库实例是微型数据库实例,我们会覆盖默认值并将其设置为 256 MB。有关更多信息,请参阅 覆盖 innodb_buffer_pool_size。其次,我们确保在数据库实例上为主机管理器、引擎、操作系统和内核预留 500 MB 的内存。
最后,我们通过将
innodb_buffer_pool_size
划分为单位来对其进行优化。主机管理器向下舍入到最接近这些单位的倍数。单位是通过将innodb_buffer_pool_chunk_size
乘以innodb_buffer_pool_instances
计算得出的。有关更多信息,请参阅 MySQL 文档中的配置 InnoDB 缓冲池大小。 innodb_buffer_pool_instances
的默认值为 8,除非innodb_buffer_pool_size
小于 1 GB。如果innodb_buffer_pool_size
小于 1 GB,则innodb_buffer_pool_instances
的默认值为 1。innodb_buffer_pool_chunk_size
的默认值为 128 MB。 -
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
参数乘以429498
。如果
performance_schema
参数被禁用,则此值为零。
因此,计算返回的值如下:
Value 1 + Value 2 + Value 3
当此值超过分配给数据库实例使用的数据库实例类的内存的 1.2 倍时,数据库实例将处于 incompatible-parameters 状态。有关分配给数据库实例类的内存的信息,请参阅 的数据库实例类的硬件规格。
计算将参数的值乘以多个 max_connections
参数的总和。如果 max_connections
参数设置为较大的值,则可能会导致检查返回过高的数据库实例潜在内存使用量值。在这种情况下,请考虑降低 max_connections
参数的值。
要解决此问题,请完成以下步骤:
-
调整与数据库实例关联的数据库参数组中的内存参数。为此,使潜在的内存使用量低于分配给其数据库实例类的内存的 1.2 倍。
有关设置参数的信息,请参阅 在 Amazon RDS 中修改数据库参数组中的参数。
-
重新启动数据库实例。
有关设置参数的信息,请参阅 启动之前停止的 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-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 文档中的确定二进制日志记录中的安全和不安全语句。
下列步骤可帮助您纠正复制错误:
-
如果您遇到逻辑错误并且您可安全跳过该错误,则可执行跳过当前的复制错误中所述的步骤。您的 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。