概述

在搭建业务场景的调试过程中,经常会出现无法连接RDS实例的情况,很多时候都是由于网络类型不统一、白名单未添加对应IP地址等导致的问题。本文主要介绍在各种情况下,如何解决无法连接RDS的问题。

详细信息

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

如果在连接数据库时出现报错,请参见数据库无法连接的常见错误。若无法定位问题,请参见数据库无法连接的排查方法

数据库无法连接的常见错误

请根据现场情况与具体的报错信息,选择对应的解决方法。

 
数据库类型 错误信息 报错原因 解决办法
MySQL或MariaDB TX
  • ERROR 2003 (HY000): Can't connect to MySQL server on 'XXX'(10038或10060或110)
  • 无法连接到数据库:XXX
网络互通问题。

内网环境:点此查看

外网环境:点此查看

  • ERROR 1045 (HY000): #28000ip not in whitelist
  • ERROR 2801 (HY000): #RDS00ip not in whitelist, client ip is XXX
白名单设置问题。 点此查看
  • ERROR 1045 (28000): Access denied for user ‘XXX’@’XXX’ (using password: YES或NO)
用户名或密码错误。 点此查看
  • ERROR 2005 (HY000): Unknown MySQL server host ‘XXX’ (110或11004)
  • SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known
  • Name or service not known
DNS服务器无法解析地址。 点此查看
SQL Server

无法连接到XXX。Cannot connect to XXX。
在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: TCP Provider, error: 0 - 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。)(Microsoft SQL Server,错误: 10060或258)

网络互通问题。

内网环境:点此查看

外网环境:点此查看

无法连接到XXX。Cannot connect to XXX。

已成功与服务器建立连接,但是在登录过程中发生错误。(provider:TCP提供程序,error:0 - 指定的网络名不再可用。)(Microsoft SQL Server,错误:64)

白名单设置问题。 点此查看
PostgreSQL/PPAS

Unable to connect to server:

could not connect to server: Connection timed out (0x0000274C/10060)Is the server running on host “XXX.rds.aliyuncs.com” and acceptingTCP/IP connections on port XXX?

网络互通问题。

内网环境:点此查看

外网环境:点此查看

  • server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.
  • Error connecting to the server: FATAL: no pg_hba.conf entry
白名单设置问题。 点此查看
FATAL: remaining connection slots are reserved for non-replication superuser connections 连接数满。 点击查看

 

数据库无法连接的排查方法

请根据当前环境的实际情况,选择对应的排查方法。

ECS实例通过内网无法访问RDS实例

  1. ECS实例和RDS实例应该处于同一个地域。如果所处地域不同,请查看解决办法

  2. ECS实例和RDS实例的网络类型应该相同。如果一个是经典网络,一个是专有网络,请查看解决办法

  3. 在保证ECS实例和RDS实例的网络类型均是专有网络的前提下,ECS实例和RDS实例应处于同一个VPC内。如果不同,请查看解决办法

  4. 确认ECS的内网IP地址已添加到RDS的白名单。如果未添加,请设置白名单

  5. 检查白名单的地址段是否设置成为0.0.0.0,该地址段正确格式应为0.0.0.0/0

    注意:该地址段允许任何设备访问RDS实例,有安全风险,请谨慎使用。

  6. 若开启了高安全白名单模式,请进行以下检查。

    • 如果使用的是专有网络的内网连接地址,请确保ECS实例内网IP地址已添加到专有网络的分组。
    • 如果使用的是经典网络的内网连接地址,请确保ECS实例内网IP地址已添加到经典网络的分组。
  7. 确认ECS实例内配置的RDS内网地址和端口正确,可在数据库连接页面查看该信息。

  8. 确认系统已配置正确的DNS。如果未配置或配置错误,请配置DNS
  9. 确认当前数据库的连接数未达到最大值。如果连接数已满,请参见处理数据库连接数已满的情况

外网无法访问RDS实例

  1. 确认已设置RDS白名单。如果未设置,请设置白名单

  2. 检查白名单的地址段是否设置成为0.0.0.0,该地址段正确格式为0.0.0.0/0

    说明:该地址段允许任何设备访问RDS实例,有安全风险,请谨慎使用。

  3. 若开启了高安全白名单模式,需确保设备公网IP地址已添加到经典网络的分组。

    说明:专有网络的分组不适用于公网。

  4. 确认白名单添加的设备公网IP地址为设备真正的出口IP地址。IP地址填写错误的原因如下。

    • 设备的公网IP地址不固定,可能会变动。
    • IP地址查询工具或网站查询的公网IP地址不准确。关于确认设备公网IP地址的方法,请参见定位本地IP

  5. 确认使用的连接地址为RDS的外网地址。  

    说明

  6. 确认系统已配置正确的DNS。如果未配置或配置错误,请配置DNS
  7. 确认当前数据库的连接数未达到最大值。如果连接数已满,请参见处理数据库连接数已满的情况

数据库无法连接的常见场景

网络类型不同

ECS实例采用专有网络(VPC)而RDS实例采用经典网络的场景
  • 解决办法一(推荐):将RDS实例从经典网络切换为VPC,具体操作请参见切换网络类型
    说明:切换后,两者必须处于同一个VPC,才能内网互通。
  • 解决办法二:重新购买经典网络的ECS实例。但是VPC比经典网络更安全,建议您使用VPC。
    说明:ECS实例不支持从VPC迁移到经典网络。
  • 解决办法三:使用RDS实例的公网连接地址连接RDS实例,即ECS实例通过公网连接RDS实例。这种方式的性能、安全性、稳定性较差。
