解决无法连接实例问题

2026-10-08   访问量:1001


本文介绍在各种情况下如何自助解决连接不上RDS的问题。

在搭建业务场景调试的过程中,经常会出现无法连接RDS实例的情况,很多时候都是由于网络类型不统一、白名单未放对应IP等导致的。以下为最常见的原因和解决办法。

网络类型不同

  • ECS实例采用专有网络(VPC),RDS实例采用经典网络

    • 解决办法一(推荐):将RDS实例从经典网络切换为VPC,具体操作请参见切换网络类型。

      说明

      切换后,两者必须处于同一个VPC,才能内网互通。

    • 解决办法二:重新购买经典网络的ECS实例(ECS实例不支持从VPC迁移到经典网络)。但是VPC比经典网络更安全,建议您使用VPC。

    • 解决办法三:ECS实例使用RDS实例的公网连接地址连接RDS实例,即通过公网连接RDS实例。这种方式的性能、安全性、稳定性较差。

  • ECS实例采用经典网络,RDS实例采用专有网络(VPC)

    • 解决办法一(推荐):将ECS实例从经典网络迁移到VPC,具体操作请参见单ECS迁移示例。

      说明

      切换后,两者必须处于同一个VPC,才能内网互通。

    • 解决办法二:将RDS实例从VPC切换为经典网络。但是VPC比经典网络更安全,建议您使用VPC。

    • 解决办法三:使用ClassicLinkClassicLink功能,使经典网络的ECS实例可以和VPC中的云资源通过内网互通。

    • 解决办法四:ECS实例使用RDS实例的公网连接地址连接RDS实例,即通过公网连接RDS实例。这种方式的性能、安全性、稳定性较差。

专有网络(VPC)不同

专有网络VPC是基于阿里云构建的一个隔离的网络环境,专有网络之间逻辑上彻底隔离,所以当ECS和RDS实例的网络类型都是专有网络时,还需要保证所属的专有网络也相同,才能实现内网互通。

地域不同

  • 公网(外网)连接:可以使用RDS实例的外网连接地址,通过外网跨地域/跨账号连接,进出RDS实例的外网流量均不收费。

  • 内网(私网)连接:正常情况下,当ECS与RDS在不同地域或不同账号时,无法通过内网连接(VPC互相隔离,无法互通)。但是,您可以使用VPC对等连接或云企业网,连通两个不同的VPC,使ECS可以跨地域或账号访问RDS实例。

    • VPC对等连接:支持跨地域/跨账号VPC互连,成本低,但配置复杂度相对较高,适用于少量VPC互连的简单场景。

    • 云企业网:支持跨地域/跨账号VPC互连,易配置,但成本相对较高,适用于多个VPC互连的复杂场景。

本地机房连接 RDS

本地机房或 IDC 需要通过内网连接 RDS 实例时,先将本地网络接入阿里云 VPC:

  1. VPN 网关:创建 VPN 网关并建立 IPsec VPN 站点到站点连接,将本地网络与 VPC 打通。

  2. 智能接入网关(SAG):在本地机房部署 SAG 设备,将本地网络接入 VPC。

  3. 高速通道(专线):通过物理专线将本地机房接入阿里云 VPC。

接入 VPC 后,使用 RDS 实例的内网地址连接。如需跨地域连接,通过云企业网(CEN)实现跨地域 VPC 互通,CEN 转发路由器支持加载 VPN 网关 IPsec 连接和 SAG 网络实例。

IP白名单设置有误

  • 由于白名单设置中只有默认地址127.0.0.1。该地址表示不允许任何设备访问RDS实例。因此需在白名单中添加对端的IP地址,具体操作请参见设置IP白名单。

  • 白名单设置成了0.0.0.0,正确格式为0.0.0.0/0。

    重要

    0.0.0.0/0表示允许任何设备访问RDS实例,请谨慎使用。

  • 如果开启了高安全白名单,需进行如下检查:

    • 如果使用的是专有网络的内网连接地址,请确保ECS内网IP地址添加到了专有网络的分组。

    • 如果使用的是经典网络的内网连接地址,请确保ECS内网IP地址添加到了经典网络的分组。

    • 如果通过公网连接,请确保设备公网IP地址添加到了经典网络的分组(专有网络的分组不适用于公网)。

  • 您在白名单中添加的设备公网IP地址可能并非设备真正的出口IP地址。原因如下:

    解决办法请参见:

