排查 Azure Database for MySQL 灵活服务器中的连接问题

MySQL 社区版使用“一个连接一个线程”的方式管理连接。 这样,每个用户连接都会在 mysqld 进程中得到一个专用的操作系统线程。

这种类型的连接处理有潜在的问题。 例如,如果有大量用户连接,即使是空闲的连接,内存的使用率也会相对较高。 此外,在处理数千个用户连接时,内部服务器争用和上下文切换开销会更高。

诊断常见连接错误

每当 Azure Database for MySQL 灵活服务器的实例遇到连接问题时,请记住,在所涉及的三个层的任何一层中都可能存在问题:客户端设备、网络或 Azure Database for MySQL 灵活服务器实例。

因此,每当诊断连接错误时,请务必考虑以下各项的完整详细信息:

  • 客户端,包括:
    • 配置(本地、Azure VM 等或 DBA 计算机)。
    • 操作系统。
    • 软件和版本。
  • 连接字符串和任何包含的参数。
  • 网络拓扑(同一区域?同一 AZ?防火墙规则?路由)。
  • 连接池(参数和配置)(如果正在使用)。

此外,还必须确定数据库连接问题是影响单个客户端设备还是影响几个客户端设备。 如果错误只影响到几个客户端中的一个,则可能是该客户端存在问题。 但是,如果所有客户端都遇到相同的错误,则更有可能是数据库服务器端或之间的网络存在问题。

还请务必考虑工作负载重载的可能性,尤其是当应用程序在较短的时间内打开大量连接时。 可以使用“总连接数”、“活动连接数”和“已中止的连接数”等指标来调查此情况。

从客户端设备或应用程序建立连接时,mysql 中的第一个重要调用是 getaddrinfo,它执行从提供的终结点到 IP 地址的 DNS 转换。 如果获取地址失败,MySQL 会显示一条错误消息,如“错误 2005 (HY000): 未知的 MySQL 服务器主机 'mysql-example.mysql.database.chinacloudapi.cn' (11)”,以及结尾的数字(11、110 等)。

客户端错误 2005 代码

下表显示了某些客户端错误 2005 代码的快速参考说明。

错误 2005 代码 说明
(11)“EAI_SYSTEM - 系统错误” 客户端上的 DNS 解析存在错误。 不是 Azure Database for MySQL 灵活服务器的问题。 在客户端上使用 dig/nslookup 进行故障排除。
(110)“ETIMEDOUT - 连接超时” 连接到客户端的 DNS 服务器超时。 不是 Azure Database for MySQL 灵活服务器的问题。 在客户端上使用 dig/nslookup 进行故障排除。
(0)“名称未知” 指定的名称无法由 DNS 解析。 检查客户端上的输入。 这可能不是 Azure Database for MySQL 灵活服务器的问题。

mysql 中的第二个调用是套接字连接,发生在查看错误消息时,如“错误 2003 (HY000): 无法在‘mysql-example.mysql.database.chinacloudapi.cn’上连接到 Azure Database for MySQL 灵活服务器 (111)”,以及结尾的数字(99、110、111、113 等)。

客户端错误 2003 代码

下表显示了某些客户端错误 2003 代码的快速参考说明。

错误 2003 代码 说明
(99)“EADDRNOTAVAIL - 无法分配请求的地址” 此错误不是由 Azure Database for MySQL 灵活服务器引起的,而是由客户端引起的。
(110)“ETIMEDOUT - 连接超时” 连接到提供的 IP 地址超时。 可能是安全(防火墙规则)问题。 通常,这不是 Azure Database for MySQL 灵活服务器的问题。 在客户端设备上使用 nc/telnet/TCPtraceroute 进行故障排除。
(111)“ECONNREFUSED - 连接被拒绝” 当数据包到达目标服务器时,服务器拒绝了连接。 这可能是尝试连接到错误的服务器或错误的端口。 这也可能与目标服务(Azure Database for MySQL 灵活服务器)正在关闭、正在从故障转移恢复或正在执行崩溃恢复,但尚不接受连接有关。 此问题可能发生在客户端或服务器端。 在客户端设备上使用 nc/telnet/TCPtraceroute 进行故障排除。
(113)“EHOSTUNREACH - 无法访问主机” 客户端设备的路由表不包括数据库服务器所在的网络的路径。 检查客户端设备的网络配置。

其他错误代码

下表显示了与成功建立数据库服务器网络连接后出现的问题相关的其他错误代码的快速参考说明。

错误代码 说明
错误 2013“与 MySQL 服务器的连接断开” 已建立连接,但之后丢失。 如果针对不是 MySQL 的对象尝试连接(例如,使用 MySQL 客户端连接到端口 22 上的 SSH),则可能会发生这种情况。 如果超级用户终止会话,也可能会发生这种情况。 如果数据库使会话超时,也可能会发生这种情况。 或者它可以指在建立连接后数据库服务器中的问题。 这可以在客户端连接的生存期内随时发生。 它可以指示数据库存在严重问题。
错误 1040“连接过多” 已连接数据库客户端数已达到配置的最大数量。 需要评估针对数据库建立这么多连接的原因。
错误 1045“拒绝用户访问” 客户端提供了不正确的用户名或密码,因此数据库拒绝了访问。
错误 2006“MySQL 服务器已断开连接” 类似于上表中的“错误 2013 ‘与 MySQL 服务器的连接断开’”条目。
错误 1317“查询执行已中断” 当主用户停止查询,而不是停止连接时,客户端收到的错误。
错误 1129“由于出现许多连接错误,主机‘1.2.3.4’被阻止” 使用“mysqladmin flush-hosts”取消阻止 - 如果一台计算机的一个客户端多次尝试使用错误的协议与 MySQL 连接(例如,通过 telnet 连接到 MySQL 端口),则会阻止该计算机中的所有客户端。 正如错误消息所示,数据库的管理员用户必须运行 FLUSH HOSTS; 才能清除问题。

注意

有关连接错误的详细信息,请参阅博客文章《调查 Azure Database for MySQL 灵活服务器的连接问题》。

下一步