ECS实例采用经典网络而RDS实例采用专有网络的场景
  • 解决办法一(推荐):将ECS实例从经典网络迁移到VPC,具体操作请参见单ECS迁移示例
    说明:迁移后,两者必须处于同一个VPC,才能内网互通。
  • 解决办法二:将RDS实例从VPC切换为经典网络。但是VPC比经典网络更安全,建议您使用VPC。
  • 解决办法三:开通ClassicLink功能,使经典网络的ECS实例可以和VPC中的RDS实例通过内网互通。
  • 解决办法四:使用RDS实例的公网连接地址连接RDS实例,即ECS实例通过公网连接RDS实例。这种方式的性能、安全性、稳定性较差。

专有网络不同

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

  • 解决办法一(推荐):将RDS实例迁移到ECS实例所在的VPC,具体操作请参见切换网络类型。先将RDS实例的网络类型从VPC切换到经典网络,再切换回VPC,切换时选择ECS实例所在的VPC。
  • 解决办法二:在两个VPC之间建立高速通道
  • 解决办法三:通过公网互通。这种方式的性能、安全性、稳定性较差。

域名解析失败或错误

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

ping [$Domain]
telnet [$Domain] [$Port]

说明:[$Domain]为RDS的连接地址,[$Port]为RDS的连接端口号。

ping命令成功示例如下。
ping命令失败示例如下。

telnet命令成功示例如下。
telnet命令失败示例如下。

若执行失败,可以通过修改网卡配置文件来解决问题。本文以CentOS系统为例。
  1. 修改网卡配置文件。
    /etc/sysconfig/network-scripts/[$Interface_config]
    说明:[$Interface_config]为系统使用的网卡配置文件,可以通过ifconfig命令查看其后缀名,默认为ifcfg-eth0。
  2. 在配置文件末尾添加以下配置。
    DNS1=100.100.2.136
    DNS2=100.100.2.138
    说明
    • 如果已经存在DNS1和DNS2配置,请将其修改为上述值。
    • 这组DNS只适用于内网环境,外网环境请根据实际情况填写。
    系统返回类似如下。
    修改dns
  3. 执行以下命令,重启Network服务。
    systemctl restart network
  4. 执行以下命令,确认配置已生效。
     cat /etc/resolv.conf
    系统返回类似如下。

地域不同

当ECS实例和RDS实例位于不同的地域时,无法直接通过内网互通。

  • 解决办法一:将原实例申请退款,重新购买。
  • 解决办法二:ECS实例和RDS实例的网络类型都设置为VPC,同时在两个VPC之间建立高速通道
  • 解决办法三:通过外网互通。这种方式的性能、安全性、稳定性较差。

IP白名单设置有误

  • 由于数据安全性页面的白名单设置默认只包含本地回环地址(127.0.0.1),该地址表示不允许任何设备访问RDS实例。因此需在白名单中添加对端的IP地址,具体操作请参见设置白名单
  • 白名单设置成了0.0.0.0,正确格式应为0.0.0.0/0。
    说明0.0.0.0/0表示允许任何设备访问RDS实例,请谨慎使用。
  • 如果开启了高安全白名单,需进行以下检查。
    • 如果使用的是专有网络的内网连接地址,请确保ECS内网IP地址添加到了专有网络的分组。
    • 如果使用的是经典网络的内网连接地址,请确保ECS内网IP地址添加到了经典网络的分组。
    • 如果通过公网连接,请确保设备公网IP地址添加到了经典网络的分组。
      说明:专有网络的分组不适用于公网。
  • 白名单中添加的设备公网IP地址可能并非设备真正的出口IP地址,原因如下。
    • 公网IP地址不固定,可能会变动。
    • IP地址查询工具或网站查询的公网IP地址不准确。
  • 相关添加的设备公网IP地址的解决办法请参见以下文档。

只读实例未设置白名单

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

内外网地址使用错误

使用内网地址从外网进行连接,或者使用外网地址从内网进行连接都会导致连接失败。请确认您使用的地址类型,如果您需要从内网连接RDS实例,请使用RDS实例的内网地址。如果您需要从外网连接RDS实例,请使用RDS实例的外网地址。

连接数已满

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

用户名或密码错误

请检查连接信息中的用户名和密码,并按照以下方法进行操作。

  • RDS不提供root账号,您需要自行创建账号。具体操作请参见创建账号和数据库
  • 如果密码中包含特殊字符,可能需要加上单引号。例如,在命令中使用-p 'XXX'
  • 如果忘记密码,您可以在控制台的 账号管理 页面修改密码。
    说明:修改密码后,新密码可能需要数分钟才生效。
    修改密码

无法解析地址

请按照以下步骤进行检查。

  1. 检查输入的RDS连接地址(字符串)是否正确。以下为可能的出错原因。
    • 地址输入错误。如下图所示,正确的格式为rm-XXX.XXX.rds.aliyuncs.com。
      连接地址格式
    • 使用外网地址,但是外网地址已经被手动释放。
    • 程序允许输入的地址长度有限,地址被程序截断。
  2. 如果RDS连接地址输入正确但是仍然提示上述错误信息,那么把DNS服务器地址修改为阿里云的DNS服务器地址。
    • 如果是通过内网(经典网络)访问,改为10.143.22.116和10.143.22.118。
    • 如果是通过内网(VPC)访问,改为100.100.2.136和100.100.2.138。
    • 如果是通过公网访问,改为223.5.5.5和223.6.6.6。

适用于

  • 云数据库RDS