postgresql17.5 手动编译安装

发布于:2025-09-06 ⋅ 阅读:(13) ⋅ 点赞:(0)

第一部分

前期准备
  1. 以 root 用户登录 或使用 sudo 权限。

  2. 安装必需的开发工具和库:编译 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
  3. 创建专用系统用户和组(如果不存在):

    bash

    groupadd postgres
    useradd -g postgres postgres
  4. 选择安装目录和源目录

    • 源代码目录/usr/local/src/postgresql-15.7

    • 安装目录/usr/local/pgsql/15 (推荐,便于多版本管理)

    • 数据目录/pgdata/15/data (推荐将数据目录独立出来,通常放在更大的磁盘分区上)

  5. 创建目录并设置权限

    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:下载并解压源代码
  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
  2. 解压源代码

    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)
  1. 编译源代码:使用 make 命令开始编译,-j 参数指定并行编译的 job 数,可以显著加快速度(通常为核心数或核心数+1)。

    bash

    make -j $(nproc) # $(nproc) 会自动获取CPU核心数
    # 或者手动指定,例如 make -j 4

    这个过程可能需要一段时间。

  2. 运行回归测试(可选,但推荐):

    bash

    make check

    注意:运行测试可能需要额外权限,可能需以 postgres 用户运行 sudo -u postgres make check。请查看输出日志确认测试是否通过。

  3. 安装到指定目录

    bash

    make install

    这会将所有必要的文件复制到 --prefix 指定的目录(/usr/local/pgsql/15)。


步骤 4:配置环境变量

为了让系统能找到 psqlpg_ctl 等命令,需要将安装目录的 bin 和 lib 目录添加到环境变量。

  1. 为所有用户创建全局配置文件

    bash

    vi /etc/profile.d/pgsql.sh
  2. 添加以下内容

    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
  3. 使环境变量立即生效

    bash

    source /etc/profile.d/pgsql.sh

步骤 5:初始化数据库簇
  1. 切换到 postgres 用户

    bash

    su - postgres
  2. 初始化数据库簇(使用 initdb):

    bash

    initdb -D $PGDATA -E UTF8 --locale=C -U postgres -W
    • -D: 指定数据目录位置。

    • -E: 设置默认数据库编码(UTF8)。

    • --locale=C: 使用 C 区域设置,避免排序规则带来的性能问题和复杂性。

    • -U: 指定数据库超级用户名。

    • -W: 提示为超级用户设置密码。

  3. (可选)配置 pg_hba.conf 和 postgresql.conf
    您现在可以像使用包安装一样,编辑 $PGDATA/pg_hba.conf 和 $PGDATA/postgresql.conf 来配置访问权限、监听地址等。


步骤 6:创建 Systemd 服务文件(推荐)
  1. 以 root 用户创建服务文件

    bash

    vi /etc/systemd/system/postgresql-15.service
  2. 添加以下内容(根据您的路径调整):

    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
  3. 重新加载 systemd 并启动服务

    bash

    systemctl daemon-reload
    systemctl start postgresql-15
    systemctl enable postgresql-15 # 设置开机自启
    systemctl status postgresql-15 # 检查状态

步骤 7:测试安装
  1. 检查进程

    bash

    ps aux | grep postgres
  2. 使用 psql 连接测试

    bash

    # 切换到 postgres 用户
    su - postgres
    # 连接数据库
    psql -U postgres
    # 在 psql 提示符下运行一个简单查询
    SELECT version();
总结

您已经成功通过编译方式安装了 PostgreSQL。关键步骤是:

  1. 安装所有必需的 -devel 包

  2. 使用 ./configure 精心配置编译选项

  3. 使用 make -j N 和 make install 进行编译和安装

  4. 设置环境变量以便系统找到新安装的软件。

  5. 以 postgres 用户身份使用 initdb 初始化数据目录

  6. 创建并启用 systemd 服务以便管理。

编译安装提供了最大的灵活性,但后续的维护(如小版本升级)需要您手动重复编译和安装步骤。

第二部分 postgresql.conf

postgresql.conf 是 PostgreSQL 的主配置文件,控制着数据库实例的所有核心行为。理解其配置项对于性能调优和稳定运行至关重要。以下是主要配置项的详细说明。

配置文件基础
  • 位置:通常在数据目录($PGDATA)下,例如 /pgdata/15/data/postgresql.conf

  • 格式参数名 = 值# 开头的行是注释。

  • 单位

    • kBMBGBTB (千字节、兆字节等,1024为基数)

    • ms (毫秒), s (秒), min (分钟), h (小时)

    • kBps (千字节/秒)

  • 生效方式

    • 修改大多数参数后需要 重新加载systemctl reload postgresql-15 或 pg_ctl reload -D $PGDATA 或 SQL 命令 SELECT pg_reload_conf();

    • 少数参数(如 shared_buffersmax_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 和慢查询日志来持续分析和调优。


网站公告

今日签到

点亮在社区的每一天
去签到