如何在本地连接云服务器中运行的数据库
问题背景
开发过程中经常需要连接远程数据库进行调试,注意⚠️:直接暴露数据库端口存在安全风险。
实操步骤
1. 检查本地端口占用
bash
# 检查 5432 端口是否被占用
lsof -i :5432
# 如果有占用,会显示占用进程的信息如果本地已有 PostgreSQL 或 Docker 占用 5432 端口,需要使用其他端口。
2. 建立 SSH 隧道
情况1:远程数据库直接运行在宿主机(或者运行在容器中并暴露了端口给宿主机)
bash
# 如果本地 5432 端口空闲
ssh -p 2333 -L 5432:localhost:5432 user@[服务器IP]
# 如果本地 5432 端口被占用,使用 15432 端口
ssh -p 2333 -L 15432:localhost:5432 user@[服务器IP]情况2:远程数据库运行在 Docker 容器中
bash
# 先查看容器信息
ssh -p 2333 user@[服务器IP] "sudo docker ps | grep postgres"
# 建立到容器的隧道(推荐方案)
ssh -p 2333 -L 15432:localhost:5432 user@[服务器IP] -t "sudo docker exec -it app_postgres bash"3. 配置 pgAdmin4
新建服务器连接:
- 打开 pgAdmin4
- 右键 "Servers" → "Register" → "Server"
- 填写连接信息:
General 标签:
- Name:
远程数据库
Connection 标签:
- Host:
localhost(重要:不是云服务器IP) - Port:
15432 - Database:
jungle - Username:
postgres - Password:
[数据库密码](根据实际情况填写)
高级选项:
- Connection timeout:
10(秒) - 勾选 "Save password" 以避免重复输入
SSH Tunnel:
pgAmin 有一个 SSH Tunnel 的选项,也可以配置 SSH 隧道连接,原理一致。
4. 验证连接
使用 nc 测试端口连通性
bash
nc -zv localhost 15432
# 输出:Connection to localhost port 15432 [tcp/pyrrho] succeeded!常见问题
Q: 连接失败,提示 "Connection refused" A: 检查 SSH 隧道是否建立成功,确保 SSH 连接没有断开
Q: 提示 "Port already in use" A: 更换本地端口号,如使用 5434、5435 等
Q: SSH 连接断开后无法访问数据库 A: SSH 隧道会随着 SSH 连接断开而失效,需要重新建立
优点
- 安全:通过 SSH 加密传输,无需暴露数据库端口
- 简单:一条命令即可建立连接
- 灵活:可以转发任意端口,避免端口冲突