网上关于PostgreSQL在Linux上的安装教程一抓一大把,但真正能做到“按步骤走,一次成功”的确实不多。我见过太多人在安装环节就被绕晕,要么卡在依赖缺失,要么栽在初始化数据目录的权限坑里,还有的装好了却连不上数据库、不知道怎么设置密码、搞不明白认证配置。这篇文章就是要解决这个问题——用最稳妥、最贴合实际生产环境的思路,把PostgreSQL在Linux上的安装从头到尾捋一遍,每一步都不跳过,每一步都告诉你为什么要这么做,踩过的坑也一并整理出来。
这篇文章适合谁看?刚接触Linux和数据库的新手、需要在服务器上自建数据库的开发者、以及给小团队搭建内部系统的运维朋友。无论你的Linux发行版是CentOS系还是Debian系,核心思路是通用的,我也会把两边的方法写到。看完之后,你照着操作,基本可以告别安装期翻车。
1. 安装前的准备:先想清楚三件事,能少走一半弯路
1.1 选择版本和安装方式:别盲目追新,也别硬啃源码
很多第一次装PostgreSQL的朋友,上来就搜“源码编译安装”,觉得这样显得专业。我的建议是:如果只是常规使用,需要快速跑起来,优先用官方提供的二进制包。原因很简单,源码安装需要自己处理编译器、依赖库、头文件,还要手动初始化系统服务脚本,整个过程对新手很不友好。对老手来说,源码安装也有优势,比如自定义安装路径、定制编译参数,但这些收益在日常开发环境里体现不出来。
版本选择方面,PostgreSQL每年发布一个大版本。新版本功能确实多,但你先想清楚自己要做什么:如果只是学习、练手、跑简单应用,选最新稳定版没问题;如果是要部署到生产环境,我倾向于选成熟稳定的中间版本,比如16或15系列。这类版本经过了大量bug修复,社区的踩坑记录也足够多,以后排查问题能搜到更多参考。同一个大版本的小版本号以社区发布为准,装最新的小版本即可,因为小版本更新通常包含安全补丁。
1.2 检查系统环境和依赖
安装之前,先确认系统版本和发行版。执行下面的命令:
cat /etc/os-release uname -m确认是CentOS/Rocky/RHEL类,还是Ubuntu/Debian类,后续用的命令和软件源不一样。另外确认网络环境能访问外网,因为要下载安装包和依赖。如果服务器在内网隔离环境,那只能配置本地源,这部分不在这里展开,逻辑是一样。
PostgreSQL主程序依赖一些公共库。包管理器一般会自动处理这些依赖,但如果遇到莫名报错,通常是缺了readline、zlib、libicu等组件。所以在安装之前,先把基础依赖装上比较放心:
CentOS/RHEL系:
sudo dnf install -y readline-devel zlib-devel libicu-develUbuntu/Debian系:
sudo apt update sudo apt install -y libreadline-dev zlib1g-dev libicu-dev这里需要注意,PostgreSQL从10版本开始,初始化时默认使用数据校验和(data checksums),与libicu有关系。提前装好这些,能避免很多编译或初始化时的玄学报错。
1.3 确认数据目录的挂载位置
数据库的数据文件是最宝贵的资产,安装前最好想好数据放哪里。机械时代传统做法是把数据目录放在单独的数据盘,SSD时代虽然没那么严格,但建议是:如果服务器有专门的数据库盘或大容量分区,把数据目录分出去,不要放在根分区下,尤其是不要和系统日志放在同一个分区,防止日志刷爆磁盘影响数据库服务。
另外,PostgreSQL默认不允许以root用户运行服务,这是出于安全考虑。安装包会自动创建postgres系统用户,但数据目录的属主需要提前规划好。假如你打算把数据放到/data/pgsql,要先准备好这个目录并修改属主为postgres:
sudo mkdir -p /data/pgsql sudo chown -R postgres:postgres /data/pgsql我自己的习惯是把数据目录独立出来,并在一个单独的挂载点上,这样以后做备份、迁移、扩容都方便。这个决定在安装完成后不容易调整,所以提前做。
2. 核心安装过程:一步步操作,把服务跑起来
2.1 配置官方软件源并安装
不同发行版使用不同包管理方式,但推荐的共同点是使用PostgreSQL官方发布的软件源,不要用系统自带的源里那个很老的版本。
CentOS/RHEL系(以Rocky Linux 9为例):
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo dnf -qy module disable postgresql sudo dnf install -y postgresql16-server这里有两个关键点。第一,module disable postgresql很重要,因为系统自带的AppStream模块源里也有一个postgresql,如果不先禁用,dnf可能装成系统自带的那个旧版本。第二,安装包名字里的16表示大版本号。如果你选择其他大版本,把postgresql16-server换成对应版本即可。
Ubuntu/Debian系(以Ubuntu 22.04为例):
sudo apt install -y postgresql-common sudo /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -y sudo apt update sudo apt install -y postgresql-16这个流程先把官方仓库脚本装上,执行一次之后仓库就配好了,后面直接普通安装,过程比较顺畅。
2.2 初始化数据目录:这一步很多人栽跟头
安装完成后,服务不会自动启动,需要先初始化数据目录。这个动作干的事是:创建数据目录结构、生成默认配置文件(postgresql.conf、pg_hba.conf)、创建默认数据库和模板库。有几个常见问题需要特别注意。
第一,必须以postgres用户身份执行初始化,绝对不能sudo直接跑。第二,如果你的操作系统初始化脚本已经自动完成了数据目录初始化,就不要再手动重复执行一次,否则会报错说数据目录非空。
CentOS系安装postgresql16-server后,可以这样初始化:
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb这个脚本会自动以postgres用户执行initdb,并把数据目录设置在默认位置/var/lib/pgsql/16/data。假如你自己规划了其他数据目录,比如/data/pgsql,可以设置环境变量指定:
sudo PGDATA=/data/pgsql /usr/pgsql-16/bin/postgresql-16-setup initdbUbuntu系的初始化略有不同。apt安装后,会自动创建一个名为main的集群并完成初始化,你可以直接启动服务。但如果想自定义数据目录,需要用pg_createcluster命令重新创建,这个等用到的时候再说。先按默认的跑通。
验证一下数据目录是否初始化成功:
sudo ls -l /var/lib/pgsql/16/data/base正常情况下,base和global目录存在,就说明初始化完成了。
2.3 启动服务并设置开机自启
初始化完成之后,启动服务就简单了,用systemd管理:
CentOS系:
sudo systemctl start postgresql-16 sudo systemctl enable postgresql-16Ubuntu系:
sudo systemctl start postgresql sudo systemctl enable postgresqlenable的意思是设置开机自启。启动后查一下状态:
sudo systemctl status postgresql看到active(running)就OK了。然后试着用本地连接验证一下:
sudo -u postgres psql -c "SELECT version();"如果能输出版本信息,说明整个安装链是通的。这里用sudo -u postgres切换用户是连接数据库的标准姿势,因为默认的本地认证方式是peer,意思是数据库用户和操作系统用户同名才允许登录。
3. 安装后的核心配置:改密码、调认证、看参数
3.1 修改数据库超级用户密码
安装完数据库,默认超级用户叫postgres,但密码是随机生成或者未设置的,在本地用peer认证登录时不需要密码。为了安全,建议登录后立刻设置密码:
sudo -u postgres psql进入psql交互界面后执行:
ALTER USER postgres WITH PASSWORD '你的强密码';设置完成后,输入\q退出。需要注意的是,这里设置的是数据库用户密码,不是Linux系统用户密码。之后通过TCP/IP方式连接、或者用图形化工具连接数据库时,都需要用到这个密码。
3.2 pg_hba.conf 认证配置详解
安装后遇到最多的坑就是“能本地连,远程连不上”或者明明密码正确却报认证失败。这些问题九成出在pg_hba.conf上。这个文件控制客户端认证规则,默认配置在/var/lib/pgsql/16/data/pg_hba.conf或/etc/postgresql/16/main/pg_hba.conf。
先看一下默认配置长什么样:
sudo cat /var/lib/pgsql/16/data/pg_hba.conf默认有几个重要规则:
local all postgres peer:本地unix套接字连接,postgres用户走peer认证。host all all 127.0.0.1/32 trust:本机回环地址TCP连接,直接信任,不需要密码。host all all ::1/128 trust:IPv6本机回环连接,信任。
生产环境不建议用trust认证,因为它意味着任何人都能免密连接。改成scram-sha-256认证更安全。做法是把这两行中的trust改为scram-sha-256:
host all all 127.0.0.1/32 scram-sha-256 host all all ::1/128 scram-sha-256如果需要允许局域网内其他机器连接,需要追加一行。比如公司内网网段是192.168.1.0/24:
host all all 192.168.1.0/24 scram-sha-256改完文件之后要重启或者重载配置才能生效:
sudo systemctl reload postgresqlreload是平滑重载,不需要断开现有连接。这是最常用的方式。
3.3 postgresql.conf 核心参数初调
很多人安装完就不管配置文件了,跑起来倒是没问题,但稍微大一点的表查询就明显变慢。这并不是机器性能问题,往往是几个关键参数没有设置。
配置文件位置和pg_hba.conf同目录,名字叫postgresql.conf。几个最基础、也需要重点关注的参数:
shared_buffers:共享缓冲区,PostgreSQL自己的内存缓存。建议设置为物理内存的25%左右,但不是越大越好,设置太大会让系统交换内存反而降低性能。work_mem:单个排序或哈希操作可用的内存。这个值不宜一次性设太大,因为它是在多个并发操作之间独立分配的,太大容易导致内存占用超标。max_connections:最大连接数。默认100,对大多数场景够用。如果应用并发高,可以适当调大,但也要注意内存占用。listen_addresses:默认是localhost,只接受本机连接。如果需要对外提供服务,改成*或者指定具体IP。
举个例子,一台内存16G、4核CPU的云主机,我一般这样起步配置:
shared_buffers = 4GB effective_cache_size = 8GB work_mem = 16MB max_connections = 200然后重启服务:
sudo systemctl restart postgresql注意,shared_buffers修改后需要重启,work_mem和max_connections重载即可生效。这里讲的只是入门,真正调优还要看pg_stat_statements和慢查询日志,是另一个话题。
4. 常见问题与排查技巧:装完连接不上怎么办
4.1 “psql: could not connect to server” 排查思路
这个报错是接触最多的。看到这个提示先别慌,按顺序查:
第一步查服务状态:
sudo systemctl status postgresql如果服务没起来,查看日志/var/log/postgresql/postgresql-16-main.log或journalctl -u postgresql。常见的启动失败原因有:数据目录权限不对、配置文件语法错误、端口被占用。
第二步查端口监听:
sudo ss -tlnp | grep 5432如果看不到5432监听,说明配置里listen_addresses或者端口设置有异常。检查配置文件确认port = 5432没有被注释。
第三步查防火墙。CentOS/RHEL系默认开着firewalld,如果手动挡了5432端口需要放行:
sudo firewall-cmd --add-port=5432/tcp --permanent sudo firewall-cmd --reloadUbuntu的云服务器一般看安全组规则,本机ufw可能没有默认启动,检查是否拦截了5432。
还有SELinux这个隐形坑。CentOS系默认SELinux是enforcing,如果自定义了数据目录路径,有可能触发selinux阻止postgres读取文件。临时测试可以执行sudo setenforce 0,但生产环境不要关掉SELinux,正确做法是调整上下文或写策略。
4.2 “FATAL: password authentication failed for user”
这个报错的意思是密码验证没通过,但你要区分是密码真的不对,还是认证方式根本不允许密码登录。
之前提到过peer认证模式下,本地连接根本不用密码。如果日志报这个错,先看pg_hba.conf里对应的规则。比如你从远程连接,但pg_hba.conf里没有匹配的远程规则,有些配置情况会fall back到reject或trust,导致连不上或者能连但不需要密码。
建议把非本机的连接规则明确加到pg_hba.conf中,并且使用scram-sha-256。同时确认密码也是用新版本加密方式保存的。在psql里查看:
SELECT rolname, rolpassword FROM pg_authid WHERE rolname = 'postgres';现在的PostgreSQL默认使用scram-sha-256,如果看到md5开头的密文,说明密码设置的时机比较早,重新ALTER USER设置一次即可。
4.3 安装时遇到依赖缺失怎么破
使用官方源安装的包依赖通常会自动解决,但在某些最小化安装的Linux发行版上,可能因为缺少libpq或uuid相关组件导致安装失败。我遇到比较多的情况是缺perl相关包,因为PostgreSQL安装时会运行一些perl脚本生成语言扩展。
处理思路很简单:根据报错信息用dnf或apt安装对应依赖包即可。比如缺libpq.so.5,就先执行sudo dnf install -y libpq,再回头安装postgresql-server。如果是包版本冲突,比如系统里已经有老版本PostgreSQL的部分组件,先卸载干净。
有个容易被忽略的点:安装完成后,psql命令可能不在默认PATH里。CentOS系会把二进制放在/usr/pgsql-16/bin,要在当前终端直接使用,可以添加环境变量:
echo 'export PATH=/usr/pgsql-16/bin:$PATH' >> ~/.bashrc source ~/.bashrcUbuntu系一般安装后psql就在/usr/bin/psql,没那么麻烦。
4.4 从安装到后续维护:一次成功只是开始
装好数据库只是第一步,后面还有备份、监控、版本升级一堆事情。这里给出两个基础维护建议:
第一,配置基础备份。至少要用pg_dump定时把需要的库导出到外部存储。可以先用一条命令验证备份通路:
sudo -u postgres pg_dump yourdb > /backup/yourdb_$(date +%F).sql后面可以加cron定时任务。更专业的场景用pg_basebackup做物理备份,按需要选择。
第二,关注日志。PostgreSQL运行日志会记录慢查询、错误连接、认证失败等信息,定期翻一翻,能提前发现很多隐患。默认日志目录在数据目录的log子目录,也可以配置logging_collector = on把日志集中收集。
还有一个容易踩的坑是系统升级或重启后,PostgreSQL没有自动启动。因为某些云镜像或者自定义环境里,systemd enable没有执行成功。所以在服务器重启后第一件事就是检查一下服务状态,确认一切正常再继续其他工作。
根据我个人这几年的使用经验,PostgreSQL安装过程中90%的问题都可以归结为三个原因:数据目录权限不对、认证配置和预期不符、依赖组件缺失。只要这三个方面处理前置,一次装成功的概率确实能大幅度提高。我自己的习惯是在装完系统后第一时间把数据目录、认证策略、内存参数这三样东西调好,后面基本不用再动。如果你也碰到过“照着教程做却连不上”的情况,大概率就是出在认证配置和数据目录权限这两块,可以重点往回排查。