用系统包管理器安装最稳妥,自动解决依赖并初始化集群;必须以postgres用户执行管理命令;远程访问需修改postgresql.conf的listen_addresses和pg_hba.conf的认证规则并重启服务。

直接用系统包管理器安装最稳妥
绝大多数 Linux 发行版的官方仓库都提供了 PostgreSQL 的预编译包,版本稳定、依赖自动解决、服务配置开箱即用。别急着去官网下源码或 Docker 镜像——除非你明确需要特定小版本或自定义编译选项。
常见发行版命令如下:
- Ubuntu/Debian:
sudo apt update && sudo apt install postgresql postgresql-contrib - CentOS/RHEL 8+:
sudo dnf install postgresql-server postgresql-contrib - CentOS/RHEL 7:
sudo yum install postgresql96-server postgresql96-contrib(注意版本号后缀)
装完会自动初始化数据库集群(默认在 /var/lib/pgsql/data 或 /var/lib/postgresql/*/main),并注册 postgresql 系统服务。不用手动跑 initdb ——包管理器已帮你做了。
启动服务前必须切换到 postgres 用户
PostgreSQL 默认禁止 root 直接操作数据库,所有初始化后的管理命令(如创建用户、建库)都要求以系统用户 postgres 身份执行。直接 sudo -u postgres psql 是唯一安全入口,跳过这步大概率遇到 psql: error: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed 或权限拒绝。
常用操作示例:
- 启动服务:
sudo systemctl start postgresql(部分旧版用postgresql-*服务名) - 切用户进 SQL shell:
sudo -u postgres psql - 创建新数据库用户:
sudo -u postgres createuser --interactive --pwprompt myuser - 创建数据库:
sudo -u postgres createdb mydb
别用 su - postgres 再执行命令——某些发行版(如 RHEL)会限制该用户登录 shell,sudo -u 才是可靠方式。
修改监听地址和认证方式才能远程访问
默认安装只监听本地 127.0.0.1,且 pg_hba.conf 仅允许 peer 或 ident 认证,这意味着从其他机器连不上,甚至本机用密码也登不了 psql -U myuser -h localhost。
必须改两处配置(路径通常为 /etc/postgresql/*/main/ 或 /var/lib/pgsql/data/):
- 编辑
postgresql.conf,找到listen_addresses行,改为:listen_addresses = 'localhost,192.168.1.100'(填服务器实际 IP,或'*'表示所有接口,生产环境慎用) - 编辑
pg_hba.conf,在末尾加一行:host all all 192.168.1.0/24 md5(允许指定网段用密码连接)
改完必须重启服务:sudo systemctl restart postgresql。不 reload 不生效——pg_hba.conf 只在启动或 reload 时加载,而 listen_addresses 必须重启。
密码连不上?检查 pg_hba.conf 的匹配顺序和用户权限
pg_hba.conf 是按**从上到下顺序匹配**的,一旦某条规则匹配成功,就不再往后看。很多人加了允许远程的 host 行,但前面还留着一条 local all all peer 或更宽泛的 host all all 0.0.0.0/0 reject,结果密码永远不生效。
验证当前生效规则的方法:
- 连上
psql后执行:SELECT * FROM pg_hba_file_rules();(需 PostgreSQL ≥ 10) - 查日志:
sudo tail -f /var/log/postgresql/*.log,失败时会明确写 “connection rejected by pg_hba.conf” 并指出匹配的行号
另外确保目标用户有登录权限:在 psql 中运行 \du,确认 myuser 的 rolcanlogin 列为 t;若为 f,需执行:ALTER USER myuser WITH LOGIN;
真正麻烦的不是安装步骤,而是配置文件里那些看似无关紧要的空格、注释位置、IP 段掩码长度,还有 peer 和 md5 认证混用时的隐式优先级——这些细节错一处,连接就卡死,且错误提示几乎不告诉你具体哪行错了。










