CentOS 7安装PostgreSQL 15保姆级教程:从源码编译到远程连接实战
在CentOS 7上安装PostgreSQL是我这些年干过最多的服务器基础工作之一。不少团队的线上机器至今还是CentOS 7新项目要接PostgreSQL第一件事往往就是找一台干净服务器把库先跑起来。这篇文章把整套流程从头到尾捋了一遍选择版本、配置软件源、初始化数据库集群、修改监听和认证配置、远程连接、常见故障排查全部基于一台全新CentOS 7系统用官方Yum源安装PostgreSQL 15。适合刚接触Linux的新手运维也适合准备从MySQL或Oracle迁移到PostgreSQL、需要在一台旧服务器上快速搭库的开发者参考。1. 先理顺安装思路版本、方式与风险点1.1 为什么要选官方PGDG源而不是系统自带源CentOS 7默认的yum源里其实也有postgresql-server如果你直接执行yum install postgresql-server装完大概率是9.2版。这是2012年的版本早就停止维护了很多现代SQL功能比如更多JSON操作、分区表、MERGE语句一概没有。对业务开发和后期维护来说等于开着只剩老发动机的车能跑但极其吃力。PGDGPostgreSQL Global Development Group为RHEL/CentOS提供了官方维护的软件仓库同一套系统上可以安装多个大版本比如13、14、15、16、17。日常最稳妥的做法就是先把PGDG仓库装上再选择具体版本。这不是多一个选择的问题而是让你在生产环境里能用上仍在维护、有安全补丁的版本。如果你发现CentOS自带源里也能装PostgreSQL那只适合随便玩玩的场景真正跑业务宁可麻烦一点也要用官方源。1.2 版本选择从业务兼容性出发如果完全没有历史包袱新装建议直接用PostgreSQL 15或16。给几个参考PostgreSQL 152022年发布默认认证改为scram-sha-256SQL MERGE正式引入逻辑复制更加成熟是一个经过两年多验证的稳定版本。PostgreSQL 162023年发布在并行查询、逻辑复制、vacuum性能上继续优化。CentOS 7这种老系统上跑16也没有兼容性问题。PostgreSQL 17相对较新除非你对新特性有明确需求否则不建议一上来就上生产。版本发布年份主要变化适合场景PostgreSQL 142021增强vacuum、逻辑复制改进存量项目升级PostgreSQL 152022默认scram-sha-256、支持MERGE、逻辑复制增强新装生产库首选PostgreSQL 162023并行查询和IO性能提升、逻辑复制增强需要更高性能的新项目PostgreSQL 172024查询优化和WAL等改进测试、新特性尝鲜如果项目里还有很老很老的客户端和驱动要格外注意加密认证方式的变化。PG 15以后默认是scram-sha-256个别老客户端只支持md5连接时会报认证方式不匹配。这时候要么升级客户端驱动要么在pg_hba.conf里为老客户端单独配置md5规则二选一没有别的捷径。1.3 安装方式对比rpm、源码编译和Docker装了这么多年数据库我的观点始终是用最朴素的方式往往最可靠。RPM/Yum方式安装快服务由systemd直接管理路径规范后续升级一条yum update就能完成。绝大多数团队都该用这种方式。源码编译好处是能自定义编译参数比如指定安装目录、启用特定模块。代价是要自己处理编译依赖和后续升级生产环境维护成本明显偏高。Docker方式适合快速试用和开发环境隔离。但容器带来的数据卷管理、网络模式、开机自启、资源限制这些问题对小团队来说都是额外学习成本。如果只是要在CentOS 7上把数据库装好给应用用容器并不是必要条件。所以下面所有操作都采用Yum方式从第2节开始正式进入环境准备环节。2. 环境准备把系统状态先捋清楚2.1 基础环境检查项动手安装之前花几分钟把系统状态过一遍能避免装到一半莫名其妙失败。第一步确认系统版本cat /etc/redhat-release看到CentOS Linux release 7.x再继续。如果你用的是其他系统大版本下面部分命令需要相应调整。第二步检查网络ping -c 3 mirrors.aliyun.com装软件源、下载rpm包都需要外网。如果服务器在内网且没有代理通道就得先把yum换成内网镜像或者准备好离线安装包否则后面每一条安装命令都会卡在下载上。第三步看磁盘和内存df -h free -hPostgreSQL的数据目录默认放在/var/lib/pgsql/15/data必须保证这个分区有足够空间。最小安装加一个小业务10GB空闲算起步能多留尽量多留。内存方面2GB以下的机器跑PG会有点勉强开发测试至少要有1GB可用内存生产环境建议4GB以上。你后面调shared_buffers参数时内存大小直接决定了能分给PostgreSQL多少缓存。第四步检查SELinux状态getenforce如果输出Enforcing可以先临时执行setenforce 0方便安装测试。生产环境不建议直接关闭SELinux更稳妥的方式是让SELinux对PostgreSQL的数据目录和端口放行这个在第4.3节讲远程连接时会再提到。2.2 配置PGDG源与常用组件CentOS 7最容易被坑的是系统yum源过期问题。CentOS 7停止维护后很多默认镜像源已经失效直接yum install会报各种404或元数据错误。遇到这种问题先切换到一个还在维护的镜像源比如阿里云镜像curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo yum clean all yum makecache这一步不是必需但如果你的yum在装包时频繁报错大概率就是源出了问题。接着安装EPEL仓库和PGDG仓库yum install -y epel-release yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm装完验证一下yum repolist | grep pgdg能看到pgdg-common、pgdg15等仓库记录说明配置成功。这里解释一下为什么要先装epel-releasePGDG的rpm包依赖一些EPEL里的软件包而epel-release本身也会把EPEL源点亮。如果漏掉这一步后面安装时容易出现依赖解析失败提示找不到某些库文件。顺序虽然简单但很多人踩过这个坑。3. 正式安装与数据库集群初始化3.1 安装PostgreSQL 15服务器软件源准备好之后安装只有一条命令yum install -y postgresql15-server postgresql15-contrib很多教程只写postgresql15-server但我强烈建议把postgresql15-contrib也装上。contrib包里包含大量常用扩展和工具例如pg_stat_statements性能监控必备、citext、uuid-ossp、pg_prewarm等后续大概率用得上。等真用到的时候再补装也能装但一次性装好少折腾。安装完成后先记住几个关键路径路径/名称作用/usr/pgsql-15/bin/可执行文件目录psql、pg_dump、initdb都在这里/var/lib/pgsql/15/data/数据库数据目录所有库表文件都在这里面/var/lib/pgsql/15/backups/默认备份目录postgresql-15.servicesystemd服务名称postgres用户安装时自动创建的数据库超级用户很多新手在这一步会到处找不到psql因为PATH里没有/usr/pgsql-15/bin。建议先把环境变量加上echo export PATH\$PATH:/usr/pgsql-15/bin /etc/profile source /etc/profile这样在任意目录下都可以直接用psql命令。3.2 初始化数据目录理解initdb在做什么rpm包安装完成后PostgreSQL不会自动创建数据目录。你需要先执行/usr/pgsql-15/bin/postgresql-15-setup initdb这一步的本质是调用initdb程序在/var/lib/pgsql/15/data下生成一整套初始数据文件postgresql.conf、pg_hba.conf、PG_VERSION、系统数据库template0、template1、postgres以及大量事务日志相关的文件。你可以把initdb理解成给数据库“格式化磁盘”装好软件只相当于拿到一台裸机initdb之后才有能用的操作系统。如果不想用封装脚本也可以手工执行su - postgres -c /usr/pgsql-15/bin/initdb -D /var/lib/pgsql/15/data注意两个要点。第一数据目录的属主必须是postgres用户第二initdb必须以postgres用户身份执行。用root强行初始化通常会在后续启动时报权限错误因为PostgreSQL服务进程拒绝以root身份运行这是PG出于安全考虑的一条硬性限制。建议初始化时明确指定字符集和区域su - postgres -c /usr/pgsql-15/bin/initdb -D /var/lib/pgsql/15/data -E UTF8 --localeen_US.UTF-8如果你的系统没装en_US.UTF-8的locale也可以改成--localeC或者不指定但强烈建议UTF8编码避免后续中文乱码和排序怪异问题。如果初始化时提示数据目录非空比如/var/lib/pgsql/15/data already contains data说明目录里有旧文件。全新服务器可以直接清空再初始化rm -rf /var/lib/pgsql/15/data/*再执行初始化。再次强调这个操作会删除已有数据只能用于确认没有重要数据的新环境千万别在正式库上试。3.3 启动服务与设置开机自启初始化完成之后启动服务systemctl start postgresql-15 systemctl enable postgresql-15然后验证状态systemctl status postgresql-15 ss -tlnp | grep 5432看到Active: active (running)并且5432端口处于LISTEN状态说明服务已经起来了。第一次进入数据库推荐用系统用户切换的方式su - postgres psql默认情况下本机的postgres系统用户可以通过peer认证直接登录本地数据库不需要密码。这是PG初始设计的安全思路系统层面的用户身份帮你兜底外人没有系统账号是进不来的。在psql里执行SELECT version();看到PostgreSQL 15.x的输出安装就算彻底成功了。4. 基础配置与远程连接打通4.1 postgresql.conf监听地址与关键参数调整默认配置下PostgreSQL只监听本机也就是listen_addresses localhost这是最安全的状态。但如果你需要让另一台服务器上的应用连接过来就必须修改监听地址。编辑配置文件vim /var/lib/pgsql/15/data/postgresql.conf修改listen_addresses *或者绑定具体内网IPlisten_addresses 192.168.1.10建议绑定具体IP比*更安全。如果服务器有多个网卡而你只想让内网某个地址访问这个习惯能减少很多不必要的暴露面。还有几个基础参数值得顺手检查。port 5432默认端口了解在哪里改就行。shared_buffers默认128MB对8GB内存的机器可以调到2GB左右通常设为物理内存的25%即可不要贪大太大会增加系统和数据库进程之间的协调开销。max_connections默认100应用连接数需求高再调注意这个参数和shared_buffers一样修改后需要重启服务。修改完配置文件后重启systemctl restart postgresql-15如果懒得分两次操作可以把上面几个参数改好之后一次性重启。4.2 pg_hba.conf认证方式与访问控制光改监听还不够PostgreSQL还有第二道关卡pg_hba.conf。这个文件负责控制哪些IP、哪些用户可以访问以及用什么认证方式。文件位置vim /var/lib/pgsql/15/data/pg_hba.conf默认内容里可以看到几行本地访问规则重点是理解每行的字段含义# TYPE DATABASE USER ADDRESS METHOD local all all peer host all all 127.0.0.1/32 scram-sha-256在文件末尾追加允许内网访问的规则host all all 192.168.1.0/24 scram-sha-256这行的意思是允许来自192.168.1.0/24网段的客户端以任意数据库、任意用户名连接认证方式为scram-sha-256。如果只是临时测试可以临时把网段放宽到0.0.0.0/0但生产环境不要这么干。宁可多写几条精确规则也别把数据库裸奔到公网。这里扩展一下认证方式trust不校验密码仅限localhost调试。peer使用Linux系统用户名匹配数据库用户名适合本地连接。md5老版本默认目前不推荐。scram-sha-256PG 14及以后版本的默认选择安全性更高。改完pg_hba.conf不需要重启数据库重载即可systemctl reload postgresql-15在psql里执行SELECT pg_reload_conf();效果也一样。记住能用reload解决的事就不要restartrestart会断开所有正在执行的连接。4.3 防火墙、SELinux与云安全组Linux侧的口子都打开之后还有几个容易被忽略的关卡。第一道是firewalld防火墙。CentOS 7默认可能开了firewalldfirewall-cmd --permanent --add-port5432/tcp firewall-cmd --reload确认放行firewall-cmd --list-all如果你的服务器用的是iptables而不是firewalld就需要编辑iptables规则放行5432。检查方式是systemctl status firewalld和systemctl status iptables看哪个是激活状态。第二道是SELinux。如果getenforce输出Enforcing且远程连接还是不通可以先临时关闭SELinux验证setenforce 0如果关闭后能连说明是SELinux策略拦截。这时候不要图省事永久关闭而是用semanage给数据库端口放行yum install -y policycoreutils-python semanage port -a -t postgresql_port_t -p tcp 5432然后重新setenforce 1继续使用正常的SELinux防护。第三道是云平台的安全组。如果你用的是各大云厂商的云主机控制台里的安全组或防火墙规则也要放行5432的入方向端口。这个问题特别容易踩本地防火墙全部放开了云安全组没放行外网依然连不上。5. 常见问题与排查实录5.1 服务启动直接失败怎么查新手最容易遇到的错误长这样Job for postgresql-15.service failed because the control process exited with error code. See systemctl status postgresql-15.service and journalctl -xe for details.遇到这个提示不用慌按顺序查三步。第一步看服务状态systemctl status postgresql-15.service第二步看系统日志journalctl -u postgresql-15 -n 50第三步看PG自己的日志文件tail -n 50 /var/lib/pgsql/15/data/log/*.log我碰到过的常见原因有这么几类数据目录权限不对确认/var/lib/pgsql/15/data的属主是postgres。数据目录为空或初始化没完成重新执行initdb。端口被占用ss -tlnp | grep 5432看看是哪个进程占用了端口。磁盘满了df -hPG在磁盘满时会拒绝启动。配置文件语法写错改错listen_addresses或pg_hba.conf后重启最容易起不来。其中配置文件语法写错是阻力最大的错误。建议每次改完配置先执行su - postgres -c /usr/pgsql-15/bin/pg_ctl -D /var/lib/pgsql/15/data configtest如果有语法错误它会直接告诉你哪一行有问题省得你反复重启。5.2 psql命令找不到、权限不足类问题如果你输入psql提示command not found多半是PATH没包含/usr/pgsql-15/bin。解决办法export PATH$PATH:/usr/pgsql-15/bin想永久生效就写入/etc/profile后重新登录。另一个典型问题是这类报错could not change directory to /root: Permission denied这是因为你用postgres用户登录但当前工作目录在/rootpostgres没有权限进入。最省事的办法是执行su - postgres之后再去psql让工作目录切到postgres用户自己的家目录。还有用户会碰到FATAL: Peer authentication failed for user xxx。这个报错通常是因为连接时pg_hba.conf匹配到了local或peer认证规则而远端连接不可能通过peer认证。确认你使用的是127.0.0.1或内网IP地址并且规则匹配的是scram-sha-256那一行而不是local那一行。5.3 远程连不上的四层排查法远程连不上算是PostgreSQL新手里最高频的问题了。我的经验是别瞎猜按层次逐一排查。现象可能环节排查命令/方法Connection refused服务未启动或未监听ss -tlnp | grep 5432No route to host防火墙拦截firewall-cmd --list-allFATAL: no pg_hba.conf entry for hostpg_hba.conf缺少客户端IP规则查看pg_hba.conf结尾规则FATAL: password authentication failed密码错误或认证方式不对确认密码和scram-sha-256配置云主机外网IP不通云安全组未放行到云控制台检查安全组入方向如果本机能连、远程连不上而防火墙和云安全组都放行了重点去看pg_hba.conf里的匹配顺序。pg_hba.conf是从上到下匹配的如果前面有一条很宽松的规则提前命中后面更精确的规则就不会生效。建议把具体网段规则放在文件末尾同时避免出现重复的数据库名和用户名组合。5.4 忘记密码、重复初始化等恢复操作忘记数据库超级用户密码这种事谁都遇过。恢复思路很简单临时放行本地免密登录改完再收回去。第一步修改pg_hba.conf中本机认证方式host all postgres 127.0.0.1/32 trust第二步重载配置systemctl reload postgresql-15第三步登录并修改密码psql -h 127.0.0.1 -U postgres ALTER USER postgres PASSWORD 新密码;第四步把pg_hba.conf改回scram-sha-256再次reload。注意密码字符串在PG里经过加密存储ALTER USER之后旧密码立即失效。不要试图直接改数据文件里的密码字段那只会把整个集群搞坏。另一个经常遇到的需求是重新初始化数据目录。如果是刚装好、里面没有业务数据整个过程可以很干脆systemctl stop postgresql-15 rm -rf /var/lib/pgsql/15/data/* /usr/pgsql-15/bin/postgresql-15-setup initdb systemctl start postgresql-15但如果有业务数据这步是绝对禁手。任何初始化操作前都必须先备份整个data目录或做逻辑导出。6. 安装完成后的检查清单与后续扩展6.1 安装后的第一轮安全配置服务能跑、能远程连接不等于安装已经结束。我给新装环境定了一个安全检查清单照着做一遍能省掉后面很多麻烦。第一给postgres数据库超级用户设置强密码ALTER USER postgres PASSWORD 至少12位的强密码;第二不要直接拿postgres账号跑业务。创建一个普通用户和专属数据库CREATE USER appuser WITH PASSWORD 应用专用密码; CREATE DATABASE appdb OWNER appuser;业务连接统一使用appuser权限按最小化原则分配。如果你从MySQL转过来这个习惯尤其要养成MySQL里root直接用很常见但PostgreSQL的超级用户权限太大了业务账号和超管账号分开是底线。第三检查pg_hba.conf里有没有过度宽松的规则。0.0.0.0/0这种写法只能出现在测试环境生产环境必须换成具体网段。第四确认数据库端口没有暴露在公网。用ss -tlnp或nmap做一次简单自检如果5432可以从公网访问立即修改防火墙或云安全组规则。6.2 常用运维操作速查安装完成后日常运维会用到这些命令直接复制使用。启动、停止、重启、重载systemctl start postgresql-15 systemctl stop postgresql-15 systemctl restart postgresql-15 systemctl reload postgresql-15命令行连接su - postgres psql -h localhost -U postgres -d postgres查看PG日志PG 15默认输出到data/log目录tail -f /var/lib/pgsql/15/data/log/*.log逻辑备份与恢复pg_dump -h localhost -U postgres -d appdb /var/lib/pgsql/15/backups/appdb_$(date %F).sql psql -h localhost -U postgres -d appdb /var/lib/pgsql/15/backups/appdb_2025-01-01.sql升级大版本时常规做法是pg_dump导出加导入新库或者使用pg_upgrade工具后者的细节比较多旧版本升新版本时再单独研究。6.3 下一步可做的扩展方向PostgreSQL装好只是开始。接下来要上生产可以往这几个方向走。第一主从复制。PG自带的流复制Streaming Replication可以搭一主一从从库主要用于读流量扩展和故障切换。核心流程是主库开启wal_levelreplica并创建复制账号从库用pg_basebackup拉取基础备份再配置standby模式。如果业务需要跨机房或跨库同步还可以研究逻辑复制PostgreSQL 15之后逻辑复制已经相当成熟。第二高可用和自动切换。如果需要更可靠的故障切换可以上Patroni加etcd这套架构这是目前PostgreSQL高可用的主流方案之一。它需要额外的分布式一致性组件整个体系的学习成本比单库高不少适合有一定运维储备的团队。第三数据库结构对比和迁移工具。如果是从Oracle或MySQL迁过来除了关注SQL语法差异还要把表结构、约束、函数差异摸清楚。Python写的migra工具适合PostgreSQL之间的结构对比能自动生成差异迁移脚本省不少手工活。Oracle和PostgreSQL的语法差异也比较大比如空字符串与NULL的处理、双引号与大小写敏感度、序列与自增列的定义方式迁移前需要专项梳理。MySQL和PostgreSQL的差异同样明显事务隔离级别、数据类型、SQL模式都不一样直接拿MySQL的建表语句往PG里跑大概率会报语法错误。另外提醒一句如果你所在的团队有国产化替代需求在麒麟V10这类系统上安装PostgreSQL的思路和CentOS 7差别不大rpm安装加initdb改配置文件流程基本通用。最后再分享一个我自己的操作习惯每次装完PostgreSQL我都会顺手做一次全量备份并恢复到临时库确认备份文件是真的能用而不是等到数据库出问题的那天才发现备份是坏的。这套安装流程我这些年反复操作过很多遍坑都是踩出来的。CentOS 7这台机器如今已经进入维护末期但你在它上面练熟的这些套路——源配置、初始化、认证文件、日志定位——换到更新的系统上依然是大同小异的地基。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →