Skip to content

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-devel

Ubuntu/Debian

bash
apt-get update
apt-get install -y gcc g++ make libreadline-dev zlib1g-dev libssl-dev libxml2-dev libxslt1-dev libicu-dev

macOS

bash
brew install readline zlib openssl libxml2 libxslt icu4c

3. 获取源码

从 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-icu

2. 常用配置选项

选项描述
--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/data

2. 创建 PostgreSQL 用户

bash
useradd -m postgres
chown -R postgres:postgres /usr/local/pgsql

3. 初始化数据库集群

bash
su - postgres
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data

4. 配置环境变量

编辑 ~/.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 ~/.bashrc

5. 配置监听地址和端口

编辑 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 start

2. 停止服务

bash
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data stop

3. 重启服务

bash
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data restart

安装验证

1. 检查 PostgreSQL 版本

bash
psql --version

2. 连接到数据库

bash
psql -h localhost -U postgres

3. 创建测试数据库

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 = on

Q3: 如何指定编译使用的编译器?

A3: 使用 CCCXX 环境变量指定编译器:

bash
./configure --prefix=/usr/local/pgsql CC=clang CXX=clang++

Q4: 编译后的 PostgreSQL 如何升级?

A4: 升级步骤:

  1. 备份现有数据库
  2. 下载新版本源码
  3. 使用相同的编译选项编译新版本
  4. 停止旧版本服务
  5. 安装新版本
  6. 运行 pg_upgrade 工具升级数据目录
  7. 启动新版本服务
  8. 验证升级结果

Q5: 如何为 PostgreSQL 添加外部扩展?

A5: 有两种方式添加外部扩展:

  1. 编译时集成:将扩展源码放在 contrib 目录下,编译时会自动编译
  2. 单独编译:使用 pgxs 工具单独编译扩展

例如,使用 pgxs 编译扩展:

bash
cd extension_dir
make USE_PGXS=1
make USE_PGXS=1 install

Q6: 如何配置 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 postgresql

Q7: 如何优化编译性能?

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=utf8

Q9: 如何查看编译配置选项?

A9: 使用 ./configure --help 查看所有可用的配置选项:

bash
./configure --help

Q10: 编译后如何卸载 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 支持
  • 引入了存储过程支持

性能优化建议

  1. 针对特定硬件优化:使用 -march=native 选项针对当前硬件进行优化
  2. 启用链接时优化:使用 -flto 选项启用链接时优化
  3. 合理设置块大小:根据存储设备特性调整块大小(如 SSD 可以使用 16KB 或 32KB)
  4. 启用断言检查:开发环境可以启用断言检查,生产环境建议禁用
  5. 优化内存分配:根据系统内存大小调整 shared_bufferswork_mem 等参数

安全考虑

  1. 使用非root用户运行:始终使用 postgres 用户或其他非root用户运行 PostgreSQL
  2. 限制访问权限:通过 pg_hba.conf 限制允许访问的主机和用户
  3. 启用 SSL 加密:编译时启用 SSL 支持,并在生产环境中启用 SSL 连接
  4. 定期更新:定期更新 PostgreSQL 版本,获取最新的安全修复
  5. 禁用不必要的功能:只启用必要的功能和扩展,减少攻击面

监控和维护

  1. 日志监控:定期检查 PostgreSQL 日志,及时发现和解决问题
  2. 性能监控:使用 pg_stat_statements 等工具监控数据库性能
  3. 定期备份:定期备份数据库,确保数据安全
  4. 真空清理:定期运行 VACUUM ANALYZE 维护数据库
  5. 索引维护:定期检查和维护索引,确保查询性能

编译安装的自动化

可以使用脚本自动化 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 服务正在运行