PostgreSQL 18正式版发布之后身边不少同事和朋友都在问怎么装。其实这个版本从功能层面来说有不少让人眼前一亮的东西比如逻辑复制的能力进一步增强、内置的同步复制槽管理更方便了异步I/O也补上了。但对大部分人来说第一步永远是把它跑起来。这篇我就把自己在Linux环境下的安装经验整理一下从官方软件源到源码编译全覆盖顺带把最常见的几个坑提前帮你踩平。1. 动手之前先想清楚这几件事1.1 为什么选 PostgreSQL 18在搭建或升级数据库之前先问自己一句为什么是18而不是继续用老的稳定版本PostgreSQL的版本号规则是主版本号每年递增一次小版本号用于修复漏洞。18作为新的主版本意味着它不仅有新的特性也意味着一些旧的默认行为可能发生变化。比如从这代版本开始部分函数的默认行为和某个内置视图的结构会有调整直接拿旧库升级的话最好先跑一遍pg_upgrade的兼容性检查。从我实际体验来看18的安装包结构和16、17没有本质变化所以如果你之前的运维脚本是基于15或16写的基本上可以无缝套用。这也是PostgreSQL做得比较厚道的地方——新版本不会频繁折腾目录结构和命令路径升级的主要成本在于数据字典的变化和部分SQL行为的调整。1.2 四种安装方式怎么选我见过太多人在这一步浪费大量时间。先把选择逻辑理清楚后面就顺了。安装方式适合场景优点缺点官方软件源PGDG大多数生产环境、测试环境升级方便、依赖自动处理、启动脚本齐全仓库需要手动引入系统自带软件源快速验证、非核心环境一条命令装完版本通常滞后、不一定有18源码编译安装定制化需求、特殊平台参数可自定义、目录可控编译时间长、依赖需手动装Docker容器本地开发、CI环境启动快、环境隔离不适合作为长期生产存储主力如果你刚接触PostgreSQL或者只是需要一个靠谱的数据库环境我建议直接走官方软件源。如果公司有离线安装要求或者你想把数据库装到某个特定前缀路径下再考虑源码编译。1.3 环境准备与前置条件这一步很多人都直接跳过直到报错了才回头补。其实真正的准备工作很简单操作系统是CentOS/Rocky/RHEL系或者Debian/Ubuntu系本文两种都会讲到。磁盘空间至少有5G以上的空闲空间源码编译需要更多一点编译临时文件大概会占1到2G。内存建议至少1G生产环境当然越高越好。root权限或者一个有sudo权限的用户。如果机器上没有wget、curl等基础工具先装一下不然后面下载会很尴尬。提示如果你的服务器在国内官方源下载速度如果不够理想可以看看是否有可用的回源镜像。但不要在配置仓库源这一步偷懒用奇怪的第三方源安全和稳定性没法保证。2. 基于官方软件源安装 PostgreSQL 18推荐2.1 Debian/Ubuntu 系的安装流程Debian系引入PGDG源的方式一直很稳定官方文档也写得很清楚。先把基础工具装上sudo apt update sudo apt install -y curl ca-certificates然后把PostgreSQL官方的GPG密钥和仓库配置加进去sudo install -d /usr/share/postgresql-common/pgdg/ sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc sudo sh -c echo deb [signed-by/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main /etc/apt/sources.list.d/pgdg.list这三步的顺序不要乱先装证书工具再放GPG密钥最后写source list。如果你跳过密钥直接写源后面apt update一定会报“无法验证签名”的错误。然后刷新仓库并安装sudo apt update sudo apt install -y postgresql-18装完之后PostgreSQL 18会被放在/usr/lib/postgresql/18/bin数据目录通常在/var/lib/postgresql/18/main。Debian系的好处是安装包已经帮你初始化好了默认数据库实例并且自动注册了systemd服务。2.2 RHEL/CentOS 系的安装流程RedHat系的PGDG源安装也简单但有一个细节容易踩坑——它要求EPEL仓库里的一些依赖尤其是llvm相关的包。如果你在编译扩展时需要pg_config相关依赖更是必不可少。先引入仓库sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %rhel)-$(uname -m)/pgdg-redhat-repo-latest.noarch.rpm接着禁用系统自带的模块这一步很关键。如果不禁用系统可能会优先去解析系统自带的老版本postgresql导致版本混乱sudo dnf -qy module disable postgresql然后安装sudo dnf install -y postgresql18-serverRHEL系不会自动初始化数据目录需要手动执行sudo /usr/pgsql-18/bin/postgresql-18-setup initdb这个脚本会读取环境变量来判断数据目录位置默认是/var/lib/pgsql/18/data。初始化完成后再启动服务sudo systemctl enable postgresql-18 sudo systemctl start postgresql-182.3 安装完成后先别急着用验证基础路径不管是哪种发行版装完以后都应该先确认几件事which psql psql --version pg_config --versionpsql --version和pg_config --version显示的都是18.x。如果你发现psql还是旧版本大概率是环境变量里PATH顺序不对老版本的bin目录排在了前面。RHEL系安装包会把可执行文件放到/usr/pgsql-18/binDebian系则在/usr/lib/postgresql/18/bin。这两个目录默认不一定在PATH里所以建议在/etc/profile.d/pgsql18.sh里加一行export PATH/usr/pgsql-18/bin:$PATHDebian系对应改成/usr/lib/postgresql/18/bin。这一步能让后续所有操作顺畅很多省得每次都要写完整路径。3. 源码编译安装 PostgreSQL 18进阶路线3.1 下载源码与依赖准备源码编译是很多老运维的“肌肉记忆”因为它的可控性确实强。你可以把数据库装到任意目录自定义编译选项甚至可以针对特殊的CPU指令集做优化。先去官网或镜像站下载源码包wget https://ftp.postgresql.org/pub/source/v18.0/postgresql-18.0.tar.gz tar -zxvf postgresql-18.0.tar.gz cd postgresql-18.0编译前需要装一堆依赖缺了哪一个都会在configure阶段报错。必备的有gcc或clangmakereadline-develzlib-developenssl-develperl-devel如果要用PL/Perlpython3-devel如果要用PL/Pythonflex和bison编译文档或某些工具时需要Debian系对应的包名是libreadline-dev、zlib1g-dev、libssl-dev等。RHEL系则是readline-devel、zlib-devel、openssl-devel。3.2 configure 参数的取舍思路进入源码目录后首先要运行configure脚本进行环境检测。这一步很关键它的作用不是生成Makefile那么简单还会把当前系统缺失或版本不对的依赖统统暴露出来。我常用的一套configure参数是这样的./configure --prefix/usr/local/pgsql18 --with-pgport5432 --with-openssl --with-perl --with-python --with-readline --with-zlib逐个解释一下--prefix指定安装根目录所有二进制、库文件、文档都会放在这个目录下。--with-pgport指定默认端口如果你机器上已经有一个PostgreSQL在跑5432这里就要改成别的端口比如5433。--with-openssl启用SSL支持生产环境必须开。--with-perl和--with-python是为了以后扩展做准备的如果你确定用不到可以不加。--with-readline和--with-zlib属于常规配置缺了的话psql的交互体验会差很远还无法压缩备份。另外还有一个参数值得注意--enable-debug。如果你只是自己用不需要开因为会额外带来性能开销。但如果你后续要分析崩溃日志或做核心转储排查开启它会保留更多符号信息。3.3 编译安装与目录规划configure跑通之后编译一般不会出大问题make -j$(nproc) make install-j$(nproc)是利用服务器所有CPU核心并行编译能大幅缩短时间。如果是4核机器编译大概10到15分钟如果只有1核可能得半个多小时耐心等就行。安装完成后还需要把bin目录加进PATHecho export PATH/usr/local/pgsql18/bin:$PATH ~/.bashrc source ~/.bashrc源码安装版本没有systemd服务文件也不会有initdb之后的实例。所以后面还是要手动初始化我在下一章统一讲。注意源码编译时如果系统里同时存在多个版本的PostgreSQLpg_config这条命令会指向你最后安装的那一个。很多扩展就是靠pg_config来定位头文件和库文件的所以需要哪个版本就先把哪个版本的bin路径放到PATH最前面否则后面装扩展时会搞错版本。4. 数据库实例的初始化与启动4.1 数据目录与 initdb 参数的选择安装好二进制文件之后真正“数据库”还没有诞生。PostgreSQL的设计是“程序与数据分离”需要用一个叫initdb的工具创建一个数据目录这个目录会包含配置文件、数据库文件、事务日志等所有东西。先规划好目录mkdir -p /data/pgdata chown -R postgres:postgres /data/pgdata注意绝对不要以root用户运行initdbPostgreSQL会直接拒绝。最好是先创建一个专属系统用户useradd postgres su - postgres然后执行初始化/usr/local/pgsql18/bin/initdb -D /data/pgdata -U postgres --encodingUTF8 --localeen_US.UTF-8这里几个参数要说明一下-D指定数据目录位置。-U指定超级用户名默认会取当前系统用户名所以显式指定postgres更规范。--encodingUTF8指定数据库默认编码没有特殊理由就用UTF8。--locale指定区域设置对排序和字符串比较有影响。如果不想被区域设置折腾可以写--localeC这会让文本排序按照字节序来性能稍好但中文排序会不符合自然习惯。初始化成功的标志是数据目录下出现一个PG_VERSION文件里面写着18。看到这个文件基础数据库就算成型了。4.2 用 pg_ctl 启动实例并验证连接启动实例的方式有两种直接调用pg_ctl或者用systemd管理。先说第一种/usr/local/pgsql18/bin/pg_ctl -D /data/pgdata -l /data/pglog/start.log start-l指定日志文件路径。注意这个路径最好单独建一个目录比如/data/pglog不要直接放数据目录里避免日志膨胀和数据目录混淆。启动后验证一下状态pg_isready -h 127.0.0.1 -p 5432如果输出accepting connections说明实例已经正常监听。再试一下用psql连进去psql -h 127.0.0.1 -U postgres -d postgres这里有个容易困惑的点默认监听地址在postgresql.conf里是localhost所以如果你用服务器公网IP或内网IP连不上先别急着改防火墙先确认配置文件里的listen_addresses是不是被注释或限制住了。4.3 配置 systemd 开机自启源码安装的PostgreSQL没有自带systemd单元文件但自己写一个也很简单。新建/etc/systemd/system/postgresql-18.service[Unit] DescriptionPostgreSQL 18 database server Afternetwork.target [Service] Typeforking Userpostgres Grouppostgres EnvironmentPGDATA/data/pgdata ExecStart/usr/local/pgsql18/bin/pg_ctl -D ${PGDATA} -l /data/pglog/start.log start ExecStop/usr/local/pgsql18/bin/pg_ctl -D ${PGDATA} stop -m fast ExecReload/usr/local/pgsql18/bin/pg_ctl -D ${PGDATA} reload TimeoutSec600 LimitNOFILE65536 [Install] WantedBymulti-user.targetLimitNOFILE65536这一行别删数据库在跑高并发查询时会一次性打开大量文件描述符不调大这个值连接数上来之后会出现“too many open files”错误。写好后执行sudo systemctl daemon-reload sudo systemctl enable postgresql-18 sudo systemctl start postgresql-185. 常见安装故障排查实录5.1 psql 连不上本地实例怎么办这个问题的典型报错是psql: error: connection to server on socket /var/run/postgresql/.s.PGSQL.5432 failed: No such file or directory出现这个提示第一反应不应该是启动服务而要看服务到底有没有起来。很多人上来就systemctl restart结果反复循环。正确做法是先看进程ps aux | grep postgres如果没有任何postgres进程说明服务确实没启动。这时去日志里找原因源码安装的话看/data/pglog/start.log官方包安装的话看journalctl -u postgresql-18 -e。日志里最常见的一行是FATAL: data directory /data/pgdata does not exist这说明你指定了一个不存在的目录。另一种常见情况是权限不对如果数据目录的owner不是postgres用户启动时也会报权限错误。还有一种情况是socket目录的问题。unix_socket_directories默认指向/var/run/postgresql但在源码安装时这个目录可能不存在或者postgres用户没有写权限。解决办法是在postgresql.conf里把socket目录改成数据目录下的一个子目录比如unix_socket_directories /data/pgdata/sock改完记得重启实例。5.2 认证报错如何定位认证失败大概是数据库运维里出现频率最高的报错FATAL: password authentication failed for user postgres FATAL: no pg_hba.conf entry for host 192.168.1.100, user postgres, database postgres这两种报错指向不同的问题。第一种说明pg_hba.conf里匹配到了规则但密码不对。解决办法是用postgres系统用户身份重置密码su - postgres psql -U postgres ALTER USER postgres WITH PASSWORD 新密码;第二种说明pg_hba.conf里压根没有匹配到IP段的规则。你需要检查pg_hba.conf确认IPv4那一行有没有覆盖到客户端的IP段。默认配置通常只放行了本地127.0.0.1如果要从内网其他机器连接得自己加一行host all all 192.168.1.0/24 scram-sha-256这里再强调一下把认证方式写成trust是绝对不建议的等于让所有能连上来的人无密码登录。除非是纯离线开发环境否则一律用scram-sha-256。改完pg_hba.conf不需要重启只要pg_ctl reload或者systemctl reload postgresql-18就会生效。5.3 版本/权限/端口冲突速查把平时最容易踩的几个坑放在一起做个速查表挨个对照排查更快现象可能原因排查与解决psql: error: could not connect to server: Connection refused端口没监听或者被防火墙挡了ss -lntp | grep 5432检查防火墙放行psql: error: server version mismatch客户端的psql版本和数据目录版本不同psql --version对比PG_VERSION文件initdb: error: cannot be run as root用root初始化数据库切到非root用户FATAL: lock file postmaster.pid already exists上次实例没正常关闭残留pid文件确认没有存活进程后删除postmaster.pidPG_VERSION文件不存在数据目录没初始化或找错目录确认-D参数指向了正确的目录could not read permissions of directorypostgres用户没有数据目录上级路径的权限chown postgres:postgres -R /data/pgdata注意上级目录也要可执行权限端口冲突是另一个常见问题。默认端口5432很容易和已有的老版本实例冲突。安装前先用ss -lntp | grep 5432查一下如果有其他进程占用要么改新实例端口要么先停掉旧实例别在端口上打架。6. 装完之后这几点值得马上做6.1 安装后必改的三个配置参数数据库装完不是结束而是刚开始。至少有三个参数我每次装完都会第一时间在postgresql.conf里调整。第一个是shared_buffers。PostgreSQL默认的共享内存设置非常保守往往只有128MB。对于服务器内存较大比如32G的情况把shared_buffers设到总内存的25%左右也就是8G能让热点数据的读取性能提升明显。注意这个参数不能大到物理内存的一半以上否则系统会开始频繁swap性能反而雪崩。第二个是max_connections。默认值是100对于很多业务系统来说偏小。你可以用一个简单的方式估算需要的连接数每个业务实例平均并发数乘以实例数量再加上监控和运维工具预留的10到15个连接。设置时也要注意PostgreSQL每个连接都会占用一定内存连接数开太多会影响内存占用。第三个是wal_level。默认的replica级别已经覆盖了绝大部分场景不要轻易改成minimal因为那会丢失很多故障恢复能力。如果你打算用流复制就保持replica如果要做逻辑复制需要额外开启max_wal_senders。改完配置重启实例生效/usr/local/pgsql18/bin/pg_ctl -D /data/pgdata restart6.2 数据目录与日志管理的经验日志管理是很多人装了数据库半年后突然发现磁盘被占满才回头看的问题。PostgreSQL的日志默认输出到stderr通过logging_collector参数来收集。安装好后我一般建议开启日志收集并统一日志路径logging_collector on log_directory log log_filename postgresql-%Y-%m-%d.log log_rotation_age 1d log_rotation_size 100MB这一套配置能保证日志每天或者每100M自动切一个文件不会无限膨胀。数据目录单独放在一个挂载点日志再放到另一个目录两个分区各管各的谁写满都不影响谁。6.3 升级路径与后续维护方向PostgreSQL 18已经提供了比较成熟的跨版本升级工具以后从18升到19的时候基本流程是安装新版本二进制用pg_upgrade做数据迁移最后切换服务。所以现在安装18不会是一条死路后续升级完全可控。平时维护中VACUUM和ANALYZE这类操作建议做成定时任务别等着数据库自己处理那些看不见的膨胀。对于刚接触18的人来说装上之后先跑一个pgbench压测测试一下环境确认硬件和配置的匹配程度再正式交付业务方这会省掉很多后续排查的麻烦。我个人在实际安装中有一个习惯就是每次装完都会先看一眼pg_stat_activity视图确认没有异常会话再快速的刷一遍SHOW shared_buffers;、SHOW max_connections;、SHOW port;这三个命令把环境和预期值比对一次。数据库这种东西第一次配置对了后面能少熬很多个夜。希望这篇安装笔记能让你在PostgreSQL 18的起步阶段顺畅一点。