Connection refused 表明TCP连接被直接拒绝,本质是目标端口无服务监听或被防火墙REJECT,需优先验证数据库进程状态、监听地址(如0.0.0.0:3306)、端口配置及防火墙/安全组策略。

Connection refused 说明数据库服务根本没响应
这个错误不是认证失败,也不是超时,而是 TCP 连接阶段就被拒绝——DBeaver 尝试向目标 IP 和端口发起 SYN 包,但对方直接回 RST,等价于“这台机器上压根没进程在监听那个端口”。它比 Authentication failed 更底层,优先级最高,必须先解决。
确认 MySQL/PostgreSQL 服务是否真在运行
别只信系统服务名,要查真实监听状态。很多情况下服务看似启动了,但实际没绑定到网络端口(比如 MySQL 默认跳过 bind-address 或设为 127.0.0.1,而你连的是公网 IP)。
- Linux/macOS:运行
sudo ss -tuln | grep :3306(MySQL)或sudo ss -tuln | grep :5432(PostgreSQL),看有没有LISTEN状态的行;没有就说明服务没起来,或没监听该端口 - Windows:用
netstat -ano | findstr :3306,再用tasklist | findstr [PID]确认对应进程是不是mysqld.exe或postgres.exe - 如果服务是 systemd 管理的,
systemctl status mysql或systemctl status postgresql只显示 “active (running)” 不够,得看日志里有没有Starting MySQL Server后紧跟Listening on 0.0.0.0:3306这类关键句
检查 DBeaver 填的 host 和 port 是否和实际服务一致
常见错配场景远比想象中多:MySQL 安装后默认端口是 3306,但有些云数据库(如阿里云 RDS)默认用 3306 以外的端口;PostgreSQL 在某些发行版里默认监听 5433 而非 5432;达梦数据库 V8 默认是 5236,V7 是 5237。
- 别凭记忆填端口,去数据库配置文件里确认:
/etc/my.cnf里的port=、/var/lib/pgsql/data/postgresql.conf里的port =、dm.ini里的PORT_NUM= - host 别混用
localhost和127.0.0.1:MySQL 对这两者处理不同(前者走 socket,后者走 TCP),若服务只绑定了127.0.0.1,填localhost就会报Connection refused - 远程连接时,host 必须填数据库服务器的真实内网或公网 IP,不能填
localhost(那是指 DBeaver 所在机器)
防火墙/NAT/安全组是否拦住了入向连接
即使服务起来了、端口也对,中间链路上任何一环拦截都会导致 Connection refused。注意:被防火墙 DROP 通常表现为超时,而被 REJECT 才会立刻返回 Connection refused。
- 本地服务器防火墙:CentOS/RHEL 上运行
sudo firewall-cmd --list-ports,确认3306/tcp或5432/tcp已放行;Ubuntu 上检查ufw status - 云厂商安全组:阿里云/腾讯云/AWS 控制台里查目标实例的安全组规则,确保入方向(Inbound)开放了对应端口,且源 IP 设置合理(比如开发机 IP 或
0.0.0.0/0临时测试) - 跳板机或 NAT 设备:如果你是通过 SSH 隧道或代理访问,确认隧道命令里的
-L 3306:db-host:3306中的db-host能被跳板机解析且可达,否则跳板机无法转发,本地连127.0.0.1:3306就会直接被拒绝
真正容易被忽略的是服务监听地址和防火墙策略的组合效应:比如 PostgreSQL 配置了 listen_addresses = '127.0.0.1' 且防火墙只放行了本地回环,这时从外部连必然 Connection refused;改监听地址不改防火墙,或改防火墙不改监听地址,问题依旧存在。

