域名解析失败或错误

域名服务器出现故障或修改过网卡配置,可能会导致域名解析失败或错误。此时可以通过ping和 telnet测试到RDS的连通性,命令如下。

说明

macOS 系统可使用 nc 命令测试端口连通性,命令格式为 nc -vz <RDS地址> <端口>。

ping <域名>
telnet <域名> <端口号>

示例

# 正常示例
[root@xxx ~]# ping rm-xxx.mysql.rds.aliyuncs.com
PING rm-xxx.mysql.rds.aliyuncs.com (192.168.0.176) 56(84) bytes of data.
64 bytes from 192.168.0.176 (192.168.0.176): icmp_seq=1 ttl=64 time=0.151 ms
64 bytes from 192.168.0.176 (192.168.0.176): icmp_seq=2 ttl=64 time=0.141 ms
64 bytes from 192.168.0.176 (192.168.0.176): icmp_seq=3 ttl=64 time=0.107 ms
64 bytes from 192.168.0.176 (192.168.0.176): icmp_seq=4 ttl=64 time=0.108 ms
# 失败示例
[root@izbpxxx ~]# ping rm-bp1xxx.mysql.rds.aliyuncs.com
ping: rm-bp1xxx.mysql.rds.aliyuncs.com: Name or service not known
[root@izbpxxx ~]#


# 连接正常
[root@xxx ~]# telnet rm-xxx.mysql.rds.aliyuncs.com 3306
Trying 192.168.0.176...
Connected to rm-xxx.mysql.rds.aliyuncs.com.
Escape character is '^]'.
N
5.6.16-logtEkkVNd-0!)\}\4/,/GXfu<mysql_native_password
# 连接失败(域名解析失败)
[root@izbpxxx ~]# telnet rm-bp1xxx.mysql.rds.aliyuncs.com 3306
telnet: rm-bp1xxx.mysql.rds.aliyuncs.com: Name or service not known
rm-bp1xxx.mysql.rds.aliyuncs.com: Host name lookup failure
[root@izbpxxx ~]#

如果失败的话,可以通过修改网卡配置文件来解决问题,具体步骤如下:

  1. 修改对应的网卡配置文件。

    vi /etc/sysconfig/network-scripts/<网卡配置文件名>

    说明

    <网卡配置文件名>:ECS服务器使用的网卡,可以通过ifconfig查看后缀名,默认为ifcfg-eth0。

  2. 在配置文件末尾加入如下配置。

    DNS1=100.100.XX.XX
    DNS2=100.100.XX.XX

    说明

    如果已经有DNS1和DNS2配置,请将IP地址修改为如上所示。

    DEVICE=eth0
    BOOTPROTO=dhcp>
  3. 使用如下命令重启Network服务。

    sudo systemctl restart network
  4. 使用如下命令查看是否修改成功。

     cat /etc/resolv.conf
    [root@xxx ~]# cat /etc/resolv.conf
    options timeout:2 attempts:3 rotate single-request-reopen
    : generated_by /usr/sbin/dhclient-script
    nameserver 100.100.2.136
    nameserver 100.100.2.138
    [root@xxx ~]#

实例重启、恢复或 DNS 变更后域名暂时无法解析

问题现象:RDS 实例重启、恢复或 DNS 变更后,客户端可能提示“无法识别外网地址”或域名解析失败。此时,直接 Ping 或 Telnet 实例 IP 地址可能正常,但使用公网地址连接数据库仍然失败。

问题原因:公网地址变更后,DNS 解析需要一段时间生效,通常可能持续几分钟到几十分钟。本地 DNS 缓存尚未更新,或全球 DNS 传播延迟时,客户端会暂时解析不到最新地址。

