postgresql 默认端口5432被占用时,需先查冲突进程(如lsof或get-nettcpconnection),再决定杀进程或改配置;修改postgresql.conf的port后必须reload服务,并同步更新所有客户端连接配置。
postgresql 默认端口(5432)被占用时,不能靠“重启服务”硬扛,必须先确认冲突进程、再决定是杀掉它还是改 postgresql 的监听端口。
怎么查哪个进程占了 5432 端口
Linux/macOS 直接跑命令,Windows 用 netstat 或 Get-NetTCPConnection:
- Linux/macOS:
lsof -i :5432或sudo ss -tulpn | grep ':5432' - Windows PowerShell:
Get-NetTCPConnection -LocalPort 5432 | Get-Process - 看到
PID后,用ps -p PID -o comm=(Linux/macOS)或tasklist /FI "PID eq PID"(Windows)确认是不是另一个postgres实例、Docker 容器,或者开发工具(如 TablePlus、DBeaver 自带的嵌入式服务)
改 postgresql.conf 的 port 参数前必看
别急着改配置——改完不 reload 或不重启,port 设置不会生效;而且客户端连接字符串也得同步更新,否则连不上。
- 配置文件路径通常在:
/etc/postgresql/*/main/postgresql.conf(Debian/Ubuntu)、/var/lib/pgsql/data/postgresql.conf(RHEL/CentOS)、~/Library/Application Support/Postgres/var-*/postgresql.conf(macOS Homebrew) - 找到并修改这一行:
port = 5432→ 改成比如port = 5433 - 改完必须执行:
pg_ctl reload(如果用pg_ctl启动),或sudo systemctl reload postgresql(systemd 管理),不能只改文件就以为完事 - 注意:如果启用了
ssl = on,换端口后证书绑定不受影响;但反向代理(如 nginx)或云服务商安全组规则要手动同步放行新端口
客户端连接时端口写错的典型表现
不是报“密码错误”,而是更底层的连接失败,容易误判:
-
psql: error: connection to server at "localhost" (127.0.0.1), port 5432 failed: Connection refused—— 即使你改了服务端口,但psql还默认连5432 - 连接字符串里漏写
port参数,例如postgresql://user@localhost/db默认走5432,必须显式写成postgresql://user@localhost:5433/db - ORM(如 Django、SQLAlchemy)配置里
PORT或port键值没更新,日志里看不到 SQL 错误,只卡在初始化连接池阶段
端口冲突本身不难解,难的是改完服务端忘了同步改所有调用方的连接配置,尤其是测试脚本、CI 配置、Docker Compose 的 ports 映射、还有那些藏在 .env 里没被 git 跟踪的本地调试配置。










