外观
PostgreSQL 源码编译安装
编译前准备
1. 系统要求
- 操作系统:支持 Linux、macOS、Windows(通过 WSL 或 MinGW)
- 编译工具:
- GCC 或 Clang 编译器(推荐 GCC 8.0+ 或 Clang 9.0+)
- Make 工具
- GNU Readline 库及开发文件
- zlib 库及开发文件
- OpenSSL 库及开发文件(可选,用于 SSL 支持)
- libxml2 和 libxslt 库及开发文件(可选,用于 XML 支持)
- libicu 库及开发文件(可选,用于国际化支持)
2. 依赖安装
CentOS/RHEL
bash
yum install -y gcc gcc-c++ make readline-devel zlib-devel openssl-devel libxml2-devel libxslt-devel libicu-develUbuntu/Debian
bash
apt-get update
apt-get install -y gcc g++ make libreadline-dev zlib1g-dev libssl-dev libxml2-dev libxslt1-dev libicu-devmacOS
bash
brew install readline zlib openssl libxml2 libxslt icu4c3. 获取源码
从 PostgreSQL 官方网站下载最新稳定版源码:
bash
wget https://ftp.postgresql.org/pub/source/v16.4/postgresql-16.4.tar.bz2
tar -xjvf postgresql-16.4.tar.bz2
cd postgresql-16.4或者使用 Git 克隆仓库:
bash
git clone https://git.postgresql.org/git/postgresql.git
cd postgresql
git checkout REL_16_4编译配置
1. 基本配置
使用 configure 脚本进行编译配置,指定安装目录和所需功能:
bash
./configure --prefix=/usr/local/pgsql --with-openssl --with-libxml --with-libxslt --with-icu2. 常用配置选项
| 选项 | 描述 |
|---|---|
--prefix=DIR | 指定安装目录 |
--with-openssl | 启用 SSL 支持 |
--with-libxml | 启用 XML 支持 |
--with-libxslt | 启用 XSLT 支持 |
--with-icu | 启用 ICU 国际化支持 |
--with-perl | 启用 Perl 支持 |
--with-python | 启用 Python 支持 |
--with-tcl | 启用 Tcl 支持 |
--with-blocksize=BLOCKSIZE | 指定块大小(默认 8KB) |
--with-wal-blocksize=BLOCKSIZE | 指定 WAL 块大小(默认 8KB) |
--enable-debug | 启用调试模式 |
--enable-cassert | 启用断言检查 |
3. 高级配置
启用线程安全
bash
./configure --prefix=/usr/local/pgsql --enable-thread-safety启用 JIT 支持
bash
./configure --prefix=/usr/local/pgsql --with-llvm自定义编译优化
bash
./configure --prefix=/usr/local/pgsql CFLAGS="-O3 -march=native" CXXFLAGS="-O3 -march=native"编译过程
1. 执行编译
bash
make -j$(nproc) # 使用所有可用 CPU 核心进行编译2. 运行回归测试(可选)
bash
make check -j$(nproc)回归测试会验证编译后的 PostgreSQL 是否正常工作,包括功能测试和性能测试。
3. 安装
bash
make install安装后配置
1. 创建数据目录
bash
mkdir -p /usr/local/pgsql/data2. 创建 PostgreSQL 用户
bash
useradd -m postgres
chown -R postgres:postgres /usr/local/pgsql3. 初始化数据库集群
bash
su - postgres
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data4. 配置环境变量
编辑 ~/.bashrc 或 ~/.profile 文件,添加 PostgreSQL 环境变量:
bash
export PATH=/usr/local/pgsql/bin:$PATH
export PGDATA=/usr/local/pgsql/data
export LD_LIBRARY_PATH=/usr/local/pgsql/lib:$LD_LIBRARY_PATH使环境变量生效:
bash
source ~/.bashrc5. 配置监听地址和端口
编辑 postgresql.conf 文件:
bash
vi /usr/local/pgsql/data/postgresql.conf修改以下参数:
listen_addresses = '*' # 允许所有 IP 地址访问
port = 5432 # PostgreSQL 服务端口6. 配置访问控制
编辑 pg_hba.conf 文件,添加允许访问的主机:
bash
vi /usr/local/pgsql/data/pg_hba.conf添加以下内容:
host all all 0.0.0.0/0 md5
host all all ::/0 md5启动和停止服务
1. 启动服务
bash
su - postgres
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start2. 停止服务
bash
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data stop3. 重启服务
bash
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data restart安装验证
1. 检查 PostgreSQL 版本
bash
psql --version2. 连接到数据库
bash
psql -h localhost -U postgres3. 创建测试数据库
sql
CREATE DATABASE testdb;
\c testdb
CREATE TABLE test_table (id serial primary key, name varchar(50));
INSERT INTO test_table (name) VALUES ('Test');
SELECT * FROM test_table;编译安装的优势和劣势
优势
- 自定义编译选项:可以根据需求选择需要的功能和扩展
- 性能优化:可以针对特定硬件进行编译优化
- 最新版本:可以获取最新的 PostgreSQL 版本
- 便于调试:可以启用调试选项,便于开发和调试
- 完全控制:对安装过程和配置有完全的控制权
劣势
- 编译时间长:特别是在大型系统上编译时间较长
- 依赖管理复杂:需要手动安装所有依赖项
- 升级麻烦:需要重新编译和安装来升级版本
- 缺乏系统集成:不会自动配置系统服务和开机自启
编译安装的最佳实践
1. 选择合适的版本
- 生产环境建议使用稳定版(如 16.x)
- 开发环境可以使用最新的开发版
- 考虑 LTS(长期支持)版本
2. 合理配置编译选项
- 只启用需要的功能,减少不必要的依赖
- 根据硬件配置进行优化
- 考虑启用调试符号,便于后期故障排查
3. 保持源码目录
编译完成后,建议保留源码目录,便于后续升级和重新编译。
4. 建立编译文档
记录编译配置选项、依赖版本和安装过程,便于后续参考和重现。
5. 定期更新
定期更新 PostgreSQL 版本,获取最新的功能和安全修复。
常见问题(FAQ)
Q1: 编译过程中出现 "error: readline library not found" 错误怎么办?
A1: 安装 readline 开发库:
bash
# CentOS/RHEL
yum install -y readline-devel
# Ubuntu/Debian
apt-get install -y libreadline-dev
# macOS
brew install readline
export LDFLAGS="-L/usr/local/opt/readline/lib"
export CPPFLAGS="-I/usr/local/opt/readline/include"Q2: 如何启用 JIT 编译支持?
A2: 编译时添加 --with-llvm 选项:
bash
./configure --prefix=/usr/local/pgsql --with-llvm
make -j$(nproc)
make install然后在 postgresql.conf 中启用 JIT:
jit = onQ3: 如何指定编译使用的编译器?
A3: 使用 CC 和 CXX 环境变量指定编译器:
bash
./configure --prefix=/usr/local/pgsql CC=clang CXX=clang++Q4: 编译后的 PostgreSQL 如何升级?
A4: 升级步骤:
- 备份现有数据库
- 下载新版本源码
- 使用相同的编译选项编译新版本
- 停止旧版本服务
- 安装新版本
- 运行
pg_upgrade工具升级数据目录 - 启动新版本服务
- 验证升级结果
Q5: 如何为 PostgreSQL 添加外部扩展?
A5: 有两种方式添加外部扩展:
- 编译时集成:将扩展源码放在
contrib目录下,编译时会自动编译 - 单独编译:使用
pgxs工具单独编译扩展
例如,使用 pgxs 编译扩展:
bash
cd extension_dir
make USE_PGXS=1
make USE_PGXS=1 installQ6: 如何配置 PostgreSQL 以使用系统服务管理?
A6: 创建系统服务文件,以 systemd 为例:
bash
vi /etc/systemd/system/postgresql.service添加以下内容:
[Unit]
Description=PostgreSQL database server
After=network.target
[Service]
Type=forking
User=postgres
Group=postgres
Environment=PGDATA=/usr/local/pgsql/data
ExecStart=/usr/local/pgsql/bin/pg_ctl start -D ${PGDATA} -s -w -t 60
ExecStop=/usr/local/pgsql/bin/pg_ctl stop -D ${PGDATA} -s -m fast
ExecReload=/usr/local/pgsql/bin/pg_ctl reload -D ${PGDATA} -s
TimeoutSec=300
[Install]
WantedBy=multi-user.target然后启用并启动服务:
bash
systemctl enable postgresql
systemctl start postgresqlQ7: 如何优化编译性能?
A7: 可以通过以下方式优化编译性能:
- 使用
-j$(nproc)选项并行编译 - 启用增量编译
- 使用更高性能的编译器(如 GCC 12+)
- 优化编译选项(如
-O2或-O3) - 使用 SSD 存储
Q8: 编译时如何启用特定的字符集支持?
A8: 使用 --with-charset 选项指定默认字符集:
bash
./configure --prefix=/usr/local/pgsql --with-charset=utf8或者使用 --with-multibyte 选项启用多字节支持:
bash
./configure --prefix=/usr/local/pgsql --with-multibyte=utf8Q9: 如何查看编译配置选项?
A9: 使用 ./configure --help 查看所有可用的配置选项:
bash
./configure --helpQ10: 编译后如何卸载 PostgreSQL?
A10: 可以使用以下命令卸载:
bash
make uninstall或者手动删除安装目录:
bash
rm -rf /usr/local/pgsql
rm -rf /usr/local/pgsql/data版本差异
PostgreSQL 15 及以上版本
- 新增了更多的 JIT 优化选项
- 改进了并行查询性能
- 增强了分区表功能
- 引入了更多的安全特性
PostgreSQL 13 及以上版本
- 改进了逻辑复制性能
- 增强了 vacuum 功能
- 引入了增量排序
- 改进了 B-tree 索引性能
PostgreSQL 11 及以上版本
- 引入了声明式分区
- 改进了并行查询
- 增强了 JSONB 支持
- 引入了存储过程支持
性能优化建议
- 针对特定硬件优化:使用
-march=native选项针对当前硬件进行优化 - 启用链接时优化:使用
-flto选项启用链接时优化 - 合理设置块大小:根据存储设备特性调整块大小(如 SSD 可以使用 16KB 或 32KB)
- 启用断言检查:开发环境可以启用断言检查,生产环境建议禁用
- 优化内存分配:根据系统内存大小调整
shared_buffers和work_mem等参数
安全考虑
- 使用非root用户运行:始终使用
postgres用户或其他非root用户运行 PostgreSQL - 限制访问权限:通过
pg_hba.conf限制允许访问的主机和用户 - 启用 SSL 加密:编译时启用 SSL 支持,并在生产环境中启用 SSL 连接
- 定期更新:定期更新 PostgreSQL 版本,获取最新的安全修复
- 禁用不必要的功能:只启用必要的功能和扩展,减少攻击面
监控和维护
- 日志监控:定期检查 PostgreSQL 日志,及时发现和解决问题
- 性能监控:使用
pg_stat_statements等工具监控数据库性能 - 定期备份:定期备份数据库,确保数据安全
- 真空清理:定期运行
VACUUM ANALYZE维护数据库 - 索引维护:定期检查和维护索引,确保查询性能
编译安装的自动化
可以使用脚本自动化 PostgreSQL 的编译安装过程,例如:
bash
#!/bin/bash
# PostgreSQL 版本
PG_VERSION="16.4"
PG_PREFIX="/usr/local/pgsql"
PG_DATA="/usr/local/pgsql/data"
# 安装依赖
yum install -y gcc gcc-c++ make readline-devel zlib-devel openssl-devel libxml2-devel libxslt-devel libicu-devel
# 下载源码
wget https://ftp.postgresql.org/pub/source/v${PG_VERSION}/postgresql-${PG_VERSION}.tar.bz2
tar -xjvf postgresql-${PG_VERSION}.tar.bz2
cd postgresql-${PG_VERSION}
# 编译配置
./configure --prefix=${PG_PREFIX} --with-openssl --with-libxml --with-libxslt --with-icu
# 编译和安装
make -j$(nproc)
make install
# 创建用户
useradd -m postgres
chown -R postgres:postgres ${PG_PREFIX}
# 初始化数据库
su - postgres -c "${PG_PREFIX}/bin/initdb -D ${PG_DATA}"
# 配置服务
echo "[Unit]
Description=PostgreSQL database server
After=network.target
[Service]
Type=forking
User=postgres
Group=postgres
Environment=PGDATA=${PG_DATA}
ExecStart=${PG_PREFIX}/bin/pg_ctl start -D ${PGDATA} -s -w -t 60
ExecStop=${PG_PREFIX}/bin/pg_ctl stop -D ${PGDATA} -s -m fast
ExecReload=${PG_PREFIX}/bin/pg_ctl reload -D ${PGDATA} -s
TimeoutSec=300
[Install]
WantedBy=multi-user.target" > /etc/systemd/system/postgresql.service
# 启动服务
systemctl enable postgresql
systemctl start postgresql
# 验证安装
echo "PostgreSQL ${PG_VERSION} 编译安装完成!"
echo "使用以下命令连接数据库:"
echo "psql -h localhost -U postgres"将上述脚本保存为 install-postgresql.sh,然后执行:
bash
chmod +x install-postgresql.sh
./install-postgresql.sh故障排除
1. 编译失败
- 检查依赖是否安装完整
- 查看错误信息,针对性解决
- 尝试使用更简单的配置选项
- 检查编译器版本是否兼容
2. 初始化失败
- 检查数据目录权限是否正确
- 查看
initdb输出的错误信息 - 确保使用正确的用户执行初始化
3. 启动失败
- 检查
postgresql.conf配置是否正确 - 查看数据库日志文件
- 检查端口是否被占用
- 检查 SELinux 或防火墙设置
4. 连接失败
- 检查
listen_addresses配置 - 检查
pg_hba.conf访问控制设置 - 检查防火墙是否允许连接
- 确保 PostgreSQL 服务正在运行