解决方案:按以下顺序排查:

  1. 等待一段时间后重新使用公网地址连接,避免在 DNS 记录尚未生效时反复修改应用连接配置。

  2. 为隔离 DNS 解析问题,可在 Navicat 等数据库客户端中临时使用实例 IP 地址直接连接数据库进行测试。IP 地址可以连通而公网地址无法连接时,说明应继续排查 DNS 解析和缓存,而不是数据库端口。

  3. 刷新发起连接的客户端或服务端 DNS 配置。执行本节的网卡配置修改步骤后,再重新解析公网地址并测试连接。

上述排查适用于 DNS 解析延迟、实例重启后无法连接、提示无法识别外网地址、使用 IP 地址连接以及 DNS 缓存未更新等场景。

端口连通性测试

域名解析正常时,可通过telnet命令测试RDS实例端口是否可达。

telnet <RDS连接地址> <端口号>

例如,测试RDS MySQL实例的默认端口3306:

telnet rm-xxxx.mysql.rds.aliyuncs.com 3306
  • 输出Connected to和Escape character is,表示网络层端口可达。

  • 连接超时(Connection timed out),表示网络不通或被防火墙拦截。检查以下配置:

    • RDS白名单是否包含客户端IP地址。

    • 安全组规则是否放通对应端口。

    • 客户端与RDS实例是否在同一VPC内(内网地址仅VPC内可达)。

  • 连接被拒绝(Connection refused),表示端口未监听。确认RDS实例运行状态和端口配置。

ping和telnet均正常但应用仍报连接超时时,问题在应用层而非网络层。使用tcpdump抓包分析TCP三次握手和四次挥手过程,定位超时根因。

tcpdump -i eth0 host <RDS连接地址> -w rds_capture.pcap

分析抓包结果:SYN无回复表示网络不可达或被拦截,三次握手完成后无数据交互表示应用层异常。

只读实例未设置白名单

使用只读实例或读写分离时,要确保只读实例上也设置了白名单,否则应用程序无法访问只读实例。

内外网地址使用错误

使用内网地址从外网进行连接,或者使用外网地址从内网进行连接都会导致连接失败。

请确认您使用的地址类型。如果您需要从内网连接RDS实例,请使用RDS实例的内网地址;如果您需要从外网连接RDS实例,请使用RDS实例的外网地址。

连接数已满

连接数满通常是由于空闲连接过多或活动连接过多,具体原因及解决办法请参见如何处理RDS MySQL连接数被打满的情况或如何处理RDS PostgreSQL实例连接数过多。

排查应用层连接池配置

问题现象:应用可能报出Communications link failure、Failed to obtain JDBC Connection或连接超时。即使 RDS 实例仍可访问,新请求也可能无法从应用的连接池中获取可用连接。

问题原因:

  • 连接池的活动连接数达到maximum-pool-size后,新请求会等待可用连接,等待超时后连接失败。

  • JDBC URL 中socketTimeout=0表示无限等待。连接长期没有活动时,防火墙、SLB 等中间设备可能主动断开连接。

  • 数据库连接未在finally块中关闭,或未使用 try-with-resources 自动关闭,会造成连接泄漏并持续占用连接池中的连接。

解决方案:

  1. 根据 RDS 实例规格支持的最大连接数,适当调整 HikariCP 或 Druid 的maximum-pool-size。连接池上限不能超过实例规格允许的连接数,并应为数据库管理和其他应用预留连接。

  2. 配置并保留连接有效性检测。HikariCP 可使用connection-test-query: SELECT 1并设置keepalive-time;Druid 可设置validationQuery和testWhileIdle=true,定期检测并清理失效连接。

  3. 在 JDBC URL 中设置合理的非零socketTimeout,例如:

    &socketTimeout=60000

    说明

    不要将socketTimeout设置为0,以避免连接无限等待且长期空闲时被中间网络设备断开。

  4. 审查应用代码中的数据库连接使用方式,确认每个连接、语句和结果集都在使用完成后正确关闭;优先使用 try-with-resources,或在finally块中关闭资源。

