概述

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

详细信息

阿里云提醒您:

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

如果在连接数据库时出现明确报错,请参见数据库无法连接的常见错误。若无法定位问题,请根据当前环境的实际情况,选择对应的排查方法进排查。如果为ECS和RDS连接出现问题时,请参见ECS和RDS内外网连接需满足的条件进行排查,然后再参见以下操作进行排查。

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

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

当ECS与RDS的网络类型不同、地域不同或者处于不同VPC内时,需要实现相互访问,可通过公网地址进行访问。比如ECS是经典网络,RDS是专有网络,这种情况下通过内网是无法访问的,只有通过公网才可以正常访问。

  1. 请确保ECS实例和RDS实例处于同一个地域。当ECS实例和RDS实例位于不同的地域时,无法直接通过内网互通,请参见以下方法进行处理:

    • 解决办法一:将原实例申请退款,重新购买。
    • 解决办法二:ECS实例和RDS实例的网络类型都设置为VPC,如何切换网络类型请参见切换网络类型。同时在两个VPC之间建立高速通道。
    • 解决办法三:通过外网互通。这种方式的性能、安全性、稳定性较差。
  2. 请确保ECS实例和RDS实例的网络类型相同。如果一个是经典网络,一个是专有网络,请参见以下方法进行处理:

    • 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实例通过内网互通。
        说明:ClassicLink的功能请参见ClassicLink概述
      • 解决办法四:使用RDS实例的公网连接地址连接RDS实例,即ECS实例通过公网连接RDS实例。这种方式的性能、安全性、稳定性较差。
  3. 专有网络是基于阿里云构建的一个隔离的网络环境,专有网络之间逻辑上彻底隔离,所以当ECS和RDS实例的网络类型均为专有网络时,必须保证所属的专有网络也相同,才能内网互通。如果专有网络不同,请参见以下方法进行处理:

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

     

  4. 检查ECS实例的安全组。
    1. 登录云服务器管理控制台
    2. 找到该实例,单击管理进入实例详情页面,在左侧导航栏,单击本实例安全组。在内网出方向安全全部规则中确认不存在对RDS实例的限制策略。
  5. 确认ECS的内网IP地址已添加到RDS的白名单。如果未添加,请参见设置白名单,进行白名单设置。

  6. 请检查是否开启了高安全白名单模式,具体请参见高安全白名单模式。如果已开启,请进行以下检查:

    • 如果使用的是专有网络的内网连接地址,请确保ECS实例内网IP地址已添加到专有网络的分组。
    • 如果使用的是经典网络的内网连接地址,请确保ECS实例内网IP地址已添加到经典网络的分组。
  7. 查看RDS实例的状态,检查是否存在因为磁盘空间超出购买规格限制而被锁定。在实例锁定期间,应用无法对RDS数据库进行读写操作,详情请参见如何排查MySQL实例空间满后自动锁定的原因
  8.  通过查看RDS实例的性能监控。
  9. 确认ECS实例内配置的RDS内网地址和端口正确,可在数据库连接页面查看该信息。

  10. 核实主机到RDS网络是否正常。在ECS实例上执行以下命令,测试是否可以正常连接到RDS实例地址的端口。
    telnet [$RDS_IP] [$Port]
    说明
    • [$RDS_IP]为RDS实例的连接地址。
    • [$Port]为数据库的端口号,如果修改过数据库的端口,则将端口替换为修改后的端口即可。MySQL的RDS实例默认端口是3306,SQL Server的RDS实例默认端口是3433。
    • 如果可以通信,则说明网络正常的。
    • 如果端口不通,说明网络异常,请排查服务器的网络问题。
  11. 确认系统已配置正确的DNS。如果未配置或配置错误,详情请参见配置DNS
  12. 确认当前数据库的连接数未达到最大值。如果连接数已满,请参见处理数据库连接数已满的情况

外网无法访问RDS实例

