我想连接到我的 Amazon Aurora MySQL 兼容版数据库实例,但我收到了"Too many connections"错误。我想知道我的数据库实例的最大连接数值以及如何更改此值。
简短描述
当客户端连接数超过数据库实例中的 max_connections 参数值时,您会收到"Too many connections"错误消息。
要解决此问题,请先查看数据库实例上正在运行的所有查询和线程。然后,在数据库实例上激活日志记录。检查现有连接,并终止不必要的连接以减轻连接压力。此外,调整您的 MySQL 连接参数。如果您仍然遇到问题,请增加与数据库实例的最大连接数。
解决方法
查看数据库实例上正在运行的所有查询和线程
查看数据库实例上正在运行的所有查询。然后,检查 Threads_Connected 值以查看打开的连接数。有关详细信息,请参阅 MySQL 网站上的 Threads_connected。
对于 MySQL 5.7,请运行以下命令:
mysql> SELECT variable_value AS Threads_Connected FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE variable_name='threads_connected';
对于 MySQL 8.0,请运行以下命令:
mysql> SELECT variable_value AS Threads_Connected from performance_schema.global_status where VARIABLE_NAME = 'threads_connected';
**注意:**由于 Aurora 可以通过 rdsadmin 管理用户连接到数据库,因此 threads_connected 的值可能会高于 max_connections。
最佳做法是使用 threads_connected 或 information_schema.processlist 来代替 DatabaseConnections。threads_connected 和 information_schema.processlist 参数显示其他客户端所使用的可用 MySQL 连接数。
DatabaseConnections 显示远程 TCP 连接的总数,不包括休眠连接或数据库引擎为自身目的创建的会话。因此,DatabaseConnections 值可能会低于 MySQL 线程执行的操作数量。
在您的数据库实例上激活日志记录
在 Aurora MySQL 兼容版数据库实例上激活日志记录,以确定连接数增加的根本原因。您可以激活 general_log、slow_query_log 或高级审计日志参数。
终止数据库实例上不必要的连接
使用 rds_kill 和 rds_kill_query 命令终止数据库实例上正在运行的不必要的用户会话和查询。
调整您的 MySQL 连接参数
根据您的首选值调整数据库实例的以下 MySQL 连接参数:
- wait_timeout
- interactive_timeout
- net_read_timeout
- net_write_timeout
- max_execution_time
- max_connect_errors
- max_user_connections
有关上述每个参数的详细信息,请参阅 MySQL 网站上的 Server system variables(服务器系统变量)。
增加与数据库实例的最大连接数
如果您在调整连接参数后仍遇到问题,请增加与数据库实例的最大连接数。要获取数据库实例当前的 max_connections 值,请查看附加到该数据库实例的参数组。或者,运行以下查询:
select @@max_connections;
Aurora MySQL 兼容版和 Amazon Relational Database Service (Amazon RDS) for MySQL 数据库实例的内存开销量不同。使用相同实例类的 Aurora MySQL 兼容版和 Amazon RDS for MySQL 数据库实例的 max_connections 值可能会有所不同。
要确定您的实例类的最大连接数,请使用以下公式:
max_connections = GREATEST({log(17179869184/805306368)*45},{log(17179869184/8187281408)*1000})
**注意:**上述示例针对的是内存为 16 GiB 的 Aurora MySQL 兼容版 db.r8g.large 实例。DBInstanceClassMemory 等于 17179869184 字节。max_connections 的当前值为 1000。
结果示例:
max_connections = GREATEST(195.56,1000) = 1000
**注意:**对于该内存为 16 GiB 的 db.r8g.large 实例类,其最大连接数等于默认值。
增加 max_connections 参数
**注意:**将 max_connections 值增加到超过默认值并不是最佳做法。相反,请扩展您的数据库实例。
如果您不扩展数据库实例,而是选择增加 max_connections 的值,请完成以下步骤:
- 创建自定义数据库实例参数组。
- 将该参数组与您的数据库实例关联。
- 增加 max_connections 参数值。
**注意:**当您设置更大的 max_connections 值时,不会发生中断。
纵向扩展您的实例
如果您超过了 max_connections 参数的最大值,则最佳做法是扩展您的数据库实例类。您的数据库实例在扩展时可能会发生中断。
使用最佳实践来调整 max_connections 参数
如果您更改了数据库集群的缓冲池和查询缓存设置,请调整连接配额,以考虑数据库实例上可用内存的增加或减少。
将 max_connections 参数设置为略高于您期望在每个数据库实例上打开的最大连接数。
如果您启用了“性能详情”,则性能架构将自动激活。当性能架构处于激活状态时,最佳做法是使用默认的 max_connections 值。性能架构内存结构会根据服务器配置自动调整大小。
重要事项:性能详情将于 2025 年 11 月 30 日到期。您可以在 2025 年 11 月 30 日之前升级到数据库洞察的高级模式。如果您不升级,则使用性能详情的数据库集群将默认为数据库洞察的标准模式。只有数据库洞察的高级模式才支持执行计划和按需分析。如果您的集群默认采用标准模式,则您可能无法在控制台上使用这些功能。要开启高级模式,请参阅开启适用于 Amazon RDS 的数据库洞察的高级模式和开启适用于 Amazon Aurora 的数据库洞察的高级模式。
使用 Amazon RDS 代理
如果您仍然收到错误,请使用适用于 Aurora 的 Amazon RDS 代理来提高应用程序的扩展能力。
相关信息
如何解决 Amazon RDS for MySQL 或 Aurora MySQL 兼容版中的错误?"Got an error reading communication packets"