推荐使用系统包管理器安装PostgreSQL:Ubuntu/Debian用apt install postgresql postgresql-contrib,CentOS/RHEL 8+用dnf install postgresql-server postgresql-contrib;自行编译易遗漏systemd服务配置、数据目录权限及locale初始化等关键步骤。

直接用系统包管理器装,别自己编译
Ubuntu/Debian 用 apt install postgresql postgresql-contrib,CentOS/RHEL 8+ 用 dnf install postgresql-server postgresql-contrib。自己下载源码编译不仅慢,还容易漏掉 systemd 服务配置、默认数据目录权限、locale 初始化这些关键步骤。
常见错误现象:psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed——多半是没运行 postgresql-setup initdb(RHEL)或没执行 sudo pg_createcluster(Debian),导致数据目录压根没初始化。
- Debian 系发行版会自动创建
postgres用户和默认集群,启动服务只需sudo systemctl start postgresql - RHEL/CentOS 需手动初始化:
sudo postgresql-setup --initdb,否则systemctl start postgresql会静默失败 - 装完立刻检查:
sudo -u postgres psql -c "SELECT version();",能返回版本说明服务已跑起来
改监听地址前先关 SELinux 或配策略
想让其他机器连进来?改 postgresql.conf 里的 listen_addresses 是第一步,但 CentOS/RHEL 上默认 SELinux 会拦住非标准端口或跨网段连接,netstat -tlnp | grep :5432 看到监听了,客户端照样连不上。
使用场景:本地开发用 localhost 就够;测试环境要从 Docker 容器或另一台机器访问,必须放开监听 + 放行防火墙 + 配 SELinux。
- 临时关 SELinux:
sudo setenforce 0(仅调试用,重启后恢复) - 永久放行 PostgreSQL 端口:
sudo semanage port -a -t postgresql_port_t -p tcp 5432 - 防火墙别只开
5432,还要确认firewalldzone 正确:sudo firewall-cmd --permanent --add-service=postgresql -
pg_hba.conf必须同步加规则,比如host all all 192.168.1.0/24 md5,光改listen_addresses没用
用户密码设错会导致 psql -U 连不上
PostgreSQL 默认禁用密码登录,新用户即使设了密码,pg_hba.conf 里对应规则不是 md5 或 scram-sha-256,psql -U myuser -d mydb 就会卡在密码提示或直接报 password authentication failed。
参数差异:Debian 默认用 peer 认证本地 postgres 用户,RHEL 默认用 ident;两者都不走密码。想统一用密码,得改 pg_hba.conf 对应行的认证方法。
- 切到
postgres系统用户再进:sudo -u postgres psql,避免被认证机制挡在外面 - 在 psql 里设密码:
ALTER USER myuser WITH PASSWORD 'xxx';,单引号不能省 - 改完
pg_hba.conf后必须 reload:sudo systemctl reload postgresql(不是 restart) - 验证是否生效:
psql -U myuser -d postgres -h 127.0.0.1(强制走 TCP,绕过 peer/ident)
扩展没启用就用 uuid_generate_v4() 会报函数不存在
很多教程说“装完就能用 UUID”,但 uuid-ossp 扩展默认不激活。直接写 SELECT uuid_generate_v4();,报错就是 function uuid_generate_v4() does not exist,不是没装对,是没启用。
性能影响:启用扩展只是注册函数和类型,不占内存,也不影响启动速度;但 pgcrypto 这类加密扩展如果不用,没必要启用,减少潜在攻击面。
- 先连进数据库:
sudo -u postgres psql mydb - 启用扩展:
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";(双引号不能少,因为名字带横线) - 想全局启用?在
template1库里执行,新创建的库自动继承:sudo -u postgres psql template1 -c "CREATE EXTENSION \"uuid-ossp\";" - 不确定有哪些扩展可用:
\dx查已启用,SELECT * FROM pg_available_extensions;查全部
真正麻烦的是 pg_hba.conf 的匹配顺序和 reload 时机——改完不 reload,或者规则写在拒绝条目后面,问题就藏得特别深。还有人把密码设成纯数字,结果被 scram-sha-256 认证机制拒绝,报错却只说“authentication failed”。










