Rocky Linux 8.10 编译安装 PostgreSQL 17.11
一、下载源码包
bash
https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.gz
1.1系统初始化和优化配置
bash
#关闭防火墙和SELinux等
#内核参数优化
# vim /etc/sysctl.conf
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.shmmni = 4096
kernel.sem = 50100 64128000 50100 1280
fs.file-max = 7672460
net.ipv4.ip_local_port_range = 9000 65000
net.core.rmem_default = 1048576
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
# sysctl -p
# vim /etc/security/limits.conf
* - nofi1e 100000
* - nproc 100000
* - mem1ock 60000
二、安装依赖包
bash
#通过 devtoolset 安装 GCC 12
# 1. 启用 CRB 仓库
dnf config-manager --set-enabled powertools
# 2. 安装 SCL
dnf install -y scl-utils
# 3. 安装 gcc-toolset-12 主包(包含 gcc 和 g++)
dnf install -y gcc-toolset-12
# 4. 临时启用
[root@rocky8 ~]#scl enable gcc-toolset-12 bash
# 5. 验证
[root@rocky8 ~]#scl enable gcc-toolset-12 "gcc --version"
gcc (GCC) 12.2.1 20221121 (Red Hat 12.2.1-7)
#永久启用(写入 ~/.bashrc)
echo "source scl_source enable gcc-toolset-12" >> ~/.bashrc
source ~/.bashrc
#后续所有编译操作前必须激活高版本 GCC:
[root@rocky8 ~]#scl enable gcc-toolset-12 bash
三、安装编译依赖
bash
# 以 root 用户执行(激活高版本 GCC 后)
scl enable gcc-toolset-12 bash
# 基础编译工具
[root@rocky8 ~]#dnf install -y gcc gcc-c++ make readline-devel zlib-devel flex bison libxml2-devel libxslt-devel openssl-devel perl perl-devel perl-ExtUtils-Embed python3-devel tcl-devel tcl openldap-devel pam-devel systemd-devel uuid-devel libicu-devel numactl-devel cracklib-devel cracklib-dicts gettext libzstd-devel lz4-devel libcurl-devel libuuid-devel
# 验证关键依赖
[root@rocky8 ~]#rpm -q readline-devel zlib-devel flex bison libxml2-devel libxslt-devel openssl-devel perl-devel perl-ExtUtils-Embed python3-devel tcl-devel openldap-devel pam-devel systemd-devel uuid-devel libicu-devel libzstd-devel libuuid-devel
四、下载 PostgreSQL 17.11 源码
bash
[root@rocky8 ~]#cd /usr/local/src
[root@rocky8 src]#dnf -y install aria2
[root@rocky8 src]#aria2c -x 16 -s 16 -c -k 1M --max-download-limit=0 https://ftp.postgresql.org/pub/source/v17.11/postgresql-17.11.tar.gz
[root@rocky8 src]#ll
total 27732
-rw-r--r-- 1 root root 28397423 Aug 18 12:46 postgresql-17.11.tar.gz
[root@rocky8 src]#tar xf postgresql-17.11.tar.gz
[root@rocky8 src]#cd postgresql-17.11/
五、configure 配置
bash
#激活高版本 GCC
[root@rocky8 postgresql-17.11]#scl enable gcc-toolset-12 bash
[root@rocky8 postgresql-17.11]#gcc --version
gcc (GCC) 12.2.1 20221121 (Red Hat 12.2.1-7)
5.1执行 configure
bash
[root@rocky8 postgresql-17.11]#./configure \
--prefix=/apps/pgsql \
--with-pgport=5432 \
--with-openssl \
--with-perl \
--with-python \
--with-tcl \
--with-libxml \
--with-libxslt \
--with-ldap \
--with-pam \
--with-systemd \
--with-uuid=e2fs \
--enable-nls \
--with-icu \
--with-zstd \
--with-lz4 \
--with-blocksize=32 \
CC=gcc \
CXX=g++
六、编译与安装
bash
[root@rocky8 postgresql-17.11]#make -j 2 world
[root@rocky8 postgresql-17.11]#make install-world
# 安装 contrib 扩展
[root@rocky8 postgresql-17.11]#cd contrib
[root@rocky8 contrib]#make -j 2
[root@rocky8 contrib]#make install
[root@rocky8 contrib]#cd ..
[root@rocky8 postgresql-17.11]#
# 验证安装路径
[root@rocky8 postgresql-17.11]#ls /apps/pgsql/
bin include lib share
# 验证版本
[root@rocky8 postgresql-17.11]#/apps/pgsql/bin/psql --version
psql (PostgreSQL) 17.11
[root@rocky8 postgresql-17.11]#/apps/pgsql/bin/postgres --version
postgres (PostgreSQL) 17.11
七、创建用户、目录、初始化
7.1创建 postgres 用户
bash
#PostgreSQL默认不支持以root身份启动服务,虽然也可修改源码实现root启动,但基于安全考虑不建议,因此必须创建一个用于启动PostgrepSQL的普通用户
[root@rocky8 postgresql-17.11]#groupadd -g 2000 postgres
[root@rocky8 postgresql-17.11]#useradd -u 2000 -g postgres -s /bin/bash -d /home/postgres -m postgres
[root@rocky8 postgresql-17.11]#id postgres
uid=2000(postgres) gid=2000(postgres) groups=2000(postgres)
# 设置密码
[root@rocky8 postgresql-17.11]#echo "PostgreSQL@2026." | passwd --stdin postgres
7.2创建数据/日志/归档目录并授权
bash
[root@rocky8 postgresql-17.11]#mkdir -p /apps/pgsql/{data,log,archive,backup}
[root@rocky8 postgresql-17.11]#mkdir -p /apps/pgsql/data/pg_wal
[root@rocky8 postgresql-17.11]#chown -R postgres:postgres /apps/pgsql
[root@rocky8 postgresql-17.11]#chown -R postgres:postgres /apps/pgsql/data
[root@rocky8 postgresql-17.11]#chmod 700 /apps/pgsql/data
[root@rocky8 postgresql-17.11]#chmod 700 /apps/pgsql/log
[root@rocky8 postgresql-17.11]#chmod 700 /apps/pgsql/archive
[root@rocky8 postgresql-17.11]#chmod 700 /apps/pgsql/backup
7.3设置环境变量
bash
[root@rocky8 postgresql-17.11]#vim /etc/profile.d/pgsql.sh
# PostgreSQL 17.11
export PGHOME=/apps/pgsql
export PGDATA=/apps/pgsql/data
export PATH=$PGHOME/bin/:$PATH
export PGUSER=postgres
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
export MANPATH=/apps/pgsql/share/man:$MANPATH
export PGSYSLOGDIR=/apps/pgsql/log
[root@rocky8 postgresql-17.11]# . /etc/profile.d/pgsql.sh
[root@rocky8 postgresql-17.11]#su - postgres
[postgres@rocky8 ~]$psql --version
psql (PostgreSQL) 17.11
八、初始化数据库
bash
# PG17 默认数据校验和需显式开启
[postgres@rocky8 ~]$initdb -D $PGDATA -E UTF8 -U postgres --locale=C --data-checksums --auth-local=scram-sha-256 --auth-host=scram-sha-256 -W
九、配置文件与 systemd 服务
9.1编辑 postgresql.conf
bash
[root@rocky8 ~]#vim /apps/pgsql/data/postgresql.conf
listen_addresses = '127.0.0.1'
port = 5432
max_connections = 200
shared_buffers = 256MB
work_mem = 64MB
maintenance_work_mem = 127.0.0.1
effective_cache_size = 2GB
huge_pages = try
wal_level = replica
max_wal_size = 2GB
min_wal_size = 1GB
checkpoint_completion_target = 0.9
wal_compression = zstd
archive_mode = on
archive_command = 'cp %p /apps/pgsql/archive/%f'
max_parallel_workers = 8
max_parallel_workers_per_gather = 4
max_parallel_maintenance_workers = 4
parallel_leader_participation = on
jit = on
jit_above_cost = 100000
jit_inline_above_cost = 50000
jit_optimize_above_cost = 500000
logging_collector = on
log_directory = '/apps/pgsql/log'
log_filename = 'postgresql-%Y-%m-%d.log'
log_statement = 'ddl'
log_min_duration_statement = 1000
shared_preload_libraries = 'pg_stat_statements'
9.2编辑 pg_hba.conf
bash
[root@rocky8 ~]#vim /apps/pgsql/data/pg_hba.conf
local all all scram-sha-256
host all all 127.0.0.1/32 scram-sha-256
host all all ::1/128 scram-sha-256
local replication all scram-sha-256
host replication all 127.0.0.1/32 scram-sha-256
host replication all ::1/128 scram-sha-256
9.3创建 systemd 服务
bash
[root@rocky8 ~]#vim /etc/systemd/system/postgresql.service
[Unit]
Description=PostgreSQL 17.11 Database Server
Documentation=man:postgres(1)
After=network.target
[Service]
Type=notify
User=postgres
Group=postgres
ExecStart=/apps/pgsql/bin/postgres -D /apps/pgsql/data
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=0
Environment=PGDATA=/apps/pgsql/data
Environment=PGSYSLOGDIR=/apps/pgsql/log
LimitNOFILE=65536
LimitNPROC=infinity
[Install]
WantedBy=multi-user.target
# 重载并启用
[root@rocky8 ~]#sudo systemctl daemon-reload
[root@rocky8 ~]#sudo systemctl enable --now postgresql.service
[root@rocky8 ~]#sudo systemctl status postgresql.service
[root@rocky8 ~]#netstat -tnlp | grep 5432
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 85935/postgres
十、验证 + 生产调优
10.1基础验证
bash
# 本地连接
[root@rocky8 ~]#su - postgres
PostgreSQL 17.11 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 12.2.1 20221121 (Red Hat 12.2.1-7), 64-bit
(1 row)
# 远程连接
[postgres@rocky8 ~]$psql -h 127.0.0.1 -p 5432 -U postgres
Password for user postgres:
psql (17.11)
Type "help" for help.
postgres=# SHOW server_version;
server_version
----------------
17.11
# 端口监听
[postgres@rocky8 ~]$ss -tlnp | grep 5432
LISTEN 0 400 127.0.0.1:5432 0.0.0.0:* users:(("postgres",pid=85935,fd=7))
10.2PG17 核心特性验证
bash
postgres=# SHOW jit;
jit
-----
on
postgres=# SHOW max_parallel_workers;
max_parallel_workers
----------------------
8
postgres=# SHOW parallel_leader_participation;
parallel_leader_participation
-------------------------------
on
postgres=# SHOW data_checksums;
data_checksums
----------------
on
postgres=# CREATE INDEX idx_users_name_zh ON users (name COLLATE "zh-Hans-CN-x-icu");
postgres=# EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM users ORDER BY name;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------
--------
Index Scan using idx_users_name_zh on users (cost=0.15..95.31 rows=3410 width=68) (actual time=0.005..0.005 rows=0 l
oops=1)
Buffers: shared hit=1
Planning:
Buffers: shared hit=2
Planning Time: 0.085 ms
Execution Time: 0.019 ms
postgres=# SHOW wal_compression;
wal_compression
-----------------
zstd
postgres=# SELECT uuid_generate_v4();
uuid_generate_v4
--------------------------------------
da1ddcbf-c0ea-41bd-9c2a-4e25f7cccb62
postgres=# SELECT gen_random_uuid();
gen_random_uuid
--------------------------------------
231baac1-63b7-47da-8c96-98f6145343c6
postgres=# SHOW huge_pages;
huge_pages
------------
try
10.3扩展安装
bash
#-- 安装常用扩展
postgres=# CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
postgres=# CREATE EXTENSION IF NOT EXISTS pgcrypto;
postgres=# CREATE EXTENSION IF NOT EXISTS hstore;
postgres=# CREATE EXTENSION IF NOT EXISTS pg_trgm;
postgres=# CREATE EXTENSION IF NOT EXISTS unaccent;
#安装 pgvector
[root@rocky8 postgresql-17.11]#cd /tmp
[root@rocky8 tmp]#sudo dnf install -y git
[root@rocky8 tmp]#git --version
git version 2.43.7
[root@rocky8 tmp]#git clone --branch v0.8.0 https://github.com/pgvector/pgvector.git
[root@rocky8 tmp]#cd pgvector
[root@rocky8 pgvector]#
[root@rocky8 pgvector]#export PG_CONFIG=/apps/pgsql/bin/pg_config
[root@rocky8 pgvector]#make
[root@rocky8 pgvector]#sudo --preserve-env=PG_CONFIG make install
[root@rocky8 pgvector]#ls -l /apps/pgsql/share/extension/vector.control
-rw-r--r-- 1 root root 145 Aug 18 22:20 /apps/pgsql/share/extension/vector.control
postgres=# CREATE EXTENSION IF NOT EXISTS vector;
postgres=# SELECT extname, extversion FROM pg_extension WHERE extname = 'vector';
extname | extversion
---------+------------
vector | 0.8.0
postgres=# \dx
List of installed extensions
Name | Version | Schema | Description
--------------------+---------+------------+------------------------------------------------------------------------
hstore | 1.8 | public | data type for storing sets of (key, value) pairs
pg_stat_statements | 1.11 | public | track planning and execution statistics of all SQL statements executed
pg_trgm | 1.6 | public | text similarity measurement and index searching based on trigrams
pgcrypto | 1.3 | public | cryptographic functions
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
unaccent | 1.1 | public | text search dictionary that removes accents
uuid-ossp | 1.1 | public | generate universally unique identifiers (UUIDs)
vector | 0.8.0 | public | vector data type and ivfflat and hnsw access methods
| 扩展名称 | 版本 | 所属Schema | 功能描述 |
|---|---|---|---|
| hstore | 1.8 | public | 存储键值对集合的数据类型 |
| pg_stat_statements | 1.11 | public | 追踪所有SQL语句的规划和执行统计信息 |
| pg_trgm | 1.6 | public | 基于三元语法的文本相似度测量和索引搜索 |
| pgcrypto | 1.3 | public | 提供加密相关函数 |
| plpgsql | 1.0 | pg_catalog | PL/pgSQL 过程语言支持 |
| unaccent | 1.1 | public | 用于移除重音符号的全文搜索词典 |
| uuid-ossp | 1.1 | public | 生成符合标准的通用唯一标识符(UUID) |
| vector | 0.8.0 | public | 向量数据类型,支持IVFFlat和HNSW索引访问方法(pgvector向量扩展) |
关于 pgvector v0.8.0 的核心能力
支持的向量类型
- 标准
vector类型:最高支持 16000 维单精度向量 halfvec类型:最高支持 16000 维半精度向量,显著降低存储占用bit二进制向量:最高支持 64000 位sparsevec稀疏向量:最高支持 16000 个非零元素
距离运算符
<->:L2欧氏距离<#>:负内积<=>:余弦距离<+>:L1曼哈顿距离<~>:汉明距离(仅二进制向量)<%>:雅卡尔距离(仅二进制向量)
索引支持
- HNSW 多层图索引:查询速度更快、召回率更优,无需预训练,可直接创建
- IVFFlat 倒排索引:构建速度更快、内存占用更低,适合大规模向量场景
进阶特性
- 支持迭代索引扫描优化高过滤条件下的召回率
- 原生兼容 PostgreSQL 所有 ACID 特性、事务、JOIN 操作和流复制
- 可以与 PostgreSQL 全文检索能力结合实现混合语义搜索