PostgreSQL 12.2 在 Linux 上的稳定部署与基础配置指南

📅 发布时间:2026/8/4 3:17:13
PostgreSQL 12.2 在 Linux 上的稳定部署与基础配置指南
1. 为什么选择PostgreSQL 12.2一个老兵的版本抉择如果你在Linux上折腾过数据库大概率绕不开PostgreSQL。今天我们不聊那些最新的15、16版本就聊聊这个看起来有点“老”的12.2。你可能要问现在都202X年了为什么还要装一个2020年初发布的版本这恰恰是我想分享的第一个经验版本的选择往往不是越新越好而是越稳越好。PostgreSQL 12系列是一个长期支持版本而12.2作为早期的小版本经过大量生产环境的验证其稳定性和可靠性是毋庸置疑的。很多企业的核心业务系统尤其是那些对数据一致性要求极高、架构相对稳定、不希望频繁进行大版本升级的场景依然在坚守12.x版本。对于学习、测试环境或者希望从一个成熟、文档和社区支持都非常完善的版本入手的新手来说PostgreSQL 12.2是一个非常理想的选择。它既包含了12版本引入的重要特性如GENERATED列、REINDEX CONCURRENTLY等又规避了早期12.0可能存在的微小问题。所以这次安装我们目标明确在Linux上干净、稳定、可复现地部署一个PostgreSQL 12.2服务。2. 战前准备环境清理与依赖检查在真正执行安装命令之前准备工作的重要性占到了整个过程的50%。盲目开始往往会陷入各种依赖缺失、端口冲突、用户权限的泥潭。我的习惯是像外科手术前消毒一样彻底清理和检查环境。2.1 系统环境确认与旧版本清理首先确认你的Linux发行版。虽然PostgreSQL官方为各大主流发行版都提供了仓库但不同发行版的包管理器和默认配置路径略有不同。本文将以最常见的CentOS/RHEL 7/8和Ubuntu 20.04为例进行讲解其他发行版可以举一反三。关键第一步检查并卸载可能存在的旧版本。这是避免后续各种诡异问题的根源。系统可能通过yum或apt安装过其他版本的PostgreSQL或者残留着陈旧的二进制文件。对于CentOS/RHEL系统# 检查已安装的PostgreSQL包 sudo yum list installed | grep postgresql # 如果发现旧版本使用remove命令卸载。注意这通常不会删除数据目录。 sudo yum remove postgresql*对于Ubuntu/Debian系统# 同样先检查 dpkg -l | grep postgresql # 卸载旧包 sudo apt-get --purge remove postgresql*注意--purge参数会同时删除配置文件如果你想保留配置进行参考可以不加此参数。但为了一个干净的安装我建议彻底清除。第二步处理残留的数据目录和用户。卸载包不会自动删除/var/lib/pgsql或/var/lib/postgresql下的数据文件也不会删除postgres系统用户。我们需要手动判断和处理。# 检查数据目录是否存在 sudo ls -la /var/lib | grep postgres # 检查postgres用户是否存在 id postgres如果数据目录存在且你不需要其中的数据可以将其备份后删除。postgres用户如果存在通常建议保留因为我们新安装的版本也会使用这个用户。2.2 安装依赖包PostgreSQL的运行和编译需要一些基础的系统库。虽然通过包管理器安装二进制包时大部分依赖会自动解决但提前安装核心依赖能确保过程更顺畅特别是如果你未来需要从源码编译扩展时。对于CentOS/RHEL 8sudo yum install -y gcc readline-devel zlib-devel对于Ubuntu 20.04sudo apt-get update sudo apt-get install -y build-essential libreadline-dev zlib1g-dev这里解释一下这几个依赖gcc / build-essentialGNU编译器集合是编译软件的基础。readline-devel / libreadline-dev提供命令行编辑和历史功能让psql客户端更好用。zlib-devel / zlib1g-dev压缩库PostgreSQL在某些场景下会用到。3. 三种安装路径详解从仓库到源码安装PostgreSQL 12.2主要有三种途径使用官方仓库、使用发行版自带仓库、以及从源码编译。每一种都有其适用场景和优缺点我为你详细拆解。3.1 方案一使用PostgreSQL官方仓库推荐这是最推荐给大多数用户的方案。PostgreSQL全球开发组为各个发行版维护了官方仓库里面的软件包更新及时与系统集成度好并且方便后续的小版本升级。对于CentOS/RHEL 8# 1. 安装PostgreSQL官方仓库的RPM包 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm # 2. 禁用系统自带的旧版PostgreSQL模块如果有 sudo dnf -qy module disable postgresql # 3. 安装PostgreSQL 12的服务器、客户端和贡献模块包 sudo dnf install -y postgresql12-server postgresql12-contribpostgresql12-contrib包包含了很多有用的扩展功能如pg_stat_statements性能监控、pgcrypto加密等建议一并安装。对于Ubuntu 20.04# 1. 导入仓库签名密钥 sudo apt-get install -y wget wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - # 2. 添加官方仓库源 # 注意Ubuntu代号是focal对应20.04 echo deb http://apt.postgresql.org/pub/repos/apt focal-pgdg main | sudo tee /etc/apt/sources.list.d/pgdg.list # 3. 更新包列表并安装 sudo apt-get update sudo apt-get install -y postgresql-12 postgresql-contrib-12这个方案的优点是省心、安全、易于管理。安装完成后服务管理、日志位置、数据目录都符合标准规范。3.2 方案二使用发行版自带仓库以Ubuntu 20.04为例其默认仓库里可能就有PostgreSQL但版本可能不是12.2而是稍旧或稍新的12.x小版本。你可以通过apt-cache policy postgresql查看。这种方法更简单但版本可能不是精确的12.2且更新可能滞后于官方仓库。3.3 方案三从源码编译安装这是最灵活、也是最复杂的方式。它允许你进行最精细的配置比如指定安装路径、编译参数或者打上特定的补丁。如果你有极强的定制化需求或者需要在无法连接外网的环境离线环境中部署源码安装是唯一选择。核心步骤# 1. 下载源码包 wget https://ftp.postgresql.org/pub/source/v12.2/postgresql-12.2.tar.gz tar -zxvf postgresql-12.2.tar.gz cd postgresql-12.2 # 2. 配置编译选项 # --prefix 指定安装目录例如 /usr/local/pgsql-12.2 # --with-blocksize 和 --with-wal-blocksize 等参数可以调整性能初学者保持默认即可 ./configure --prefix/usr/local/pgsql-12.2 # 3. 编译和安装 make sudo make install源码安装的注意事项环境变量安装后你需要手动将/usr/local/pgsql-12.2/bin和/usr/local/pgsql-12.2/lib添加到系统的PATH和LD_LIBRARY_PATH环境变量中否则系统找不到psql、pg_ctl等命令。初始化数据库簇需要手动使用initdb命令初始化数据目录并手动创建postgres用户和配置服务步骤远比包管理安装繁琐。维护成本后续的启动、停止、日志查看都需要自己写脚本或集成到系统服务中。除非你有明确的理由否则对于生产或学习环境我强烈建议使用方案一官方仓库。它能节省你大量时间并减少出错概率。4. 初始化数据库与基础配置无论通过哪种方式安装在安装包之后数据库服务并不会自动启动因为还没有初始化一个“数据库簇”。你可以把数据库簇理解为一个PostgreSQL实例管理的所有数据的集合它包含一个默认的postgres数据库、模板数据库template1以及相关的系统表。4.1 初始化数据库簇对于通过包管理器安装的情况通常有一个专门的命令或脚本来完成初始化。在CentOS/RHEL上sudo /usr/pgsql-12/bin/postgresql-12-setup initdb这个命令会使用默认参数初始化数据库簇数据目录通常位于/var/lib/pgsql/12/data。在Ubuntu上安装postgresql-12包时初始化过程通常是自动完成的。数据目录通常位于/var/lib/postgresql/12/main。如果没有自动初始化可以运行sudo pg_createcluster 12 main --start4.2 启动服务并设置开机自启初始化成功后就可以启动服务了。CentOS/RHEL (使用systemd)sudo systemctl start postgresql-12 sudo systemctl enable postgresql-12 # 设置开机自启 sudo systemctl status postgresql-12 # 检查服务状态Ubuntu (同样使用systemd)sudo systemctl start postgresql12-main # 注意服务名可能略有不同 sudo systemctl enable postgresql12-main sudo systemctl status postgresql12-main看到active (running)的状态就说明PostgreSQL服务已经成功在后台运行了。4.3 修改postgres用户密码与首次连接PostgreSQL安装后会创建一个名为postgres的系统用户同时也是数据库的超级管理员用户。默认情况下它使用peer或ident身份认证允许同名的系统用户无需密码直接登录。为了安全和使用方便我们第一步是切换到postgres系统用户然后为数据库的postgres用户设置一个密码。# 切换到postgres系统用户 sudo -i -u postgres # 此时会进入postgres用户的shell然后启动psql命令行客户端 psql # 进入psql后执行SQL修改密码 \password postgres执行\password postgres后会提示你输入新的密码。请务必设置一个强密码。修改密码后我们还需要调整一个关键的配置文件以允许使用密码进行远程或本地TCP/IP连接。4.4 配置访问权限pg_hba.confPostgreSQL的客户端认证由pg_hba.conf文件控制。这个文件决定了哪些主机、哪些用户、通过哪种方法可以连接到哪些数据库。找到你的数据目录如/var/lib/pgsql/12/data或/var/lib/postgresql/12/main编辑pg_hba.conf文件。sudo vim /var/lib/pgsql/12/data/pg_hba.conf在文件末尾你会看到类似下面的行# TYPE DATABASE USER ADDRESS METHOD local all all peer host all all 127.0.0.1/32 ident host all all ::1/128 identlocal行代表通过Unix域套接字连接peer表示使用操作系统用户名认证。host行代表通过TCP/IP连接。ident方法同样依赖于系统用户名。为了让我们能用密码从本地网络连接通常需要添加或修改一行。例如允许所有用户从服务器所在的任何IP地址0.0.0.0/0代表所有IPv4地址使用MD5密码认证连接所有数据库这是一种宽松的配置仅用于测试环境host all all 0.0.0.0/0 md5重要安全提示在生产环境中绝不应该使用0.0.0.0/0。你应该将其替换为具体的、需要访问数据库的客户端IP地址段例如192.168.1.0/24。并且考虑为不同的数据库和用户设置更精细的规则。4.5 配置监听地址postgresql.conf默认情况下PostgreSQL只监听本地回环地址127.0.0.1这意味着只能从数据库服务器本机连接。如果需要从其他机器访问需要修改postgresql.conf。找到并编辑postgresql.conf文件sudo vim /var/lib/pgsql/12/data/postgresql.conf找到listen_addresses参数默认可能是listen_addresses localhost将其修改为listen_addresses * # 监听所有IP地址或者指定具体的IPlisten_addresses localhost,192.168.1.100每次修改完pg_hba.conf或postgresql.conf后都必须重启PostgreSQL服务使配置生效sudo systemctl restart postgresql-12 # CentOS/RHEL # 或 sudo systemctl restart postgresql12-main # Ubuntu5. 基础操作与验证从连接到建库完成上述配置后你的PostgreSQL 12.2实例就已经就绪了。让我们进行一些基本操作来验证它工作正常。5.1 使用psql客户端连接psql是PostgreSQL自带的交互式命令行终端是与数据库交互最直接的工具。方式一使用postgres用户直接连接本地信任认证sudo -u postgres psql这种方式直接以数据库超级用户postgres身份进入psql无需密码因为走了local的peer认证。方式二使用密码通过网络连接psql -h 127.0.0.1 -U postgres -d postgres # 或从远程机器连接假设服务器IP是192.168.1.100 psql -h 192.168.1.100 -U postgres -d postgres执行后会提示输入密码输入之前通过\password设置的密码即可。进入psql后提示符会变成postgres##符号表示你是超级用户。5.2 执行基本SQL命令在psql提示符下你可以执行任何SQL语句。-- 查看所有数据库 \l -- 切换到某个数据库例如 template1 \c template1 -- 查看当前数据库中的所有表 \dt -- 创建一个新数据库 CREATE DATABASE mytestdb; -- 创建一个新用户并设置密码 CREATE USER myuser WITH PASSWORD StrongPassword123; -- 将新数据库的所有权限授予新用户 GRANT ALL PRIVILEGES ON DATABASE mytestdb TO myuser; -- 退出psql \q5.3 验证远程连接这是检验pg_hba.conf和postgresql.conf配置是否成功的关键一步。从网络中的另一台机器需要安装psql客户端尝试连接psql -h 你的PostgreSQL服务器IP -U postgres -d postgres如果连接成功并提示输入密码说明远程访问配置基本正确。如果失败请按以下顺序排查服务器防火墙是否放行了5432端口sudo firewall-cmd --list-ports或sudo ufw statuspostgresql.conf中的listen_addresses是否包含*或服务器IPpg_hba.conf中是否添加了对应客户端IP的host行且方法是md5或scram-sha-256服务是否已重启6. 性能与安全初步调优一个刚安装好的PostgreSQL默认配置是保守的旨在兼容各种低配环境。对于有明确用途的服务器进行一些基础的调优是必要的。6.1 内存相关参数编辑postgresql.conf以下几个参数对性能影响最大shared_buffers数据库服务器使用的共享内存缓冲区。通常设置为系统内存的25%。对于4GB内存的机器可以设置为1GB。shared_buffers 1GBeffective_cache_sizePostgreSQL查询规划器假设操作系统可用于磁盘缓存的内存大小。通常设置为系统总内存的50%-75%。对于4GB内存可以设置为2GB。effective_cache_size 2GBwork_mem用于排序和哈希表操作的内存。如果查询经常做复杂的排序且内存充足可以适当调大。默认值通常较低4MB。可以设置为16MB或32MB但注意这是每个操作可以使用的内存并发高时要谨慎。work_mem 32MBmaintenance_work_mem用于维护操作如VACUUM、CREATE INDEX的内存。可以设置得比work_mem大例如256MB。maintenance_work_mem 256MB6.2 安全加固建议修改默认端口可选在postgresql.conf中修改port 5432为其他端口可以减少被自动化工具扫描攻击的风险。限制超级用户除了postgres用户尽量不要创建其他超级用户。日常应用使用普通用户连接。定期更新密码为数据库用户设置强密码策略并定期更换。备份pg_hba.conf在对pg_hba.conf进行任何修改前先进行备份。一个错误的配置可能导致所有客户端包括你自己无法连接。使用SSL连接对于生产环境强烈建议配置SSL加密客户端和服务器之间的通信。这需要在postgresql.conf中配置ssl on并提供证书文件。7. 日常维护与故障排查入门安装只是第一步让数据库稳定运行更需要日常的呵护。7.1 常用维护命令查看日志日志是排查问题的第一现场。日志位置通常在数据目录的log子目录下或由系统journalctl管理。# CentOS/RHEL sudo journalctl -u postgresql-12 -f # -f 表示跟踪最新日志 # 或直接查看文件 sudo tail -f /var/lib/pgsql/12/data/log/postgresql-*.log # Ubuntu sudo journalctl -u postgresql12-main -f备份与恢复使用pg_dump进行逻辑备份。# 备份单个数据库 sudo -u postgres pg_dump mytestdb mytestdb_backup.sql # 恢复数据库 sudo -u postgres psql newdb mytestdb_backup.sql # 备份所有数据库全局对象 sudo -u postgres pg_dumpall all_backup.sql版本升级小版本对于通过官方仓库安装的12.2升级到12.x系列的最新版本通常很简单使用包管理器更新即可。但务必在升级前备份数据# CentOS/RHEL sudo yum update postgresql12-server # Ubuntu sudo apt-get update sudo apt-get install --only-upgrade postgresql-127.2 常见问题与解决思路无法启动服务首先检查日志。常见原因包括数据目录权限不对应属于postgres用户、端口被占用、配置文件语法错误。使用sudo systemctl status postgresql-12查看启动失败的详细原因。连接被拒绝错误信息包含no pg_hba.conf entry说明客户端的连接请求不符合pg_hba.conf中的任何一条规则。检查客户端IP、用户名、数据库名和认证方法。错误信息包含Connection refused说明网络不通或PostgreSQL服务没在监听该地址/端口。检查服务状态、listen_addresses配置和防火墙。内存不足如果看到与内存相关的错误可能需要降低shared_buffers等参数或者增加服务器物理内存。忘记postgres用户密码如果还能通过sudo -u postgres psql方式登录直接用\password修改。如果所有方式都失效需要暂时修改pg_hba.conf将local行的认证方法改为trust重启服务后无需密码即可登录修改密码后再改回md5或peer。这是一个危险操作完成后务必立即改回。安装和配置PostgreSQL 12.2的过程就像搭建一个精密仪器的基础平台。每一步的谨慎和清晰的理解都能为后续稳定、高效的数据服务打下坚实的基础。从选择版本开始到清理环境、选择安装方式、初始化配置、调整权限和性能参数最后到日常维护每一个环节都有其内在的逻辑和容易踩坑的地方。特别是pg_hba.conf和postgresql.conf这两个配置文件它们是PostgreSQL行为控制的枢纽花时间理解它们远比死记硬背命令更有价值。记住在Linux世界里日志是你的第一盟友遇到任何问题先看日志总能找到线索。