跨RDS PostgreSQL通过DBLink连接报错求助(均启用SSH)
解决DBLink跨RDS PostgreSQL连接问题
核心问题分析
- 第一个报错
Connection timed out:源RDS与目标RDS之间网络不通,要么安全组/防火墙未开放5432端口,要么没有配置VPC对等连接/私有网络打通,导致TCP连接无法建立。 - 第二个报错:
dblink本身不支持在连接字符串中直接指定SSH相关参数(ssh_host/ssh_port等均为无效参数),你的写法不符合PostgreSQL连接字符串规范,才触发了密码相关的错误提示。
可行解决方案
方案1:打通两个RDS的私有网络(推荐云原生方案)
如果两台RDS属于同一云服务商,优先使用服务商提供的私有网络互联能力:
- AWS:配置VPC对等连接,确保两个RDS所在VPC可互相访问,同时更新双方安全组规则,允许对方VPC的IP段访问5432端口。
- 阿里云:配置VPC对等连接或云企业网,同步更新安全组规则。
完成网络配置后,直接使用第一次的DBLink语句即可(需确保密码正确、目标RDS的pg_hba.conf允许源RDS IP访问):
SELECT dblink_connect('myconn', 'dbname=Test-Prod port=5432 host=10.60.0.10 user=postgres password=abcd');
方案2:通过SSH跳板机建立端口转发(适用于无法打通私有网络的场景)
由于RDS是托管实例,无法直接在RDS上建立SSH隧道,需借助一台中间云服务器作为跳板:
- 准备跳板机,满足以下条件:
- 源RDS安全组允许跳板机IP访问5432端口。
- 目标RDS安全组允许跳板机IP访问5432端口。
- 跳板机安全组允许源RDS所在环境的IP访问22端口。
- 在跳板机上执行端口转发命令,将本地端口(如5433)映射到目标RDS的5432端口:
ssh -L 5433:10.60.0.10:5432 ubuntu@跳板机公网/私有IP
(需后台运行可添加-fN参数)
3. 修改源RDS的DBLink连接字符串,指向跳板机的转发端口:
SELECT dblink_connect('myconn', 'dbname=Test-Prod port=5433 host=跳板机IP user=postgres password=abcd');
方案3:使用第三方扩展dblink_ssh(仅适用于自建PostgreSQL)
部分第三方扩展(如dblink_ssh)支持通过SSH隧道连接,但托管RDS(如AWS RDS)不允许用户安装非官方扩展,仅适用于自建实例。安装扩展后可使用如下语句:
SELECT dblink_ssh_connect('myconn', 'ssh://ubuntu@10.20.2.12:22', 'dbname=Test-Prod host=10.60.0.10 user=postgres password=abcd');
额外注意事项
- 确保目标RDS的
pg_hba.conf允许源RDS或跳板机的IP访问,且postgresql.conf中listen_addresses设置为*(托管RDS默认已配置)。 - 若你不是超级用户,需先获取
dblink使用权限:
GRANT USAGE ON SCHEMA dblink TO 你的用户名;
内容的提问来源于stack exchange,提问作者Vamsi Krishna
相关产品推荐
相关产品推荐