完成调整后,观察连接池活动连接数、获取连接的等待时间和应用报错是否恢复正常。

实例负载过高

实例CPU使用率、内存使用率、IOPS或活跃连接数异常升高时,会导致新连接建立失败或已有连接读写超时。通过查看实例监控指标和诊断报告定位负载瓶颈。

排查步骤:

  1. 登录RDS管理控制台,在实例列表页面找到目标实例,进入实例的管理页面。在左侧导航栏单击监控与报警。

  2. 在标准监控页签下查看以下指标:

    • CPU使用率是否持续超过80%。

    • 内存使用率是否接近上限。

    • 当前活跃连接数是否接近实例规格的连接数上限。

    • IOPS是否达到瓶颈。

  3. 在左侧导航栏展开自治服务,单击诊断报告查看历史诊断结果,定位实例在连接超时时段内是否存在性能异常。

  4. 在自治服务下单击一键诊断,检查是否存在慢SQL导致连接堆积。长时间运行的慢查询会占用连接资源,导致新连接无法建立。

上述负载指标均正常时,排除实例侧性能问题,转向网络层面排查(如抓包分析)。

实例状态一直处于“创建网络连接”中

通过控制台进入任务列表,可对实例的当前任务重试,或修改切换时间。详情请参见任务中心。

连接建立后发送FIN包无响应导致读超时

通过VPN或专线等中间网络访问RDS MySQL实例时,连接可以正常建立和使用,但客户端发送FIN包后服务端无响应,最终导致连接读超时(read timeout)。

排查步骤:

  1. 在RDS控制台实例详情页,单击左侧导航栏的参数设置,检查wait_timeout和interactive_timeout参数值。RDS MySQL中wait_timeout默认值为86400秒,如果该参数被设置过短,空闲连接会被服务端提前关闭。

  2. 检查VPN或专线等中间网络链路是否存在丢包或高延迟。使用telnet <RDS连接地址> <端口号>测试RDS实例端口连通性,确认网络层可达。

  3. 在客户端和服务端同时使用tcpdump或Wireshark抓包,分析TCP FIN/RST包的交互时序,定位断连发生在网络传输层还是数据库应用层。

通过日志排查连接超时

连接超时问题可以通过查看RDS实例的错误日志和慢日志来定位原因。

  1. 登录RDS管理控制台,在实例列表页面找到目标实例,进入实例的管理页面。在左侧导航栏选择日志管理 > 错误日志。

  2. 查看错误日志中是否存在连接拒绝(如Host is blocked)或连接超时(如connect timeout、Aborted connection)等记录,定位连接失败的具体原因。

  3. 选择慢日志明细,检查是否有长时间运行的慢查询阻塞了新连接。

  4. 检查实例的wait_timeout和interactive_timeout参数配置,判断是否因空闲连接超时被自动断开。

为什么 Ping 和 Telnet 测试 RDS 端口连通性正常,但应用程序仍无法连接?

Ping 成功仅表示主机能够响应 ICMP 请求,Telnet 成功表示目标数据库端口可达。应用程序仍无法连接时,请按以下顺序排查图形化客户端、命令行连接、应用配置和账号。

  1. 排除图形化数据库客户端的显示异常或配置问题。使用 MySQL 命令行工具执行以下命令进行底层连接测试:

    mysql -h <地址> -P <端口> -u <账号> -p

    将<地址>、<端口>和<账号>替换为实际连接信息,输入密码后观察是否能够登录。命令行连接成功时,网络连通性和当前账号权限通常正常。

  2. 命令行能够连接而应用程序仍失败时,重点检查 Java 或其他应用代码中的数据库驱动版本、连接字符串格式、地址、端口、数据库名称和账号密码是否与命令行测试一致。

  3. 检查应用使用的数据库账号。不要使用以dms开头的系统账号进行业务连接测试;请改用用于业务访问的高权限账号或普通账号,并确认该账号具有目标数据库所需的访问权限。

如果命令行测试也失败,请回到本文的网络、白名单、端口连通性和账号权限相关排查项继续定位。


热门文章
更多>