在确保连接RDS实例的地址为公网地址,且连接数据库的账号及密码正确的情况下,可参见以下操作进行排查。

  1. 确认访问RDS实例的IP地址已添加到RDS白名单。如果未添加,请参见设置白名单,进行设置。

  2. 检查ECS实例的安全组。
    1. 登录云服务器管理控制台
    2. 找到该实例,单击管理进入实例详情页面,在左侧导航栏,单击本实例安全组。在内网出方向安全全部规则中确认不存在对RDS实例的限制策略。
  3. 请检查是否开启了高安全白名单模式,具体请参见高安全白名单模式。如果已开启,需确保设备公网IP地址已添加到经典网络的分组。

    注意:专有网络的分组不适用于公网。

  4. 查看RDS实例的状态,检查是否存在因为磁盘空间超出购买规格限制而被锁定。在实例锁定期间,应用无法对RDS数据库进行读写操作,详情请参见如何排查MySQL实例空间满后自动锁定的原因
  5.  通过查看RDS实例的性能监控。
  6. 确认白名单中添加的设备公网IP地址为设备真正的出口IP地址。IP地址填写错误的原因如下:

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

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

    说明

  8. 核实主机到RDS网络是否正常。在ECS实例上执行以下命令,测试是否可以正常连接到RDS实例地址的端口。
    telnet [$RDS_IP] [$Port]
    • 如果可以通信,则说明网络正常的。
    • 如果端口不通,说明网络异常,请排查服务器的网络问题。
  9. 确认系统已配置正确的DNS。如果未配置或配置错误,请配置DNS
  10. 确认当前数据库的连接数未达到最大值。如果连接数已满,请参见处理数据库连接数已满的情况

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

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

域名解析失败或错误

域名服务器出现故障或修改过网卡配置,可能会导致域名解析失败或解析错误。此时可以通过pingtelnet命令测试到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
    系统返回类似如下。

IP白名单设置有误

详情请参见ECS通过内网连接RDS时报“ip not in whitelist”错误

只读实例未设置白名单

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

内外网地址使用错误

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

连接数已满

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

用户名或密码错误

详情请参见连接RDS MySQL提示“ERROR 1045 (28000): Access denied for user”错误

无法解析地址

详情请参见“Unknown MySQL server host”或“name or service not known”错误

连接数据库的命令格式错误 

将参数格式调整为-p123456中间不要有空格,调整为-p"123456"-p'123456'亦可。

注意:在Linux系统下如果密码有特殊字符,必须使用单引号。

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

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

 
数据库类型 错误信息 报错原因 解决办法
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 1045 (28000): Authentication Failed For RDS maybe username or password is incorrect
用户名或密码错误。 点此查看
ERROR 1044 (RDS00): Access denied for user 'xxx'@'%' to database '123456' 命令使用123456作为密码,但是实际上在连接时与-p参数之间多了空格,123456就被解析为数据库名称。 点此查看
  • 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)

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

Logon failed for login 'user' due to trigger execution

连接数满。 点此查看
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 连接数满。 点击查看
通过DMS连接RDS数据库 The user specified as a definer ('user'@'a.b.c.d') does not exist 登录所使用的账号不存在,该问题仅发生在RDS数据库代理模式(原高安全模式)下。 点击查看
The MYSQL server is running with the --rds-deny-access option so it cannot execute this statement
  • RDS实例过期。

  • RDS实例的磁盘满。

点此查看
您不是该实例的拥有者

使用DMS控制台登录未授权的RDS实例。

点此查看
请检查连接地址的正确性、网络畅通情况、白名单设置

该问题一般发生于自建的MySQL服务器,问题原因可能是如下几点:

  • ECS实例的防火墙限制或自建MySQL服务器所在主机的防火墙限制。
  • ECS安全组未对DMS开放。
  • MySQL服务器未启动。
  • MySQL服务器只允许root账户本地登录。
点此查看
max_user_connections

RDS数据库的连接数满

点此查看

适用于

  • 云数据库RDS