第一部分
前期准备
以 root 用户登录 或使用
sudo
权限。安装必需的开发工具和库:编译 PostgreSQL 需要编译器、库文件等。
bash
yum groupinstall -y "Development Tools" yum install -y epel-release yum install -y \ readline-devel \ zlib-devel \ openssl-devel \ systemd-devel \ # 如果需要systemd支持 libxml2-devel \ libxslt-devel \ openldap-devel \ pam-devel \ tcl-devel
创建专用系统用户和组(如果不存在):
bash
groupadd postgres useradd -g postgres postgres
选择安装目录和源目录:
源代码目录:
/usr/local/src/postgresql-15.7
安装目录:
/usr/local/pgsql/15
(推荐,便于多版本管理)数据目录:
/pgdata/15/data
(推荐将数据目录独立出来,通常放在更大的磁盘分区上)
创建目录并设置权限:
bash
mkdir -p /usr/local/src/postgresql-15.7 mkdir -p /usr/local/pgsql/15 mkdir -p /pgdata/15/data chown -R postgres:postgres /usr/local/pgsql /pgdata
步骤 1:下载并解压源代码
进入源目录并下载:
bash
cd /usr/local/src # 使用 wget 下载源代码包 (以 15.7 为例,请从官网 https://www.postgresql.org/ftp/source/ 确认最新小版本号) wget https://ftp.postgresql.org/pub/source/v15.7/postgresql-15.7.tar.bz2
解压源代码:
bash
tar -xvf postgresql-15.7.tar.bz2 -C /usr/local/src/ cd /usr/local/src/postgresql-15.7
步骤 2:配置编译选项 (Configure)
这是最关键的一步,./configure
脚本会检查系统环境并生成 Makefile。
基本配置(指定安装路径):
bash
./configure --prefix=/usr/local/pgsql/15
常用功能选项配置(根据需求添加):
bash
./configure --prefix=/usr/local/pgsql/15 \ --with-openssl \ # 启用SSL加密连接 --with-systemd \ # 集成systemd支持(生成service文件) --with-libxml \ # 启用XML支持 --with-libxslt \ # 启用XSLT支持 --with-zlib \ # 启用zlib压缩支持 --with-pam \ # 启用PAM认证 --with-ldap \ # 启用LDAP认证 --with-tcl \ # 启用Tcl过程语言 --with-perl \ # 启用Perl过程语言(需已安装Perl开发包) --with-python \ # 启用Python过程语言(需已安装Python开发包) --with-uuid=e2fs # 启用UUID功能,使用e2fsprogs的库 --enable-debug # 启用调试符号(生产环境通常省略)
运行配置脚本:执行您选择好的
configure
命令。脚本会检查依赖并输出总结。请仔细查看输出,确认您需要的功能都显示为yes
。如果出现no
,通常是缺少对应的-devel
包。
步骤 3:编译 (Make) 和安装 (Make Install)
编译源代码:使用
make
命令开始编译,-j
参数指定并行编译的 job 数,可以显著加快速度(通常为核心数或核心数+1)。bash
make -j $(nproc) # $(nproc) 会自动获取CPU核心数 # 或者手动指定,例如 make -j 4
这个过程可能需要一段时间。
运行回归测试(可选,但推荐):
bash
make check
注意:运行测试可能需要额外权限,可能需以
postgres
用户运行sudo -u postgres make check
。请查看输出日志确认测试是否通过。安装到指定目录:
bash
make install
这会将所有必要的文件复制到
--prefix
指定的目录(/usr/local/pgsql/15
)。
步骤 4:配置环境变量
为了让系统能找到 psql
、pg_ctl
等命令,需要将安装目录的 bin
和 lib
目录添加到环境变量。
为所有用户创建全局配置文件:
bash
vi /etc/profile.d/pgsql.sh
添加以下内容:
bash
export PGHOME=/usr/local/pgsql/15 export PGDATA=/pgdata/15/data export PATH=$PGHOME/bin:$PATH export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH export MANPATH=$PGHOME/share/man:$MANPATH
使环境变量立即生效:
bash
source /etc/profile.d/pgsql.sh
步骤 5:初始化数据库簇
切换到
postgres
用户:bash
su - postgres
初始化数据库簇(使用
initdb
):bash
initdb -D $PGDATA -E UTF8 --locale=C -U postgres -W
-D
: 指定数据目录位置。-E
: 设置默认数据库编码(UTF8)。--locale=C
: 使用 C 区域设置,避免排序规则带来的性能问题和复杂性。-U
: 指定数据库超级用户名。-W
: 提示为超级用户设置密码。
(可选)配置
pg_hba.conf
和postgresql.conf
:
您现在可以像使用包安装一样,编辑$PGDATA/pg_hba.conf
和$PGDATA/postgresql.conf
来配置访问权限、监听地址等。
步骤 6:创建 Systemd 服务文件(推荐)
以 root 用户创建服务文件:
bash
vi /etc/systemd/system/postgresql-15.service
添加以下内容(根据您的路径调整):
ini
[Unit] Description=PostgreSQL 15.7 Database Server Documentation=https://www.postgresql.org/docs/15/static/ After=network.target [Service] Type=notify User=postgres Group=postgres Environment=PGDATA=/pgdata/15/data OOMScoreAdjust=-1000 ExecStart=/usr/local/pgsql/15/bin/postgres -D ${PGDATA} ExecReload=/bin/kill -HUP $MAINPID KillMode=mixed KillSignal=SIGINT TimeoutSec=infinity [Install] WantedBy=multi-user.target
重新加载 systemd 并启动服务:
bash
systemctl daemon-reload systemctl start postgresql-15 systemctl enable postgresql-15 # 设置开机自启 systemctl status postgresql-15 # 检查状态
步骤 7:测试安装
检查进程:
bash
ps aux | grep postgres
使用
psql
连接测试:bash
# 切换到 postgres 用户 su - postgres # 连接数据库 psql -U postgres # 在 psql 提示符下运行一个简单查询 SELECT version();
总结
您已经成功通过编译方式安装了 PostgreSQL。关键步骤是:
安装所有必需的
-devel
包。使用
./configure
精心配置编译选项。使用
make -j N
和make install
进行编译和安装。设置环境变量以便系统找到新安装的软件。
以
postgres
用户身份使用initdb
初始化数据目录。创建并启用
systemd
服务以便管理。
编译安装提供了最大的灵活性,但后续的维护(如小版本升级)需要您手动重复编译和安装步骤。
第二部分 postgresql.conf
postgresql.conf
是 PostgreSQL 的主配置文件,控制着数据库实例的所有核心行为。理解其配置项对于性能调优和稳定运行至关重要。以下是主要配置项的详细说明。
配置文件基础
位置:通常在数据目录(
$PGDATA
)下,例如/pgdata/15/data/postgresql.conf
。格式:
参数名 = 值
。#
开头的行是注释。单位:
kB
、MB
、GB
、TB
(千字节、兆字节等,1024为基数)ms
(毫秒),s
(秒),min
(分钟),h
(小时)kBps
(千字节/秒)
生效方式:
修改大多数参数后需要 重新加载:
systemctl reload postgresql-15
或pg_ctl reload -D $PGDATA
或 SQL 命令SELECT pg_reload_conf();
。少数参数(如
shared_buffers
,max_connections
)需要 完全重启 数据库服务才能生效。
主要配置项分类说明
1. 连接与监听 (Connection Settings)
ini
# - Connection Settings - listen_addresses = 'localhost' # 监听哪些IP地址的连接。 # '*' 表示所有IPv4接口,‘::’ 表示所有IPv4和IPv6,'localhost' 表示只允许本地连接。 port = 5432 # 服务器监听的TCP端口,默认为5432。 max_connections = 100 # 允许的最大并发连接数。这是一个硬性限制,设置过高会浪费内存。 superuser_reserved_connections = 3 # 为超级用户保留的连接数,防止普通用户占满所有连接后无法进行管理。
2. 资源消耗 (Resource Consumption)
内存 (Memory)
ini
shared_buffers = 128MB # PostgreSQL服务器使用的共享内存缓冲区大小。 # 用于缓存表和索引数据。通常设置为系统总内存的 15%-25%。 work_mem = 4MB # 每个排序或哈希操作可使用的最大内存。 # 这是一个“每次操作”的限制,复杂查询可能同时有多个操作。 # 设置过高可能导致内存溢出(OOM)。通常从 4MB-32MB 开始调整。 maintenance_work_mem = 64MB # 维护性操作(如VACUUM、CREATE INDEX、ALTER TABLE)可使用的最大内存。 # 通常设置为 work_mem 的 16 倍或更高,能显著加快维护操作。
内核资源 (Kernel Resources)
ini
#max_files_per_process = 1000 # 每个服务器子进程允许打开的最大文件数。如果遇到“Too many open files”错误,可以增加此值。 #shared_preload_libraries = '' # 在服务器启动时预加载的共享库,用逗号分隔。 # 例如,为了使用 pg_stat_statements 扩展,需要设置为 'pg_stat_statements'
3. 预写式日志 - WAL (Write-Ahead Log)
WAL 是保证数据一致性和持久性的核心机制。
ini
#wal_level = replica # WAL的详细程度。 # minimal (仅用于崩溃恢复), replica (增加WAL归档和复制所需信息), logical (增加逻辑解码所需信息) #fsync = on # 强制将数据同步到磁盘,保证数据不会因系统崩溃而丢失。 # 关闭它可以提升性能,但会带来数据丢失的风险(极其不推荐!)。 #synchronous_commit = on # 每个事务提交后是否等待WAL写入磁盘后才向客户端返回成功。 # 关闭 (off) 或设置为 local 可以提升写入性能,但会有极小的时间窗口导致数据丢失。 #wal_buffers = -1 # 用于存储尚未写入磁盘的WAL数据的共享内存量。 # -1 表示根据 shared_buffers 自动设置(通常是其1/32)。 #checkpoint_timeout = 5min # 自动 WAL 检查点之间的最长时间。 #max_wal_size = 1GB # WAL 段文件允许使用的最大磁盘空间。 #min_wal_size = 80MB # WAL 段文件允许使用的最小磁盘空间。
4. 查询优化 (Query Tuning)
优化器设置 (Planner Method Configuration)
ini
#effective_cache_size = 4GB # 优化器假设操作系统和磁盘缓存可用的磁盘缓存大小。 # 这只是一个假设值,用于帮助优化器选择更好的查询计划。 # 通常设置为系统总内存的 50%-75%。 #random_page_cost = 4.0 # 优化器对从磁盘获取一个随机页面的成本估计。 # 对于SSD硬盘,可以降低此值(如 1.1 或 1.5),优化器将更倾向于使用索引扫描。 #enable_seqscan = on # 是否允许优化器选择顺序扫描。在测试时可以关闭以强制使用索引,但生产环境应保持开启。
5. 报告和日志 (Reporting and Logging)
ini
#log_destination = 'stderr' # PostgreSQL日志的输出位置。通常为 'stderr'。 #logging_collector = on # 是否启用日志收集器。必须为 on 才能将日志重定向到文件。 #log_directory = 'log' # 日志文件的目录(相对于 PGDATA)。 #log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # 日志文件的命名模式。 #log_rotation_age = 1d # 自动创建新日志文件的时间间隔。 #log_rotation_size = 10MB # 自动创建新日志文件的大小限制。 #log_min_duration_statement = -1 # 记录执行时间超过此值(毫秒)的SQL语句。-1 表示禁用,0 记录所有语句。 # 例如设置为 1000,则记录所有执行超过1秒的语句,是性能调优的关键工具。 #log_checkpoints = off # 是否在日志中记录检查点信息,用于性能分析。 #log_connections = off # 是否记录每个成功的连接。 #log_disconnections = off # 是否记录会话终止信息。 #log_line_prefix = '%m [%p] ' # 每条日志行的前缀。 # %m: 时间戳, %p: 进程ID, %u: 用户名, %d: 数据库名, %a: 应用名
6. 自动清理 (Autovacuum)
Autovacuum 对于防止表膨胀和更新优化器统计信息至关重要,强烈建议开启。
ini
#autovacuum = on # 是否启用自动清理守护进程。生产环境必须为 on。 #log_autovacuum_min_duration = -1 # 记录执行时间超过此值的autovacuum动作,用于监控。 #autovacuum_max_workers = 3 # 同时运行的自动清理进程的最大数量。 #autovacuum_naptime = 1min # 自动清理守护进程的轮询间隔。 #autovacuum_vacuum_scale_factor = 0.2 # 触发VACUUM操作的死元组比例(相对于表大小)。 #autovacuum_analyze_scale_factor = 0.1 # 触发ANALYZE操作的行更改比例(相对于表大小)。
7. 客户端连接默认值 (Client Connection Defaults)
ini
#timezone = 'UTC' # 服务器使用的时区。 #datestyle = 'iso, mdy' # 日期/时间的显示格式。 #default_text_search_config = 'pg_catalog.english' # 默认的全文搜索配置。 #shared_preload_libraries = 'pg_stat_statements' # 再次强调,要使用pg_stat_statements必须在此预加载。
一个简单的生产环境优化示例
假设一台拥有 8GB 内存的专用数据库服务器,使用 SSD 硬盘。
ini
# 连接设置 listen_addresses = '*' # 允许远程连接(确保配置了pg_hba.conf) max_connections = 200 # 根据应用需求调整 superuser_reserved_connections = 5 # 资源 shared_buffers = 2GB # 8GB * 25% = 2GB work_mem = 16MB # 200个连接 * 16MB = 3.2GB (峰值),在安全范围内 maintenance_work_mem = 512MB # 加快VACUUM和CREATE INDEX effective_cache_size = 6GB # 8GB * 75% = 6GB # WAL wal_level = replica synchronous_commit = on # 保证数据安全性 max_wal_size = 2GB min_wal_size = 1GB # 优化器 (针对SSD) random_page_cost = 1.1 # SSD的随机读成本远低于机械硬盘 # 日志 logging_collector = on log_directory = 'log' log_filename = 'postgresql-%a.log' # 每天一个文件,以星期命名 log_rotation_age = 1d log_min_duration_statement = 1000 # 记录慢查询(>1s) log_checkpoints = on log_connections = on log_disconnections = on log_line_prefix = '%m [%p] %u@%d %a ' # 包含时间、进程、用户、数据库、应用名 # Autovacuum autovacuum = on autovacuum_max_workers = 5 # 比默认值稍高 log_autovacuum_min_duration = 5000 # 记录执行超过5s的autovacuum
重要提示:以上配置仅为起点,最佳配置强烈依赖于您的具体 workload(读写比例、数据量、查询复杂度等)。务必在测试环境中进行基准测试后再应用到生产环境。使用 pg_stat_statements
和慢查询日志来持续分析和调优。