PostgreSQL编译安装
Eave
2025.11.13
1、相关依赖安装
yum install -y libicu-devel flex readline-devel perl-CPAN libuuid-devel python3-devel
yum install -y readline-devel zlib-devel flex bison libxml2-devel libxslt-devel openssl-devel pam-devel libedit-devel selinux-policy-devel systemd-devel
2、下载PostgreSQL
下载地址:https://www.postgresql.org/ftp/source
wget "https://ftp.postgresql.org/pub/source/v18.1/postgresql-18.1.tar.gz"
3、编译安装
tar -zxf postgresql-18.1.tar.gz
cd postgresql-18.1/
./configure --prefix=/usr/local/postgres --with-openssl --with-libxml --with-libxslt --with-icu --with-pam --with-systemd --with-ssl=openssl --with-uuid=e2fs --with-perl
make -j$(nproc) && make install
4、初始化PostgreSQL数据目录
创建PostgreSQL启动用户
useradd -r -s /sbin/nologin postgres
创建数据目录
mkdir -p /var/lib/postgres/data
chown -R postgres:postgres /var/lib/postgres
创建日志目录
mkdir -p /var/log/postgres
chown -R postgres:postgres /var/log/postgres
以postgres用户身份初始化数据库集群
sudo -u postgres /usr/local/postgres/bin/initdb -D /var/lib/postgres/data
5、创建启动服务文件
编辑/usr/lib/systemd/system/postgres.service
[Unit]
Description=PostgreSQL Database Server
After=syslog.target
After=network.target
Requires=network.target
[Service]
Type=forking
# 根据实际安装路径调整以下参数
User=postgres
Group=postgres
# 主程序路径
ExecStart=/usr/local/postgres/bin/pg_ctl start -D /var/lib/postgres/data
ExecStop=/usr/local/postgres/bin/pg_ctl stop -D /var/lib/postgres/data -m fast
ExecReload=/usr/local/postgres/bin/pg_ctl reload -D /var/lib/postgres/data
# 重启策略
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
启动PostgreSQL
systemctl start postgres
6、设置开机启动
systemctl enable postgres
systemctl daemon-reload
7、修改配置
修改以下配置/var/lib/postgres/data/postgresql.conf
# ============ 基础配置 ============
# 监听所有网络接口,生产环境建议改为具体IP
listen_addresses = '*'
# 服务端口号
port = 5432
# 最大连接数,根据实际内存调整(每个连接约消耗2-4MB)
max_connections = 1000
# 密码存储算法:scram-sha-256 比 md5 更安全
password_encryption = scram-sha-256
# 数据库所有者是否可信任
row_security = on
# ============ Unix Socket 配置 ============
# Unix socket 目录,使用内存文件系统可提升性能
unix_socket_directories = '/dev/shm'
# Unix socket 文件权限
unix_socket_permissions = 0777
# Unix socket 所属组(空表示使用默认组)
unix_socket_group = ''
# ============ 字符集配置 ============
# 客户端默认字符集:UTF8 完整支持 Unicode 包括 Emoji
client_encoding = UTF8
# 服务器端字符集:UTF8 支持所有 Unicode 字符(initdb 时固定,不可动态修改)
server_encoding = UTF8
# 字符排序和字符分类语言环境,必须为 UTF-8 才能正确处理 Emoji
lc_collate = 'zh_CN.UTF-8'
lc_ctype = 'zh_CN.UTF-8'
# 消息显示语言(不影响数据存储 中文:zh_CN.UTF-8)
lc_messages = 'en_US.UTF-8'
# 货币、数字、时间格式(不影响 Emoji 支持)
lc_monetary = 'zh_CN.UTF-8'
lc_numeric = 'zh_CN.UTF-8'
lc_time = 'zh_CN.UTF-8'
# 数据库时区
timezone = 'Asia/Hong_Kong'
# 默认事务隔离级别,生产环境推荐 READ COMMITTED
default_transaction_isolation = 'read committed'
# ============ 连接与超时配置 ============
# 客户端连接超时(秒),超过此时间未完成认证则断开
authentication_timeout = 60
# TCP keepalive 配置,检测死连接
tcp_keepalives_idle = 60 # 空闲60秒后开始探测
tcp_keepalives_interval = 10 # 探测间隔10秒
tcp_keepalives_count = 6 # 连续失败6次后断开
# 空闲事务超时(毫秒),防止长事务持有锁
idle_in_transaction_session_timeout = 60000
# 语句执行超时(毫秒),0表示无限制
statement_timeout = 0
# ============ 内存配置 ============
# 共享缓冲区大小,SSD 环境建议设为物理内存的 25%-40%(这里是8GB示例)
shared_buffers = 3GB
# 工作内存,用于排序、哈希等操作,每个会话独立
work_mem = 8MB
# 维护操作内存,用于 VACUUM、CREATE INDEX 等
maintenance_work_mem = 512MB
# 操作系统缓存大小,建议设为 shared_buffers 的 1-2 倍
effective_cache_size = 6GB
# ============ 检查点与 WAL 配置 ============
# 检查点间隔时间,SSD 可适当延长
checkpoint_timeout = 30min
# 检查点期间同时写入的 WAL 最大量
checkpoint_completion_target = 0.9
# 触发检查点的 WAL 最大大小,SSD 可适当调大
max_wal_size = 8GB
# 最小 WAL 大小
min_wal_size = 2GB
# WAL 日志缓冲区大小
wal_buffers = 16MB
# WAL 级别,至少 replica 才能做主从复制
wal_level = replica
# 事务提交时 WAL 刷盘策略
synchronous_commit = on
# ============ 查询优化器配置(SSD 优化重点) ============
# 启用并行查询
max_parallel_workers_per_gather = 4
max_parallel_workers = 8
# 启用 JIT 编译(如需安装 llvm)
jit = off
# ===== SSD 核心优化参数 =====
# 随机页面成本:SSD 随机读取远快于 HDD,从默认 4.0 降到 1.1
# 这会让优化器更倾向于使用索引扫描而非全表扫描
random_page_cost = 1.1
# 顺序页面成本:SSD 顺序读取也比 HDD 快,从默认 1.0 降到 0.9
seq_page_cost = 0.9
# 有效磁盘缓存成本:SSD 缓存更大,适当降低
effective_io_concurrency = 200
# 维护操作并行度,利用 SSD 高 IOPS 加速维护任务
maintenance_io_concurrency = 200
# 并行顺序扫描每个 worker 的磁盘 I/O 并发数
parallel_leader_participation = on
# ============ 日志配置 ============
# 启用日志收集器
logging_collector = on
# 日志目录
log_directory = '/var/log/postgres'
# 日志文件名格式
log_filename = 'postgres-%Y%m%d.log'
# 日志文件保留时间
log_rotation_age = 30d
# 日志轮转时是否重命名旧文件
log_truncate_on_rotation = on
# 日志行前缀格式
log_line_prefix = '%m [%p] %q%u@%d '
# 日志时区
log_timezone = 'Asia/Hong_Kong'
# ============ 日志级别控制 ============
log_min_messages = warning
log_min_error_statement = error
log_min_duration_statement = 1000
# 记录连接断开日志
log_disconnections = on
# 记录连接建立日志
log_connections = on
# ============ 统计信息与自动维护 ============
autovacuum = on
autovacuum_naptime = 1min
autovacuum_vacuum_threshold = 50
autovacuum_analyze_threshold = 50
autovacuum_vacuum_scale_factor = 0.1
autovacuum_analyze_scale_factor = 0.1
# SSD 优化:提高 autovacuum 并行度,加速清理
autovacuum_max_workers = 5
autovacuum_work_mem = 256MB
# ============ 监控扩展配置 ============
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.max = 10000
pg_stat_statements.track = all
修改密码认证方式/var/lib/postgres/data/pg_hba.conf
host all all 0.0.0.0/0 scram-sha-256
使配置生效
systemctl reload postgresql
8、加入环境变量
编辑/etc/profile文件
在/etc/profile文件末尾追加一下内容
# postgres
export PATH=$PATH:/usr/local/postgres/bin
执行一下命令使配置生效
source /etc/profile
9、修改密码
进入PostgreSQL终端
psql -h localhost -U postgres
-- 修改当前用户的密码
ALTER USER current_user PASSWORD '123456';
-- 修改指定用户的密码
ALTER USER username PASSWORD '123456';
-- 查看用户信息和密码
SELECT rolname, rolpassword FROM pg_authid;