1. PostgreSQL安装概述
PostgreSQL作为一款功能强大的开源关系型数据库系统,在企业级应用中越来越受欢迎。与MySQL相比,PostgreSQL提供了更丰富的特性,包括JSON支持、地理空间数据处理、自定义函数等。本教程将详细介绍如何在Linux环境下从源码编译安装PostgreSQL 17.2版本。
注意:本教程除"安装依赖"部分需要在root用户下执行外,其他所有操作都应在专门的安装用户下完成,这是生产环境的最佳实践。
2. 环境准备与依赖安装
2.1 系统要求检查
在开始安装前,建议检查系统是否符合PostgreSQL的基本要求:
- 操作系统:CentOS/RHEL 7.x或更高版本
- 内存:至少2GB(生产环境建议8GB以上)
- 磁盘空间:安装目录至少需要500MB,数据目录根据实际需求规划
- 用户权限:需要一个普通用户作为安装用户(非root)
2.2 安装编译依赖
PostgreSQL的编译安装需要大量开发工具和库文件支持。以下命令将安装所有必要的依赖:
bash复制yum install -y perl-devel perl-ExtUtils-Embed systemd-devel readline-devel \
uuid-devel zlib-devel clang-devel llvm-devel perlExtUtils-Embed tcl-devel \
libicu-devel libxml2-devel libxslt-devel python-devel python3-devel gcc \
gcc-c++ llvm3.9-devel openssl-devel lz4-devel pam-devel openldap-devel \
cmake bison flex
这些依赖包主要分为以下几类:
- 编译器工具链(gcc, gcc-c++, cmake等)
- 加密和安全相关(openssl-devel, pam-devel等)
- 国际化支持(libicu-devel等)
- 数据库扩展支持(libxml2-devel, python-devel等)
经验分享:如果系统中有多个Python版本,建议明确指定python3-devel的版本,避免后续编译问题。
3. 目录规划与创建
3.1 目录结构设计
合理的目录结构对后续维护至关重要。建议采用以下结构:
code复制/home/install_user/pgsql/
├── bin/ # 可执行文件
├── data/ # 数据文件
├── tmp/ # 临时文件
└── log/ # 日志文件
创建这些目录的命令如下:
bash复制mkdir -p /home/install_user/pgsql/{data,tmp,log}
3.2 目录权限设置
确保安装用户对这些目录有完全控制权:
bash复制chown -R install_user:install_user /home/install_user/pgsql
chmod -R 750 /home/install_user/pgsql
注意事项:生产环境中,数据目录应放在独立的存储设备上,而非用户home目录下。
4. PostgreSQL源码安装
4.1 获取安装包
可以从以下官方渠道获取PostgreSQL源码:
- 官网下载:https://www.postgresql.org/ftp/source/
- 国内镜像(阿里云):https://mirrors.aliyun.com/postgresql/source/
下载命令示例:
bash复制wget https://ftp.postgresql.org/pub/source/v17.2/postgresql-17.2.tar.gz
4.2 校验安装包完整性
为确保下载的源码包未被篡改,应进行校验:
bash复制wget https://ftp.postgresql.org/pub/source/v17.2/postgresql-17.2.tar.gz.sha256
sha256sum -c postgresql-17.2.tar.gz.sha256
4.3 解压源码包
bash复制tar -zxf postgresql-17.2.tar.gz
cd postgresql-17.2
5. 编译与安装
5.1 配置编译选项
PostgreSQL提供了丰富的编译选项,基本配置如下:
bash复制./configure --prefix=/home/install_user/pgsql \
--with-icu \
--with-libxml \
--with-libxslt \
--with-python \
--with-ssl=openssl
关键参数说明:
--prefix:指定安装目录--with-*:启用各种扩展支持- 可通过
./configure --help查看所有可用选项
5.2 编译源码
使用多线程编译加快速度(根据CPU核心数调整-j参数):
bash复制make -j $(nproc)
5.3 安装软件
bash复制make install
安装完成后,检查$PGHOME/bin目录下是否生成了PostgreSQL的可执行文件。
6. 环境配置
6.1 设置环境变量
在安装用户的.bashrc文件中添加以下内容:
bash复制export PGHOME=/home/install_user/pgsql
export PATH=$PGHOME/bin:$PATH
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
export PGDATA=/home/install_user/pgsql/data
export PGHOST=/home/install_user/pgsql/tmp
export PGPORT=5432
使配置生效:
bash复制source ~/.bashrc
6.2 验证环境变量
bash复制which psql
pg_config --bindir
7. 数据库初始化
7.1 初始化数据目录
bash复制initdb -D $PGDATA
成功初始化后,会在数据目录下生成以下重要文件:
- postgresql.conf:主配置文件
- pg_hba.conf:客户端认证配置文件
- pg_ident.conf:用户映射文件
7.2 修改基本配置
编辑$PGDATA/postgresql.conf:
conf复制port = 5432
unix_socket_directories = '/home/install_user/pgsql/tmp'
logging_collector = on
log_directory = '/home/install_user/pgsql/log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_size = 10MB
8. 服务管理
8.1 启动数据库
bash复制pg_ctl -D $PGDATA -l $PGHOME/log/start.log start
8.2 停止数据库
bash复制pg_ctl -D $PGDATA stop
8.3 查看状态
bash复制pg_ctl -D $PGDATA status
9. 数据库基本操作
9.1 连接数据库
bash复制psql -d postgres
9.2 修改用户密码
sql复制ALTER USER install_user WITH PASSWORD 'StrongPassword123!';
9.3 创建新用户
sql复制CREATE ROLE db_user WITH LOGIN PASSWORD 'UserPass123!';
GRANT ALL PRIVILEGES ON DATABASE postgres TO db_user;
10. 远程访问配置
10.1 修改监听地址
编辑postgresql.conf:
conf复制listen_addresses = '*'
10.2 配置客户端认证
编辑pg_hba.conf,添加:
conf复制host all all 0.0.0.0/0 scram-sha-256
10.3 重启服务
bash复制pg_ctl -D $PGDATA restart
11. 防火墙配置
如果系统启用了防火墙,需要开放5432端口:
bash复制firewall-cmd --permanent --add-port=5432/tcp
firewall-cmd --reload
12. 验证远程连接
从另一台机器测试连接:
bash复制psql -h <服务器IP> -U install_user -d postgres
13. 常见问题排查
13.1 连接被拒绝
可能原因:
- PostgreSQL服务未运行
- 防火墙阻止了连接
- pg_hba.conf配置不正确
13.2 认证失败
检查:
- 用户名和密码是否正确
- pg_hba.conf中的认证方法配置
- 密码是否包含特殊字符
13.3 性能问题
可调整的参数:
- shared_buffers:通常设为内存的25%
- work_mem:每个操作的内存限制
- maintenance_work_mem:维护操作的内存限制
14. 后续优化建议
- 配置归档和备份策略
- 设置定期维护任务(如VACUUM)
- 根据负载调整配置参数
- 考虑配置复制以实现高可用
在实际使用中,我发现合理配置shared_buffers和work_mem对性能提升最为明显。对于内存较大的服务器,可以适当增加这些值,但要注意不要设置过高导致系统内存不足。