为什么我在连接到 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 PROCESSLISTINFORMATION_SCHEMA.PROCESSLIST 语句可能会对性能产生负面影响,因为它们需要互斥锁。

在 Aurora MySQL 数据库实例上启用日志记录

通过启用 general_logslow_query_log高级审计日志参数在 Aurora MySQL 数据库实例上启用日志记录。

解决方法

使用以下方法之一来解决最大连接错误:

  • 查看现有连接,如果可能,则将其终止以释放连接压力。例如,首先终止处于睡眠状态的连接。
  • 增加数据库实例的最大连接数。

终止数据库实例上的现有连接

通过运行 rds_killrds_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 账户允许同时连接的最大数量。

注意:本文不提供这些参数的推荐值或自定义值,因为这些值因单独的使用案例而异。