跳至内容

当我连接到我的 Amazon Aurora MySQL 实例时,为什么会收到"Too many connections error"?

2 分钟阅读
0

我想连接到我的 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_connectedinformation_schema.processlist 来代替 DatabaseConnectionsthreads_connectedinformation_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 的值,请完成以下步骤:

  1. 创建自定义数据库实例参数组
  2. 将该参数组与您的数据库实例关联
  3. 增加 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"

AWS 官方已更新 5 个月前