Skip to content

如何在本地连接云服务器中运行的数据库

问题背景

开发过程中经常需要连接远程数据库进行调试,注意⚠️:直接暴露数据库端口存在安全风险。

实操步骤

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

新建服务器连接

  1. 打开 pgAdmin4
  2. 右键 "Servers" → "Register" → "Server"
  3. 填写连接信息:

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 加密传输,无需暴露数据库端口
  • 简单:一条命令即可建立连接
  • 灵活:可以转发任意端口,避免端口冲突

Released under the MIT License.