为啥有两个文件
ll /usr/lib/systemd/system/postgresql
postgresql.service postgresql@.service
这两个文件的存在是为了适应 PostgreSQL 在不同部署场景下的需求,分别对应单实例管理和多实例管理。
postgresql.service:标准单实例服务
这是最常见的 systemd 服务单元文件。
- 用途:用于启动和管理一个默认的 PostgreSQL 集群(通常对应默认的数据目录,如
/var/lib/postgresql/14/main或类似路径)。 - 使用场景:如果你的服务器上只运行一个 PostgreSQL 实例,或者你希望使用默认配置启动主实例,直接使用这个服务即可。
- 操作示例:
systemctl start postgresql systemctl enable postgresql
postgresql@.service:模板化多实例服务
注意文件名中的@符号,这是 systemd 的模板单元(Template Unit)机制。
- 用途:允许你在同一台服务器上启动和管理多个独立的 PostgreSQL 实例。
@后面的部分会被当作参数传递给服务脚本,通常用来指定具体的集群名称、版本或数据目录标识。 - 工作原理:当你执行
systemctl start postgresql@14-main时,systemd 会使用postgresql@.service作为模板,并将14-main作为实例标识符(Instance Identifier)代入,从而启动特定的那个实例。 - 使用场景:
- 你需要在同一台机器上运行不同版本的 PostgreSQL(如 PG 13 和 PG 15)。
- 你需要运行多个独立的数据库集群(例如,一个用于生产,一个用于测试,或者按业务拆分)。
- 操作示例:
启动名为 "14-main" 的特定实例 systemctl start postgresql@14-main 启动名为 "15-test" 的另一个实例 systemctl start postgresql@15-test
总结对比
| 特性 | postgresql.service | postgresql@.service |
|---|---|---|
| 类型 | 静态服务单元 | 模板服务单元 |
| 实例数量 | 通常管理一个默认实例 | 可管理多个命名实例 |
| 启动命令 | systemctl start postgresql | systemctl start postgresql@<实例名> |
| 典型用途 | 单机单库,简单部署 | 单机多库,多版本共存,复杂部署 |
| 配置关联 | 通常关联默认的数据目录 | 根据实例名查找对应的配置和数据目录 |
为什么同时存在?
Linux 发行版(如 Debian/Ubuntu, CentOS/RHEL 等)同时提供这两个文件,是为了兼顾简单性和灵活性:
- 对于大多数普通用户,只需使用
postgresql.service,简单直观。 - 对于高级用户或 DBA,可以通过
postgresql@.service灵活地管理多个实例,而无需为每个实例手动创建独立的服务文件。
如何查看当前正在运行的实例?
你可以使用以下命令查看哪些 PostgreSQL 实例正在运行:
查看所有 postgresql 相关的服务状态
systemctl list-units | grep postgresql
或者查看进程树
ps aux | grep postgres
如果你只看到一个默认的 PostgreSQL 服务在运行,那么很可能只有 postgresql.service 被启用了,或者某个特定的 postgresql@<name>.service 被启用了。
参考资料
[1] 深入解析PostgreSQL双配置文件机制:postgresql.conf与postgresql.auto.conf的协同工作-CSDN博客 - CSDN博客
[2] PostgreSQL 双配置文件的协同与实战:从 postgresql.conf 到 postgresql.auto.conf 的管理艺术-CSDN博客 - CSDN博客
[3] postgresql数据库–三个很重要的配置文件:postgresql.conf,pg_hba.conf和pg_ident.conf - 掘金 - 稀土掘金
[4] systemd服务详解-CSDN博客 - CSDN博客
[5] Systemd 服务文件(service)_systemd service-CSDN博客 - CSDN博客
[6] postgres 没有service 服务名 概念,只能在客户端进行配置-CSDN博客 - CSDN博客
[7] (二)PostgreSQL常用的配置文件(1)_postgresql.conf-CSDN博客 - CSDN博客
[8] PostgreSQL体系结构(上) - 墨天轮 - 墨天轮数据社区
[9] 第1 章 基础知识-图灵社区 - 图灵社区
[10] POSTGRESQL PG VS SQL SERVER 到底哪家强? (译) 应该是目前最全面的比较-腾讯云开发者社区-腾讯云 - 腾讯云
[11] 启动PostgreSQL数据库服务:后台服务进程类型各异,一个命令搞定 - 墨天轮 - 墨天轮数据社区
[12] 工作日志——mysql、pgsql、sqlServer部分差异体验_pgsql 超越 sqlserver-CSDN博客 - CSDN博客
[13] 从架构到成本,SQL Server 和 PostgreSQL 四大区别全方位解析! - 知乎 - 知乎
[14] Windows安装PostgreSQL避坑指南:服务注册、initdb与权限配置-CSDN博客 - CSDN博客
[15] Postgresql学习笔记 - 简书 - 简书社区
[16] 数据库 - PG Style! 盘点几个常用的 Postgres 环境变量 - 个人文章 - SegmentFault 思否 - 思否开发者社区
[17] PostgreSQL、MySQL、SQL Server三大数据库SQL差异大揭秘!EasyDapper更新助你轻松应对 - date28www.clicksun.com.cn
[18] postgreSQL常用命令_postgresql命令-CSDN博客 - CSDN博客
[19] Postgresql入门之psql用法详解(一)- 命令行参数详解-阿里云开发者社区 - 阿里云开发者社区
启用多个pg实例前,要先构建其数据目录吧
是的,启用多个 PostgreSQL 实例前,必须为每个实例构建独立的数据目录。
PostgreSQL 的“数据库集群”(Database Cluster)在文件系统层面表现为一个单独的数据目录,所有该实例的数据都存储在此目录下。每个运行的 PostgreSQL 进程(实例)都需要绑定到一个唯一且已初始化的数据目录。
以下是具体的操作步骤和最佳实践:
- 为什么需要独立的数据目录?
- 隔离性:每个实例拥有独立的配置文件(
postgresql.conf,pg_hba.conf)、事务日志(WAL)和数据文件。 - 端口冲突避免:不同实例通常监听不同的端口(如默认的 5432,第二个实例可用 5433 等),数据目录中记录了该实例监听的端口信息。
- 生命周期管理:你可以独立启动、停止、备份或升级某个实例,而不影响其他实例。
- 如何构建新实例的数据目录?
假设你要创建第二个实例,步骤如下:
第一步:创建目录并设置权限
建议不要直接使用挂载点的根目录,而是在其下创建一个子目录,并确保所有者是 postgres 用户。
创建数据目录
sudo mkdir -p /var/lib/pgsql/pg2
修改所有者为 postgres 用户 (具体用户名取决于发行版,通常是 postgres)
sudo chown postgres:postgres /var/lib/pgsql/pg2
确保权限正确 (通常为 700)
sudo chmod 700 /var/lib/pgsql/pg2
第二步:初始化数据目录
使用 initdb 命令初始化该目录。这将生成必要的系统表、配置文件和结构。
切换到 postgres 用户执行初始化
sudo -u postgres initdb -D /var/lib/pgsql/pg2
第三步:配置端口(关键)
默认情况下,新初始化的实例可能仍尝试使用默认端口 5432。如果第一个实例已经占用了 5432,你需要修改新实例的配置。
编辑新目录下的 postgresql.conf:
sudo nano /var/lib/pgsql/pg2/postgresql.conf
找到并修改以下行:
port = 5433 选择一个未被占用的端口
第四步:启动新实例
你可以使用 pg_ctl 手动启动,或者配置 systemd 服务来管理。
手动启动测试:
sudo -u postgres pg_ctl -D /var/lib/pgsql/pg2 -l /var/log/postgresql/pg2.log start
通过 systemd 管理(推荐):
如果你使用的是支持模板化服务的系统(如之前提到的 postgresql@.service),你可以这样启动:
假设服务模板能识别目录名称或需要额外配置指向该目录
sudo systemctl start postgresql@pg2
注意:具体的 systemd 服务文件名和配置方式取决于你的 Linux 发行版和 PostgreSQL 安装包。有些发行版可能需要你创建一个新的 service 文件或在 /etc/postgresql/ 下创建对应的配置文件夹。
- 最佳实践提醒
- 文件系统选择:任何支持 POSIX 语义的文件系统都可以用于 PostgreSQL 数据目录。
- 避免挂载点根目录:如果数据目录位于单独的磁盘或卷上,不要直接将挂载点(mount point)作为数据目录。最好在挂载点下创建一个子目录(如
/mnt/data/pg_data),这样可以避免因卷未挂载导致的权限问题或数据写入错误位置的风险。 - 资源隔离:运行多个实例时,请注意内存(
shared_buffers,work_mem)和 CPU 资源的分配,避免多个实例争抢资源导致性能下降。
总结:每个 PostgreSQL 实例必须对应一个经过 initdb 初始化的独立数据目录。
参考资料
[1] PostgreSQL: Documentation: 18: 18.2. Creating a Database Cluster - PostgreSQL官网
[2] 18.2. Creating a Database Cluster - repository.cybertec.at
[3] 19.2. Creating a Database Cluster - repository.cybertec.at
[4] How to Change the Default Port in PostgreSQL - GeeksforGeeks - GeeksforGeeks官网
[5] postgreSQL创建多个实例-CSDN博客 - CSDN博客
[6] 一台机器建立多个PostgreSQL 实例 - 墨天轮 - 墨天轮数据社区
[7] 多实例 · book - lgy-note.gitbooks.io
[8] 简单问题答疑之不简单:PostgreSQL实例之端口与数据目录 - 墨天轮 - 墨天轮数据社区
[9] CLup 创建 PostgreSQL实例 + Repmgr 高可用集群完整部署笔记(Linux 实操版) - 知乎 - 知乎
[10] PostgreSQL 16 单虚拟机双实例部署及PITR时间点恢复实操_pg16 单机多实例安装-CSDN博客 - CSDN博客
[11] Linux下PostgreSQL一主多从环境搭建详解-百度开发者中心 - 百度开发者中心
[12] PostgreSQL部署_最佳实践_Huawei Cloud EulerOS-华为云 - 华为云帮助中心
[13] PostgreSql 主从同步搭建全攻略:从配置到优化 - 百度智能云
[14] PostgreSQL初始化指南-电脑软件-PHP中文网 - php中文网
[15] PostgreSQL 生产级部署实战:初始化、配置与运维避坑指南-CSDN博客 - CSDN博客
[16] Linux部署PostgreSQL从零到实战:初始化、认证与调优全解析-CSDN博客 - CSDN博客
[17] PostgreSQL安装全指南:版本选择、多平台避坑与初始化配置 - CSDN论坛
[18] postgres - www.postgres.cn
[19] postgres - www.postgres.cn
[20] PostgreSQL启动管理:pg_ctl工具详解与操作指南_文心快码 - 文心快码
[21] postgres - www.postgres.cn
[22] postgres - www.postgres.cn
[23] PostgreSQL集群篇——1、PG环境安装准备-腾讯云开发者社区-腾讯云 - 腾讯云
[24] 【PostgreSQL】PG多实例部署_PostgreSQL-CSDN专栏 - CSDN下载
[25] 【PostgreSQL】PG多实例部署_postgresql多实例-CSDN博客 - CSDN博客
[26] PostgreSQL的集群化和容器化部署-百度开发者中心 - 百度开发者中心
[27] postgresql多实例创建与Slony-I复制配置_linux postgresql 多实例-CSDN博客 - CSDN博客
[28] 一个服务器可以部署两套pg库吗?-CLOUD云计算 - zouaw.com
[29] 搭建PostgreSQL主从架构-云服务器 ECS(ECS)-阿里云帮助中心 - 阿里云帮助中心
[30] PostgreSQL 运维实战系列,第一期:从零开始构建生产级数据库环境 - 百家号
[31] PostgreSQL代码结构、构建流程与启动连接指南_pgsql-CSDN博客 - CSDN博客
[32] 《Postgresql实战》笔记(一)-阿里云开发者社区 - 阿里云开发者社区
[33] PostgreSQL笔记12:PGDATA 数据目录结构与核心文件深度解析_postgresql 数据文件-CSDN博客 - CSDN博客
[34] PostgreSQL运维—分布式Citus单机多实例部署 - 墨天轮 - 墨天轮数据社区
[35] PostgreSQL 安装、常用命令及优化 - 知乎 - 知乎
[36] Postgres 多实例实例部署方式 - hzy168 - 博客园 - 博客园
[37] Ubuntu安装PostgreSQL生产级配置指南:版本锁定、数据目录迁移与安全认证-CSDN博客 - CSDN博客
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/ggaofengg/article/details/169170448



