一、环境
| 项 | 值 |
|---|---|
| 主机 | 192.168.6.98 |
| 系统 | CentOS Stream 9(x86_64) |
| SELinux | Enforcing |
| 防火墙 | firewalld(active) |
| 安装方式 | PGDG 官方 yum 源 |
| 版本 | PostgreSQL 18.6(18.6-1PGDG.rhel9.8) |
二、目录约定
| 目录 | 用途 |
|---|---|
| /usr/pgsql-18/ | 二进制、库、工具(rpm 固定位置,不可自定义) |
| /apps/works/data | 数据目录(PGDATA) |
| /apps/works/server | 预留目录,本次为空(方案 A 二进制不落这里) |
三、安装步骤(实际执行命令)
# 1. 建目录
mkdir -p /apps/works/server /apps/works/data
# 2. 加 PGDG 源 + 禁用系统自带 postgresql 模块 + 装 server
dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
dnf -qy module disable postgresql
dnf install -y postgresql18-server
# 3. 初始化数据目录(注意:直接指到 /apps/works/data,不是默认的 /var/lib/pgsql/18/data)
chown postgres:postgres /apps/works/data
su - postgres -c "/usr/pgsql-18/bin/initdb -D /apps/works/data -E UTF8 --auth-local=peer --auth-host=scram-sha-256"
# 4. systemd 覆盖默认数据目录
mkdir -p /etc/systemd/system/postgresql-18.service.d
printf "[Service]\nEnvironment=PGDATA=/apps/works/data\n" > /etc/systemd/system/postgresql-18.service.d/override.conf
systemctl daemon-reload
四、配置改动
postgresql.conf
/apps/works/data/postgresql.conf,只改了一处:
listen_addresses = '*'
pg_hba.conf
/apps/works/data/pg_hba.conf,末尾追加两行(对外全开,测试用):
host all all 0.0.0.0/0 scram-sha-256 host all all ::0/0 scram-sha-256
SELinux(关键,漏了会启动失败)
自定义数据目录默认是 default_t,必须改成 postgresql_db_t:
semanage fcontext -a -t postgresql_db_t "/apps/works/data(/.*)?"
restorecon -Rv /apps/works/data
防火墙
firewall-cmd --permanent --add-port=5432/tcp
firewall-cmd --reload
五、服务
-
systemd 单元:
postgresql-18 -
覆盖文件:
/etc/systemd/system/postgresql-18.service.d/override.conf -
开机自启:已 enable
systemctl start postgresql-18
systemctl enable postgresql-18
六、账号
| 项 | 值 |
|---|---|
| 用户 | postgres |
| 密码 | ugDj%sFhymtDvezf |
| 认证方式 | scram-sha-256 |
连接:psql -h 192.168.6.98 -U postgres -d postgres
七、验证结果
# 监听
ss -lntp | grep 5432
# 0.0.0.0:5432 和 [::]:5432 都在监听
# 走 TCP + scram 认证实测
PGPASSWORD='ugDj%sFhymtDvezf' /usr/pgsql-18/bin/psql -h 192.168.6.98 -U postgres -Atc "SELECT version();"
# PostgreSQL 18.6 on x86_64-pc-linux-gnu ...
八、排查要点
服务/状态
systemctl status postgresql-18
ss -lntp | grep 5432
ps -ef | grep 'postgres -D'
日志
-
默认日志走 stderr,被 systemd 接住:
journalctl -u postgresql-18 -f
数据目录里就是配置本体
-
postgresql.conf、pg_hba.conf、PG_VERSION 都在
/apps/works/data/ -
改完配置要重载或重启:
systemctl reload postgresql-18(部分参数要 restart)
几个容易踩的坑
-
数据目录是
/apps/works/data,靠的是 systemd override 改的 PGDATA。如果删了/etc/systemd/system/postgresql-18.service.d/override.conf再daemon-reload,服务会回到默认/var/lib/pgsql/18/data,表现为"起不来的库"或空库。 -
SELinux 是 Enforcing。以后如果重建/搬数据目录到新路径,得重新跑
semanage fcontext+restorecon,否则 postgres 进程读不了数据文件,journalctl 里是 Permission denied。 -
密码带特殊字符(% #),shell 里写 psql 命令要用单引号包住或走环境变量 PGPASSWORD,别直接裸写。
-
版本升级不能靠直接替换数据目录,18 的目录只能用 18 读。跨大版本要 pg_upgrade。
-
对外是 0.0.0.0/0 全开,测试没问题,上生产前要收窄网段。
九、常用命令速查
# 以 postgres 身份进库(本地 peer 免密) su - postgres -c psql # 改密码 su - postgres -c "psql -c \"ALTER USER postgres PASSWORD '新密码';\"" # 备份(pg_dump 单库) su - postgres -c "/usr/pgsql-18/bin/pg_dump -Fc -f /tmp/db.dump 库名" # 重启/重载 systemctl restart postgresql-18 systemctl reload postgresql-18

您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