为什么我在连接到 Amazon Aurora MySQL 实例时会收到“连接过多”错误?
上次更新日期:2020 年 12 月 16 日
我在尝试连接到 Amazon Aurora MySQL 数据库实例时收到“连接过多”错误。我的数据库实例的最大连接数是多少?如何调整此值?
简短描述
如果您在尝试连接到 Amazon Aurora MySQL 数据库集群或实例时,客户端出现“连接过多”的错误,则表示其他客户端正在使用所有可用的连接。这是由 max_connections 参数决定的。
您可能会发现以下任意症状:
Amazon CloudWatch 中的 DatabaseConnections 指标接近或等于 Aurora MySQL 数据库实例的 max_connections 值。
max_connections 参数值高于数据库实例类为连接预配的可用内存。请在 CloudWatch 中检查是否存在 FreeableMemory 指标值较低之类的迹象。
您会在 MySQL 错误日志中收到 ERROR 1040(): Too many connections 的错误消息。
达到 max_connections 值的原因如下:
连接到数据库实例的客户端/应用程序接数量突然或逐渐增加。导致的原因如下:
工作负载增加导致连接数增加。
表/行级别锁定导致客户端/应用程序连接数增加。
操作结束后,客户端/应用程序未正确关闭连接。
wait_timeout 和/或 interactive_timeout 等连接超时参数的值较高,这可能会导致睡眠连接数量的增加。
在解决最大连接错误之前,首先查看当前在数据库实例上运行的所有线程。然后,在数据库实例上启用日志记录。
显示当前在 Aurora MySQL 数据库实例上运行的线程
SHOW FULL PROCESSLIST 命令会显示当前在数据库实例上运行的线程。登录数据库实例,然后运行以下查询:
SHOW FULL PROCESSLIST\G
您也可以运行以下查询以获得相同的结果集:
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST
注意:您必须为用户账户授予 MySQL PROCESS 服务器管理权限,才能查看 MySQL 数据库实例上运行的所有线程。否则,SHOW PROCESSLIST 仅显示与您正在使用的 MySQL 账户关联的线程。有关更多信息,请参阅 MySQL 文档中的 MySQL 提供的权限。
注意:SHOW FULL PROCESSLIST 和 INFORMATION_SCHEMA.PROCESSLIST 语句可能会对性能产生负面影响,因为它们需要互斥锁。
在 Aurora MySQL 数据库实例上启用日志记录
解决方法
使用以下方法之一来解决最大连接错误:
查看现有连接,如果可能,则将其终止以释放连接压力。例如,首先终止处于睡眠状态的连接。
增加数据库实例的最大连接数。
终止数据库实例上的现有连接
通过运行 rds_kill 和 rds_kill_query 命令,终止当前在数据库实例上运行的用户会话或查询:
CALL mysql.rds_kill(thread-ID);
CALL mysql.rds_kill_query(thread-ID);
增加数据库实例的最大连接数
使用以下方法来增加与数据库实例的最大连接数:
使用自定义实例级别参数组为 max_connections 参数设置一个较大值。提高 max_connections 参数不会导致中断,但如果数据库实例使用的是默认参数组,则应将参数组更改为自定义参数组。更改参数组会导致中断。有关更多信息,请参阅使用数据库参数组。
注意:Aurora MySQL 数据库实例的最大允许连接数由数据库实例的实例级别参数组中的 max_connections 参数确定。请参阅以下示例:
max_connections = GREATEST({log(DBInstanceClassMemory/805306368)*45},{log(DBInstanceClassMemory/8187281408)*1000})
检查数据库实例的 max_connections 参数当前值。为此,请检查附加到数据库实例的参数组或运行以下查询:
select @@max_connections;
max_connections 参数具有以下规格:
可以在数据库集群和数据库实例参数组上设置。但是,实例级别参数设置将会生效。
允许的值是 1-16000 范围内的整数。
本质上是动态的(更改此参数值无需重新启动)。
有关 Aurora MySQL 可用的每个数据库实例类的 max_connections 默认值的更多信息,请参阅 Aurora MySQL 数据库实例的最大连接数。
注意:Aurora MySQL 和 Amazon Relational Database Service (Amazon RDS) MySQL 数据库实例的内存开销不同。对于使用相同实例类的 Aurora MySQL 和 RDS MySQL 数据库实例,max_connections 值可能不同。列出的值仅适用于 Aurora MySQL。
调整 max_connections 参数的最佳实践
使用数据库实例的 max_connections 参数时,请务必考虑以下事项。
如果系统对其他主要的内存消耗者(如缓冲池和查询缓存)使用的是默认值,则需要调整系统的默认连接限制。如果您要更改数据库集群的这些设置,请考虑调整连接限制以增加或减少数据库实例的可用内存。
将 max_connections 值设置为略高于每个数据库实例上预计打开的最大连接数。
如果您还启用了 performance_schema,请谨慎设置 max_connections 参数。性能架构内存结构将根据服务器配置变量(包括 max_connections)自动调整大小。您设置的变量越高,性能架构使用的内存就越多。在极端情况下,这可能会导致小型实例类型(如 T2 和 T3)内存不足的问题。如果您使用的是性能架构,最佳实践是将 max_connections 保留为默认值。如果您计划将 max_connections 值设置为明显高于默认值的值,请考虑禁用性能架构。 注意:如果您为 Aurora MySQL 数据库实例启用性能详情,则性能架构会自动启用。
您还可以考虑对以下 MySQL 连接参数进行调整:
wait_timeout:服务器在关闭非交互式 TCP/IP 或 UNIX File 连接之前等待其活动的秒数。
interactive_timeout:服务器在关闭交互式连接之前等待其活动的秒数。
net_read_timeout:在丢弃读取之前等待来自 TCP/IP 连接的更多数据的秒数。
net_write_timeout:在丢弃写入之前等待 TCP/IP 连接写入数据块的秒数。
max_execution_time:SELECT 语句执行超时时间(单位为毫秒)。
max_connect_errors:如果连接中断的数量超过该参数,则主机将被阻止继续连接。
max_user_connections:任何给定 MySQL 账户允许同时连接的最大数量。
注意:本文不提供这些参数的推荐值或自定义值,因为这些值因单独的使用案例而异。