1. 安装前必须排掉的三个雷网络、yum源、安装方式我见过太多人兴冲冲跑到服务器上第一行命令就是yum install postgresql然后装完一看版本是 9.2当场人就傻掉了。CentOS 7 自带仓库里那个 PostgreSQL 版本太老已经是博物馆文物级别而我们这次要装的是 PostgreSQL 14.0必须先把环境里的三个隐形雷排掉再动手。第一个雷是网络。很多 CentOS 7 机器尤其是刚从虚拟机模板克隆出来的网卡名是 ens33 或者 ens192但ip addr一看网卡根本没有 IP。原因往往是 NetworkManager 没有接管这张网卡或者/etc/sysconfig/network-scripts/ifcfg-ens33里的ONBOOT还是no。我在实际部署里至少有一半的安装失败是卡在这儿的——yum 源都连不上谈什么后面的事。遇到这种情况不要慌先按顺序做三件事查看网卡状态和当前 IPip addr show ens33如果没有 inet 段说明网卡没拿到地址。检查配置文件cat /etc/sysconfig/network-scripts/ifcfg-ens33确认ONBOOTyes和BOOTPROTOdhcp或静态 IP 设置正确。重启网络服务CentOS 7 里习惯用systemctl restart network或者你也可以用nmcli device reconnect ens33让 NetworkManager 重新拉起这张网卡。网络通了之后顺手验证一下外网可达性ping -c 3 mirrors.aliyun.com。这一步不是为了显摆你网络好而是确认 yum 仓库真的能访问。如果 ping 不通安装过程会一直卡在“Could not resolve host”之类的问题上你连敲门砖都没有。第二个雷是 yum 源本身。CentOS 7 官方源已经进入维护期很多时候速度感人甚至部分镜像站已经把老版本的包挪到冷存储了。我的建议是安装前先配置一个国内镜像比如阿里云、清华或者中科大的源。配置本地 yum 源或镜像源的方式很简单核心就是修改/etc/yum.repos.d/CentOS-Base.repo里的baseurl把官方地址替换成镜像地址然后执行yum clean all yum makecache重新生成缓存。这一步做完后面的安装过程至少快三倍以上。第三个雷是安装方式的选择。同样是装 PostgreSQL 14.0有编译源码、用官方 Yum 仓库、用第三方源三种常见路径。很多人喜欢编译源码觉得“自己动手丰衣足食”但实际生产中我强烈不建议上来就编译。编译要解决一堆依赖、要等十几分钟、要自己处理 systemd 服务文件这些时间成本完全不值得。官方 Yum 仓库有现成的 RPM 包安装完服务脚本、环境变量都给你配好了这才是正经路子。详细对比我在下一节展开。先把上面三个雷排完你的环境才算真正具备了安装 PostgreSQL 14.0 的条件。2. 官方 Yum 仓库与源码编译我为什么总站在官方仓库这边先说结论在 CentOS 7 上装 PostgreSQL 14.0用官方 Yum 仓库是综合成本最低、后续维护最省心的方案。我把两种方式的核心差异列个表格一目了然对比项官方 Yum 仓库源码编译安装耗时3-5 分钟取决于网速15-30 分钟取决于编译参数依赖处理自动解决一条命令手动逐个解决缺一报错服务管理自带 systemd 单元和初始化脚本需要手动编写或额外配置升级路径yum update平滑升级需要重新 configure、make、make install默认目录/var/lib/pgsql/14/data标准化随你指定自己记着适合场景生产环境、团队协作、快速交付内核 patch、定制化编译、学习实验源码编译不是没用它适合两种人第一种是你要在 PostgreSQL 上打补丁改内核或改某个模块源码那必须走编译第二种是你要做深度的参数定制比如把安装目录全部放在某个专用磁盘上编译方式更灵活。但对绝大多数场景来说Yum 仓库直接装完就能用而且安装完之后的目录结构、服务脚本、数据目录都由官方维护遇到问题也好查文档。这里有个关键点官方 Yum 仓库的全称叫 PGDGPostgreSQL Global Development Group仓库。它和系统自带的 base 仓库是两回事你需要单独把它的 repo 文件引进来。很多人第一次装的时候直接搜到postgresql14-server这个包名但yum search却搜不到就是因为没有先引入 PGDG 仓库。再补充一个经验PGDG 仓库的包名规律是“postgresql”后面直接跟大版本号。14 就是postgresql14-server13 就是postgresql13-server不像 Debian/Ubuntu 那种postgresql-14中间带个横杠。这个细节看似小但确实坑过不少人照着旧习惯敲命令怎么都装不上还以为包不存在。选定官方 Yum 仓库这个方案后面所有步骤就清晰了。3. 跟着敲一遍CentOS 7 上 Yum 安装 PostgreSQL 14.0 的完整命令3.1 引入 PGDG 仓库第一步是下载并安装 PGDG 仓库的 RPM 包。CentOS 7 对应的包是pgdg-redhat-repo-latest.noarch.rpm下载地址在官方仓库的reporpms/EL-7目录下。我把实际执行的命令贴出来yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm注意这里 URL 里写的是EL-7不是EL-8也不是EL-9。CentOS 7 本质上就是 RHEL 7 的克隆版所以 PGDG 仓库直接认 RHEL 7 的包。如果你把 URL 拼错成 EL-8那安装时会出现一堆版本依赖错误大概率还没开始就结束。安装完仓库 RPM 之后系统里会出现/etc/yum.repos.d/pgdg-redhat-all.repo这个文件。你可以用cat打开看一眼里面按版本分好了 pqdg 相关配置。正常情况下执行yum list available postgresql14*就能看到一串可安装的包包括 server、client、contrib、devel 这些。3.2 安装服务端和客户端接下来执行安装命令yum install -y postgresql14-server postgresql14postgresql14-server是数据库服务端postgresql14是客户端工具集包括psql、pg_dump、pg_restore等。如果你后面要做开发或者搞扩展还可以顺手装上postgresql14-contrib里面有pg_stat_statements、uuid-ossp这类常用扩展yum install -y postgresql14-contrib装的过程中yum 会从 PGDG 仓库拉取依赖。这个时候如果你前面的 yum 源配置有问题装到一半可能会弹出 GPG key 确认提示。直接按y接受即可这些包的 GPG key 是 PostgreSQL 官方发布的可以信任。加上-y参数会在部分场景下跳过交互但 GPG key 首次导入时仍可能要确认一次正常现象。3.3 安装过程的常见中断点我实际按这个路径装过很多台机器列出几个最常见的中断点遇到了别慌仓库下载失败报Could not resolve host: download.postgresql.org。这是 DNS 解析问题先排查网络或者改成从镜像站点手工下载 RPM 到本地再安装。包冲突报file /usr/bin/psql conflicts。这是因为系统自带的postgresql包占了psql命令。解决办法是先卸载旧包yum remove -y postgresql postgresql-server或者使用yum swap把旧版本换走。依赖 libpq 版本不对这种情况多半是 PGDG 仓库和 base 仓库的某个包版本打架。推荐的做法是yum install -y postgresql14-server postgresql14 --disablerepobase先只用 PGDG 仓库来解决问题。装完之后你可以验证一下安装路径和版本ls /usr/pgsql-14/bin/ /usr/pgsql-14/bin/postgres --version如果看到postgres (PostgreSQL) 14.0的输出说明主体已经就位。下一步就是初始化数据目录这一步是新手翻车最多的地方。4. 初始化数据库与启动服务新版和旧版的行为差异很大4.1 初始化方式用官方 setup 脚本而不是手动 initdbPostgreSQL 9.x 时代很多教程会教你先su - postgres然后执行initdb -D /var/lib/pgsql/data。到了 14.0官方 RPM 包直接给你封装好了一个初始化脚本叫postgresql-14-setup路径在/usr/pgsql-14/bin/postgresql-14-setup。用它的好处是会把数据目录的所有权、SELinux 上下文、目录权限全部处理好省去一堆手工权限问题。实际执行就一条命令/usr/pgsql-14/bin/postgresql-14-setup initdb执行完以后屏幕会输出类似Data directory initialized之类的信息。默认的数据目录是/var/lib/pgsql/14/data。你在系统里看这个目录的属主会发现是postgres用户而不是 root这是必要的因为 PostgreSQL 不允许用 root 身份运行服务。这里有一个新手特别容易踩的坑如果你手动用 root 去su - postgres然后自己执行initdb极有可能把数据目录的属主搞乱或者权限设置不对导致后面systemctl start起不来。所以老老实实用官方脚本是最稳的。4.2 启动服务并检查状态初始化完成后启动服务就很简单了systemctl start postgresql-14 systemctl status postgresql-14如果看到绿色的active (running)说明服务正常。这时候你在本机执行psql --version大概率看到的是系统自带的旧版 psql注意别搞混。要进入 14.0 的环境建议把/usr/pgsql-14/bin加进 PATH或者直接用绝对路径。我更推荐顺手做一步配置echo export PATH/usr/pgsql-14/bin:$PATH /etc/profile.d/postgresql14.sh source /etc/profile.d/postgresql14.sh这样以后敲psql用的就是 14.0 的客户端了。很多人装完发现版本对不上就是这个 PATH 没配好。如果启动失败第一件事不是去改配置而是看日志。日志位置在/var/lib/pgsql/14/data/log/下文件名一般带日期。用下面命令查看最近日志tail -n 50 /var/lib/pgsql/14/data/log/*.log最常见的启动失败原因是初始化没完成就强行 start或者/var/lib/pgsql/14/data属主不是 postgres。前者的报错是FATAL: data directory /var/lib/pgsql/14/data does not exist后者是FATAL: could not open file ... Permission denied。前者回上一节重新 initdb后者执行chown -R postgres:postgres /var/lib/pgsql/14。4.3 连接本地实例的第一步服务起来以后第一次连接需要一个特别技巧。默认情况下 PostgreSQL 的超级用户是postgres但这个用户在操作系统层面的密码是锁定的你直接psql -U postgres大概率会报Ident authentication failed。正确做法是先切换到系统里的 postgres 账号su - postgres psql这样走的是 Unix socket 的 peer 认证不需要密码就能进。进入psql命令行后立刻给 postgres 用户设置一个数据库密码方便后续远程管理ALTER USER postgres WITH PASSWORD 你得自己换一个强密码;这一步不做后面配置远程连接的时候你会被反复折磨。数据库层面的密码和系统层面的密码是两个东西这里设置的密码才是连接数据库时要用的。5. 远程连接配置监听地址、认证、防火墙、SELinux 四道坎数据库装好本机能连上这才算完成了 40%。绝大多数人的真实场景是要从别的机器连过来比如从开发笔记本、从应用服务器。这时候就要过四道坎任何一道卡住远程连接必然失败。5.1 第一道坎postgresql.conf 的监听地址默认情况下PostgreSQL 只监听本机的回环地址127.0.0.1。你从远程连连的就是服务器的真实 IP但服务根本没监听那个地址自然连接不上。打开/var/lib/pgsql/14/data/postgresql.conf找到这一行#listen_addresses localhost把它改成listen_addresses **表示监听所有网卡地址。如果你只想让特定网段的机器连也可以写成具体的 IP比如192.168.1.100。改完配置后需要重启服务生效systemctl restart postgresql-14注意listen_addresses这个参数必须要 PostgreSQL 进程重启才能生效不是reload就能搞定。别问我为什么知道我在第一次配的时候就是只 reload然后花了半小时怀疑人生。5.2 第二道坎pg_hba.conf 的认证规则/var/lib/pgsql/14/data/pg_hba.conf是 PostgreSQL 的访问控制核心文件它的优先级很高而且是从上往下匹配的。文件尾部有几行默认配置我直接改成这样host all all 127.0.0.1/32 scram-sha-256 host all all 192.168.1.0/24 md5第一行保持本机走加密认证第二行是让局域网 192.168.1.0/24 网段的机器可以通过密码认证访问。认证方式这块我多说一句PostgreSQL 14 默认的密码加密方式已经变成了scram-sha-256比老版本的md5安全得多。所以推荐新装的实例一律用scram-sha-256别再用 md5 了。如果你不确定客户端支不支持可以先用md5过渡但后续建议尽快切到scram-sha-256。改完pg_hba.conf之后执行systemctl reload postgresql-14就能生效不需要重启。5.3 第三道坎防火墙放行 5432 端口CentOS 7 默认可能装了 firewalld也可能装的是 iptables。先确认一下服务状态systemctl status firewalld如果是 firewalld执行firewall-cmd --permanent --add-port5432/tcp firewall-cmd --reload如果是 iptables修改/etc/sysconfig/iptables在 INPUT 链加一行-A INPUT -p tcp --dport 5432 -j ACCEPT然后重启 iptables 服务。这一步的坑在于很多人firewall-cmd --add-port忘了带--permanent导致服务一重启或者 reload 之后规则就丢了。所以记住生产环境一定要带--permanent。5.4 第四道坎SELinux容易被忽略的隐形杀手CentOS 7 默认开启 SELinux而默认情况下 SELinux 对 PostgreSQL 监听自定义端口是有限制的。如果你用的是标准 5432 端口一般问题不大因为 PostgreSQL 的默认端口类型已经在 SELinux 策略里定义好了。但如果你为了安全把端口改成了 5433或者 15432 之类的非标准端口那么即使防火墙放了行SELinux 也会拦你而且报错往往很诡异——客户端连接超时服务器端日志里却什么都没有。解决办法是给 SELinux 打上端口标记semanage port -a -t postgresql_port_t -p tcp 5433如果semanage命令不存在需要先装策略管理工具yum install -y policycoreutils-python另外还有一个常见问题应用服务器和数据库服务器之间有 HTTP 反向代理或者中间件导致 SELinux 里httpd相关进程访问数据库被拒。这个用下面的命令解决setsebool -P httpd_can_network_connect_db on5.5 验证远程连接四道坎都过了以后从远程机器测试一下psql -h 192.168.1.100 -p 5432 -U postgres -d postgres这里-h指定服务器 IP-U postgres指定用户。连接时输入你在 psql 里设置的 ALTER USER 密码。如果这个命令成功说明你的 CentOS 7 上 PostgreSQL 14.0 真正具备了对外服务能力。6. 开机自启与绕不开的初始化配置远程连接通了不代表你的工作做完了。一台数据库服务器如果重启后不能自己起来那生产环境里是要出乱子的。6.1 设置开机自启CentOS 7 整套用的是 systemd所以自启就是一条命令systemctl enable postgresql-14这条命令会在/etc/systemd/system/multi-user.target.wants/下生成一个软链接指向postgresql-14.service。以后机器重启PostgreSQL 会自动拉起。验证一下当前状态systemctl is-enabled postgresql-14输出enabled就说明没问题了。有些老派运维习惯了chkconfig --add但 CentOS 7 里 chkconfig 已经被 systemd 逐渐替代就不用多折腾了。6.2 全局配置优化PostgreSQL 14.0 的默认配置属于“保守到让人心疼”的类型尤其是shared_buffers默认值很小。如果你把数据库当玩具用那无所谓但你要是把重要业务放上去至少改三个参数。修改方式是编辑/var/lib/pgsql/14/data/postgresql.conf下面是我在 4 核 8G 的服务器上常用的起步配置shared_buffers 2048MB effective_cache_size 6144MB max_connections 200参数含义简要解释一下shared_buffersPostgreSQL 自己管理的共享内存缓存池。通常设置为物理内存的 25%也就是 8G 内存配 2G 是比较合理的。effective_cache_size操作系统文件系统缓存的大小估算值用于给查询规划器作为参考。一般设置为物理内存的 75% 左右。max_connections最大连接数默认 100 够用但不够宽裕。注意这个参数调整需要重启不能只 reload。另外Linux 内核的共享内存参数也可能影响 PostgreSQL 启动。CentOS 7 默认的kernel.shmmax为 6871947673664G一般情况下足够。如果你设了超大shared_buffers启动时可能会报类似Cannot allocate memory的错误。解决办法是临时调整内核参数sysctl -w kernel.shmmax1073741824但这是运行时修改重启就没了。要持久化就写进/etc/sysctl.conf然后sysctl -p生效。这段内容在官方文档里写得不显眼但生产环境踩坑时却很重要。6.3 创建应用账号和业务数据库用超级用户 postgres 直连根库的方式不适合日常开发规范做法是建一个独立的业务账号和数据库。进入 psqlCREATE USER app_user WITH PASSWORD App2024stong; CREATE DATABASE app_db OWNER app_user; GRANT ALL PRIVILEGES ON DATABASE app_db TO app_user;这样 app_user 就拥有了 app_db 的全部权限。以后应用连接就用这个账号而不是 postgres 超级用户。安全角度来说数据库超级用户账号暴露出来的风险太高能不用就不用。这个习惯我建议越早养成越好不要图省事一直用 postgres 账号。6.4 备份习惯要趁早建立备份这件事等出问题的时候再想就晚了。PostgreSQL 14.0 最轻量的备份方式就是用自带的pg_dump。一行命令导出整个数据库/usr/pgsql-14/bin/pg_dump -h 127.0.0.1 -U app_user -d app_db app_db_backup_$(date %Y%m%d).sql恢复就更简单了/usr/pgsql-14/bin/psql -h 127.0.0.1 -U app_user -d app_db app_db_backup.sql这只是逻辑备份适合中小型业务。大型生产环境要做物理备份或流复制那是另一个话题但逻辑备份这层底是最基本的安全垫。7. 连不上的常见场景排错按链路逐层拆解这部分是我觉得最值得分享的。我发现不管装多少次每个人都会在某些环节卡一次而且卡住的位置高度相似。我直接把这些现象和对应解法列出来你遇到哪个对号入座就行。7.1 现象一psql: could not connect to server: No such file or directory这个报错一看像是文件不存在其实是连接端和服务器端没有对齐。常见原因有两个第一你没有切到 postgres 用户就执行 psql而当前用户的 socket 目录和 postgres 的 socket 目录不一致。解法要么su - postgres再敲psql要么连接时指定 socket 目录psql -h /var/run/postgresql -U postgres第二服务已经启动了但/var/run/postgresql这个 socket 目录不存在。这个目录在系统重启后可能被清空需要确认服务是否设置了正确的unix_socket_directories。在 postgresql.conf 里检查一下unix_socket_directories /var/run/postgresql7.2 现象二FATAL: password authentication failed for user postgres这个报错是认证方式出问题了可能的情况有几种。先后检查pg_hba.conf里对应的连接来源行。比如你是从本地 socket 连的文件里local all all peer这一行意思就是本机连接直接映射为操作系统用户根本不看密码。所以你psql -U postgres输密码没用必须让操作系统用户也是 postgres或者把这一行改成trust或md5。生产环境我建议保留peer本机连接就走系统账号远程连接才走密码。如果是远程连接报这个错多半是你在 5.1 节里没设过密码。回到 psql 里执行一遍ALTER USER postgres WITH PASSWORD 新密码;7.3 现象三远程 telnet 通但 psql 连不上这个现象最折磨人。telnet 192.168.1.100 5432能通说明防火墙和监听都没问题但执行psql -h 192.168.1.100 -U postgres就卡住或者报错。此时优先排查pg_hba.conf里的认证规则是否匹配了该来源 IP。PostgreSQL 的规则匹配是自上而下、按第一条匹配者生效的容易因为前面有一条host all all 127.0.0.1/32 reject把后续规则挡住或者因为网段写错导致走了拒绝规则。另外一个隐蔽原因是认证方式不兼容。PostgreSQL 14.0 默认使用scram-sha-256如果你客户端是比较老的 libpq 版本可能就只支持 md5两边对不上认证必然失败。解决方法是修改pg_hba.conf中对应行的认证方式为md5同时确认数据库里用户密码的加密方式。因为 PostgreSQL 14.0 新建的用户密码默认就是用scram-sha-256加密存储的你光改 hba 还不够还需要重新设置一次密码让它按照新认证方式存储SET password_encryption md5; ALTER USER postgres WITH PASSWORD 新密码;7.4 排查链路总结如果把上面内容浓缩成一个思路那就是按链路逐层排查客户端是否能到达服务器防火墙/网络→ 服务器是否在监听目标端口listen_addresses/端口→ PostgreSQL 是否接受该来源认证pg_hba.conf→ 密码和角色权限是否匹配。不要跳步骤也不要靠猜。我自己的习惯是先用telnet测端口再本机psql测服务然后远程psql -v加 Verbose 参数看详细握手信息psql -h 192.168.1.100 -U postgres -d postgres -vVerbose 模式会打印出更底层的连接日志能看出来卡在认证的哪个环节。这个方法帮我解决过不少疑难杂症建议你也养成这个习惯。最后分享两个实际操作中的小体会装 PostgreSQL 14.0 本身不难难的是人和人、系统和系统之间的差异。CentOS 7 环境里最典型的坑就是旧习惯和新版本特性打架。我因为用自己的老经验去套新版本也好几次绕了远路比如以为initdb是唯一初始化方式、以为 md5 还是默认加密、以为 reload 能改 listen_addresses。这些都是小事但累积起来就足以让一个下午变成凌晨。最后一个建议把/usr/pgsql-14/bin写进 PATH把常用 SQL 脚本、备份脚本放一起每次安装时留个简单笔记记录修改过的配置文件。等哪天你要搭第二台、第三台的时候就会发现之前的这些积累是真的值钱。数据库这东西装起来顺手跑起来稳定比什么都重要。