说明
Rocky Linux 8 与 CentOS 8 / RHEL 8 同源,包管理使用 dnf(命令可理解为 yum 的升级版,二者兼容)。本文选择 PostgreSQL 17.11 的源码 tar.gz 包进行编译安装,流程与早期版本大体一致,但依赖安装、默认认证方式等细节在 17 上有若干变化(已在文中标注)。
开始安装
1、下载安装包
直接从 PostgreSQL 官方 source 下载(file browser / FTP),建议选择不带 beta、rc 标识的最新稳定补丁版本。
# 官方源码下载地址
https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.gz
# 或在服务器上直接下载
[root@rocky src]# wget https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.gz
#阿里云镜像更快
[root@rocky src]# wget https://mirrors.aliyun.com/postgresql/source/v17.11/postgresql-17.11.tar.gz
2、上传并解压
将安装包上传至 /usr/local/src 后解压。
[root@rocky src]# tar xvf postgresql-17.11.tar.gz
3、安装依赖
Rocky Linux 8 使用 dnf 安装编译所需的依赖包:
[root@rocky src]# dnf -y install gcc gcc-c++ make bison flex \
perl perl-devel perl-ExtUtils-Embed \
readline-devel zlib-devel openssl-devel pam-devel \
libxml2-devel libxslt-devel openldap-devel python3-devel \
systemd-devel
# 可选:如需 ICU 排序/国际化支持,追加安装
[root@rocky src]# dnf -y install libicu-devel
[root@rocky src]# dnf -y install gcc gcc-c++ make cmake \
bison flex \
gzip bzip2 tar lz4 lz4-devel libzstd-devel \
perl perl-devel perl-ExtUtils-Embed perl-ExtUtils-MakeMaker \
readline-devel zlib-devel pam pam-devel \
libxml2 libxml2-devel libxslt libxslt-devel \
openldap-devel python3-devel openssl openssl-devel \
libicu-devel systemd-devel tcl tcl-devel \
systemtap-sdt-devel docbook-xsl docbook-dtds docbook-style-xsl krb5-devel
[root@rocky src]# dnf -y install gcc gcc-c++ make cmake bison flex gzip bzip2 tar lz4 lz4-devel libzstd-devel perl perl-devel perl-ExtUtils-Embed perl-ExtUtils-MakeMaker readline-devel zlib-devel pam pam-devel libxml2 libxml2-devel libxslt libxslt-devel openldap-devel python3-devel openssl openssl-devel libicu-devel systemd-devel tcl tcl-devel systemtap-sdt-devel docbook-xsl docbook-dtds docbook-style-xsl krb5-devel
与 CentOS 7 的差异:CentOS 7 用
yum且 Python 包名为python-devel;Rocky 8 用dnf,Python 3 包名为python3-devel。另外 PostgreSQL 15+ 官方推荐编译时启用 ICU(--with-icu),如需使用请一并安装libicu-devel。
4、configure
configure 用于配置安装及预检查。默认安装到 /usr/local/pgsql:
[root@rocky postgresql-17.11]# ./configure --prefix=/usr/local/pgsql --with-pgport=5432 \
--with-openssl --with-pam --with-ldap --with-libxml --with-libxslt \
--disable-thread-safety --with-blocksize=16 --with-wal-blocksize=16 \
--with-icu
参数说明:
| 参数 | 说明 |
|---|---|
--prefix | 指定数据库安装目录,默认为 /usr/local/pgsql |
--with-pgport | 指定数据库端口号,默认为 5432 |
--with-openssl | 建立 SSL(加密)连接的支持 |
--with-pam | 建立可插入身份验证模块的支持 |
--with-ldap | 使用 LDAP 构建支持身份验证和连接参数查找 |
--with-libxml | 安装 libxml 模块,以支持 SQL/XML |
--with-libxslt | 安装 libxslt 模块,从而使 xml2 模块能执行 xml 的 xsl 转换 |
--disable-thread-safety | 禁用客户端线程安全,可防止 libpq 和 ECPG 程序中的并发线程安全地控制其专用连接句柄 |
--with-blocksize | 设置块的大小,单位 KB,默认值 8KB |
--with-wal-blocksize | 设置 WAL 块的大小,单位 KB,默认值 8KB |
--with-icu | 启用 ICU 国际化支持(PostgreSQL 15+ 推荐,需已安装 libicu-devel) |
或者用下面的命令configure:
[root@rocky postgresql-17.11]# ./configure \
--prefix=/usr/local/pgsql/ \
--with-libxml \
--with-lz4 \
--enable-debug \
--with-perl \
--with-tcl \
--with-gssapi \
--with-pam \
--with-openssl \
--without-ldap \
--with-libxslt \
--enable-dtrace \
--enable-depend \
--enable-cassert \
--with-systemd \
--with-icu
这是一套开发配置 --enable-debug + --enable-cassert 会显著拖慢运行性能,绝不能原样用于生产。生产版建议裁剪后:
./configure \
--prefix=/usr/local/pgsql \
--with-libxml --with-libxslt --with-lz4 --with-icu \
--with-gssapi --with-openssl --with-systemd \
--with-perl --with-pam \
--enable-depend
去掉 --enable-debug、--enable-cassert;--enable-dtrace、--with-tcl、--without-ldap 按需取舍。
参数说明:
| 参数 | 作用 | 依赖(是否已装) | 建议 |
|---|---|---|---|
--prefix=/usr/local/pgsql/ | 安装根目录(bin/lib/include/share 都装这里) | — | /usr/local/pgsql ,全流程(PATH、initdb、systemd)必须统一用同一个 |
--with-libxml | 启用 libxml2(XML 类型解析) | libxml2-devel ✓ | 需 XML 功能时开启 |
--with-lz4 | 启用 LZ4 压缩(表 / 备份 / 归档压缩) | lz4-devel ✓ | 生产建议开启 |
--enable-debug | 关闭优化(-O0)+ 调试符号,性能显著下降 | — | 仅开发;生产必须去掉 |
--with-perl | 构建 PL/Perl 过程语言 | perl-devel、ExtUtils-Embed ✓ | 不用 PL/Perl 可去掉 |
--with-tcl | 构建 PL/Tcl 过程语言 | tcl-devel ✓ | 不用 PL/Tcl 可去掉 |
--with-gssapi | GSSAPI/Kerberos 认证与协商 | krb5-devel ✗ 未装 | dnf install -y krb5-devel |
--with-pam | 启用 PAM 认证 | pam-devel ✓ | 用 PAM 认证时开启 |
--with-openssl | SSL/TLS 加密连接、证书 | openssl-devel ✓ | 生产强烈建议开启 |
--without-ldap | 显式禁用 LDAP 认证 | openldap-devel(已装但被禁) | 默认就不启用,这条一般可去掉 |
--with-libxslt | 启用 libxslt(XML 的 XSLT 变换) | libxslt-devel ✓ | 与 libxml 配套,按需 |
--enable-dtrace | DTrace/SystemTap 动态探针 | systemtap-sdt-devel ✓ | 需 dtrace 真正可用否则 make 阶段可能失败;生产一般不需要 |
--enable-depend | 生成依赖跟踪,利于增量编译 | — | 开发建议;生产可留 |
--enable-cassert | 启用断言检查,性能显著下降 | — | 仅开发 / 测试;生产必须去掉 |
--with-systemd | systemd 通知支持(Type=notify) | systemd-devel ✓ | 生产建议开启(配合服务单元) |
--with-icu | ICU 排序 / 区域设置 provider | libicu-devel ✓ | 生产建议开启(PG16+ 更推荐的 collation provider) |
5、安装
# 编译(需要较长等待)
[root@rocky postgresql-17.11]# make
# 安装(make install 需要 root 权限)
[root@rocky postgresql-17.11]# make install
#编译安装一条命令
[root@rocky postgresql-17.11]# gmake world -j2 && gmake install-world -j2
或
[root@rocky postgresql-17.11]# make world -j2 && make install-world -j2
6、创建用户
[root@rocky postgresql-17.11]# userdel -r postgres
[root@rocky postgresql-17.11]# groupdel postgres
[root@rocky postgresql-17.11]# groupadd -g 2000 postgres
[root@rocky postgresql-17.11]# useradd -g 2000 -u 2000 postgres
[root@rocky postgresql-17.11]# passwd postgres
7、创建目录及授权
[root@rocky postgresql-17.11]# mkdir -p /data/pgsql
[root@rocky postgresql-17.11]# chown postgres:postgres /data
[root@rocky postgresql-17.11]# chown -R postgres:postgres /data/pgsql
[root@rocky postgresql-17.11]# chown -R postgres:postgres /usr/local/src/postgresql-17.11
[root@rocky postgresql-17.11]# chown -R postgres:postgres /usr/local/pgsql
8、配置环境变量
[root@rocky postgresql-17.11]# vim /home/postgres/.bash_profile
export PGDATA=/data/pgsql
export PGHOME=/usr/local/pgsql
export PATH=$PGHOME/bin:/usr/sbin:$PATH
export LANG=en_US.UTF-8
# 使配置生效
[root@rocky postgresql-17.11]# source /home/postgres/.bash_profile
9、初始化
切换到 postgres 用户执行初始化:
[root@rocky postgresql-17.11]# su - postgres
[postgres@rocky ~]$ initdb -D $PGDATA -E UTF8 --locale=C -U postgres -W
[root@pgcm2 postgresql-17.11]# su - postgres
[postgres@rocky ~]$ initdb -D $PGDATA -E UTF8 --locale=C -U postgres -W
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "C".
The default text search configuration will be set to "english".
Data page checksums are disabled.
Enter new superuser password: 以123456为例
Enter it again: 再输入一遍123456
fixing permissions on existing directory /data/pgsql ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default "max_connections" ... 100
selecting default "shared_buffers" ... 128MB
selecting default time zone ... Asia/Shanghai
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
initdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
pg_ctl -D /data/pgsql -l logfile start
[postgres@rocky ~]$
PG 17 提示:initdb 会默认生成
pg_hba.conf,本地连接使用trust,远程 TCP 连接默认不开放。若仅本机使用可直接后续启动。
10、配置内核参数
[root@rocky postgresql-17.11]# vim /etc/sysctl.conf
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 50100 64128000 50100 1280
fs.file-max = 7672460
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 1048576
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
[root@rocky postgresql-17.11]# sysctl -p
11、配置用户资源限制
[root@rocky postgresql-17.11]# vim /etc/security/limits.conf
* soft nofile 131072
* hard nofile 131072
* soft nproc 131072
* hard nproc 131072
* soft core unlimited
* hard core unlimited
* soft memlock 50000000
* hard memlock 50000000
12、配置数据库访问策略
[root@rocky postgresql-17.11]# vim /data/pgsql/pg_hba.conf
host all all 0.0.0.0/0 md5
PG 15+ 重要差异:PostgreSQL 15 起默认密码加密方式为 scram-sha-256,
md5仍可用但已不推荐。生产环境建议改为:host all all 0.0.0.0/0 scram-sha-256同时确认
postgresql.conf中password_encryption = scram-sha-256(默认值)。
13、配置数据库参数
[root@rocky postgresql-17.11]# vim /data/pgsql/postgresql.conf
# - Connection Settings -
listen_addresses = '0.0.0.0'
unix_socket_permissions = 0700
# - TCP settings -
tcp_keepalives_idle = 60
tcp_keepalives_interval = 10
tcp_keepalives_count = 10
14、启动数据库
# 切换 postgres 用户启动
[root@rocky postgresql-17.11]# su - postgres
[postgres@rocky ~]$ pg_ctl -D $PGDATA start
# 查看状态
[postgres@rocky ~]$ pg_ctl -D $PGDATA status
# 连接验证
[postgres@rocky ~]$ psql -U postgres -d postgres
15、(可选)配置 systemd 开机自启
PG 源码安装不自动注册服务,如需开机自启可创建 systemd 单元:
[root@rocky postgresql-17.11]# vim /etc/systemd/system/postgresql.service
# /etc/systemd/system/postgresql.service
[Unit]
Description=PostgreSQL 17.11 database server
After=network.target
[Service]
Type=notify
User=postgres
Group=postgres
ExecStart=/usr/local/pgsql/bin/postgres -D /data/pgsql
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
TimeoutSec=120
Restart=on-failure
[Install]
WantedBy=multi-user.target
[root@rocky postgresql-17.11]# systemctl daemon-reload
[root@rocky postgresql-17.11]# systemctl enable --now postgresql
[root@rocky postgresql-17.11]# systemctl status postgresql
[root@rocky postgresql-17.11]# su - postgres -c '/usr/local/pgsql/bin/pg_ctl -D /data/pgsql stop'
[root@rocky postgresql-17.11]# systemctl reset-failed postgresql # 清掉 failed 状态和重启计数(关键)
[root@rocky postgresql-17.11]# systemctl start postgresql
[root@rocky postgresql-17.11]# systemctl status postgresql
[root@rocky postgresql-17.11]# /usr/local/pgsql/bin/psql -U postgres -h 127.0.0.1 -c 'select version();'
# 1) 用 pg_ctl 正常停掉这个手工实例(su 到 postgres 才能发信号)
su - postgres -c '/usr/local/pgsql/bin/pg_ctl -D /data/pgsql stop'
# 2) 确认锁已释放
ls -l /data/pgsql/postmaster.pid # 应报不存在
pgrep -a -u postgres # 应无任何输出
# 3) 交给 systemd 启动
systemctl start postgresql
systemctl status postgresql
# 4) 验证可连接
/usr/local/pgsql/bin/psql -U postgres -h 127.0.0.1 -c 'select version();'
与 CentOS 7 / PG 14 原文的主要差异对照
| 项目 | 原文(CentOS 7 + PG 14) | 本文(Rocky 8 + PG 17.11) |
|---|---|---|
| 包管理器 | yum | dnf |
| Python 开发包 | python-devel | python3-devel |
| 编译工具 | 未含 make | 明确加入 gcc gcc-c++ make bison flex |
| ICU 国际化 | 未启用 | 可选 --with-icu + libicu-devel |
| 密码认证 | md5 | 默认 scram-sha-256,建议用 scram |
| 远程连接默认 | 需手动开 | PG 15+ 默认不开放远程,需 listen_addresses + pg_hba |
| 开机自启 | 未涉及 | 补充 systemd 单元 |
1、创建用户
[root@rocky postgresql-17.11]# userdel -r postgres
[root@rocky postgresql-17.11]# groupdel postgres
[root@rocky postgresql-17.11]# groupadd -g 2000 postgres
[root@rocky postgresql-17.11]# useradd -g 2000 -u 2000 postgres
[root@rocky postgresql-17.11]# passwd postgres
2、创建目录及授权
[root@rocky postgresql-17.11]# mkdir -p /data/pgdata/{data,backups,scripts,archive_wals}
[root@rocky postgresql-17.11]# mkdir -p /data/pgdata/pg_wal
[root@rocky postgresql-17.11]# chown -R postgres:postgres /data/pgdata
[root@rocky postgresql-17.11]# chmod 0700 /data/pgdata
[root@rocky postgresql-17.11]# chown -R postgres:postgres /usr/local/src/postgresql-17.11
3、配置环境变量
[root@rocky postgresql-17.11]# vim /home/postgres/.bash_profile
export PGHOME=/usr/local/pgsql
export PGDATA=/data/pgdata/data
export PGLIB=$PGHOME/lib
export PATH=$PGHOME/bin:/usr/sbin:$PATH
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
# 使配置生效
[root@rocky postgresql-17.11]# source /home/postgres/.bash_profile
4、初始化
切换到 postgres 用户执行初始化:
[root@rocky postgresql-17.11]# su - postgres
[root@rocky postgresql-17.11]# su - postgres
[root@rocky pgdata]# su - postgres
[postgres@rocky ~]$ initdb -D /data/pgdata/data -X /data/pgdata/pg_wal -W
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
Data page checksums are disabled.
Enter new superuser password:
Enter it again:
fixing permissions on existing directory /data/pgdata/data ... ok
fixing permissions on existing directory /data/pgdata/pg_wal ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default "max_connections" ... 100
selecting default "shared_buffers" ... 128MB
selecting default time zone ... Asia/Shanghai
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
initdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
pg_ctl -D /data/pgdata/data -l logfile start
[postgres@rocky ~]$
PG 17 提示:initdb 会默认生成
pg_hba.conf,本地连接使用trust,远程 TCP 连接默认不开放。若仅本机使用可直接后续启动。
5、配置内核参数
[root@rocky postgresql-17.11]# vim /etc/sysctl.conf
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 50100 64128000 50100 1280
fs.file-max = 7672460
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 1048576
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
[root@rocky postgresql-17.11]# sysctl -p
6、配置用户资源限制
[root@rocky postgresql-17.11]# vim /etc/security/limits.conf
* soft nofile 131072
* hard nofile 131072
* soft nproc 131072
* hard nproc 131072
* soft core unlimited
* hard core unlimited
* soft memlock 50000000
* hard memlock 50000000
7、配置数据库访问策略
[root@rocky postgresql-17.11]# vim /data/pgdata/data/pg_hba.conf
host all all 0.0.0.0/0 md5
PG 15+ 重要差异:PostgreSQL 15 起默认密码加密方式为 scram-sha-256,
md5仍可用但已不推荐。生产环境建议改为:host all all 0.0.0.0/0 scram-sha-256同时确认
postgresql.conf中password_encryption = scram-sha-256(默认值)。
8、配置数据库参数
[root@rocky postgresql-17.11]# vim /data/pgdata/data/postgresql.conf
# - Connection Settings -
listen_addresses = '0.0.0.0'
unix_socket_permissions = 0700
# - TCP settings -
tcp_keepalives_idle = 60
tcp_keepalives_interval = 10
tcp_keepalives_count = 10
9、启动数据库
# 切换 postgres 用户启动
[root@rocky postgresql-17.11]# su - postgres
[postgres@rocky ~]$ pg_ctl -D $PGDATA start
# 查看状态
[postgres@rocky ~]$ pg_ctl -D $PGDATA status
# 连接验证
[postgres@rocky ~]$ psql -U postgres -d postgres
10、(可选)配置 systemd 开机自启
PG 源码安装不自动注册服务,如需开机自启可创建 systemd 单元:
[root@rocky postgresql-17.11]# vim /etc/systemd/system/postgresql.service
# /etc/systemd/system/postgresql.service
[Unit]
Description=PostgreSQL 17.11 database server
After=network.target
[Service]
Type=notify
User=postgres
Group=postgres
ExecStart=/usr/local/pgsql/bin/postgres -D /data/pgdata/data
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
TimeoutSec=120
Restart=on-failure
[Install]
WantedBy=multi-user.target
[root@rocky postgresql-17.11]# systemctl daemon-reload
[root@rocky postgresql-17.11]# systemctl enable --now postgresql
[root@rocky postgresql-17.11]# systemctl status postgresql
[root@rocky postgresql-17.11]# su - postgres -c '/usr/local/pgsql/bin/pg_ctl -D /data/pgdata/data stop'
[root@rocky postgresql-17.11]# systemctl reset-failed postgresql # 清掉 failed 状态和重启计数(关键)
[root@rocky postgresql-17.11]# systemctl start postgresql
[root@rocky postgresql-17.11]# systemctl status postgresql
[root@rocky postgresql-17.11]# /usr/local/pgsql/bin/psql -U postgres -h 127.0.0.1 -c 'select version();'
# 1) 用 pg_ctl 正常停掉这个手工实例(su 到 postgres 才能发信号)
su - postgres -c '/usr/local/pgsql/bin/pg_ctl -D /data/pgdata/data stop'
# 2) 确认锁已释放
ls -l /data/pgdata/data/postmaster.pid # 应报不存在
pgrep -a -u postgres # 应无任何输出
# 3) 交给 systemd 启动
systemctl start postgresql
systemctl status postgresql
# 4) 验证可连接
/usr/local/pgsql/bin/psql -U postgres -h 127.0.0.1 -c 'select version();'
[root@rocky data]# /usr/local/pgsql/bin/psql -U postgres -h 127.0.0.1 -c 'select version();'
version
----------------------------------------------------------------------------------------------------------
PostgreSQL 17.11 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-30), 64-bit
(1 row)
[root@rocky data]# /usr/local/pgsql/bin/psql -U postgres -h 127.0.0.1
psql (17.11)
Type "help" for help.
postgres=#
postgres=#
postgres=# \l
List of databases
Name | Owner | Encoding | Locale Provider | Collate | Ctype | Locale | ICU Rules | Access privileges
-----------+----------+----------+-----------------+-------------+-------------+--------+-----------+-----------------------
postgres | postgres | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | |
template0 | postgres | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
(3 rows)
postgres=#

徐万新之路

