PostreSQL在Linux上的systemd服务详解
简介
PostgreSQL(通常缩写为“Postgres”)是一个强大的开源关系型数据库管理系统(RDBMS),广泛用于企业应用和基于Web的软件。它最初是于1989年作为加州大学伯克利分校的一个研究项目发布的,随着时间的推移已经成长为最受欢迎和受尊敬的数据库之一。
PostgreSQL以其先进的特性而著称,包括支持复杂查询、存储过程、触发器和事务。它还提供全文搜索、强大的索引功能和支持多种编程语言,使其成为广泛应用于各种应用程序的多用途选择。此外,PostgreSQL高度可定制和可扩展,具有大型和活跃的开发者社区,为其不断发展和改进做出贡献。
PostreSQL Systemd Service详解
下面我们来解析一下PostgreSQL在Linux上是怎么通过systemd服务启动的。
本次用的Linux发行版本是Ubuntu,系统信息可以用hostnamectl查看:

hostnamectl 输出
首先通过以下命令安装Postgresql最新版
#创建文件仓库配置:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
# 导入仓库签名密钥:
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
#更新软件包列表:
sudo apt-get update
# I安装最新版本的 PostgreSQL。如果想要安装特定版本,可以使用 'postgresql-12' 或类似的名称,而不是 'postgresql':
sudo apt-get -y install postgresql
安装好之后,会在/lib/systemd/system/下生成两个文件:
- /lib/systemd/system/postgresql.service
- /lib/systemd/system/postgresql@.service
如图:

/lib/systemd/system/postgresql*
postgresql.service是控制整个PostgreSQL服务的主要单元。
可以用 systemctl cat postgresql.service查看内容:

postgresql.service
可以看到该服务没做什么,只是起到一个控制作用。当我们使用命令systemctl restart postgresql的时候,所有服务里面有PartOf=postgresql.service也会执行restart命令。
postgresql@.service是一个模板单元,允许在同一台机器上运行多个PostgreSQL实例。%i是单元名称中的占位符,允许您将多个PostgreSQL实例作为单独的服务启动和管理。此模板单元用于创建各个PostgreSQL实例,实例名称实际上替换了%i占位符。
可以用 systemctl cat postgresql@.service查看内容:

systemctl cat postgresql@.service
可以看到PartOf=postgresql.service。每个实例都有自己独特的配置和数据目录。但是,这些实例仍将由同一个postgresql.service单元管理。
安装postgresql时,会执行如下命令:
/usr/lib/postgresql/15/bin/initdb -D /var/lib/postgresql/15/main --auth-local peer --auth-host scram-sha-256 --no-instructions
入土

sudo apt-get -y install postgresql 输出
该命令在/var/lib/postgresql/初始化一个数据库,该命令是命令pg_createcluster -u postgres --no-status $VERSION main的一部分, 该命令还会在/etc/postgresql/创建默认的数据库配置。
下面是postgresql@.service的详解
[Unit]
Description=PostgreSQL Cluster %i
#描述:PostgreSQL 集群 %i 该字段是该 unit 文件的描述信息。%i
AssertPathExists=/etc/postgresql/%I/postgresql.conf
# 指定要求指定路径必须存在,否则无法启动服务。
RequiresMountsFor=/etc/postgresql/%I /var/lib/postgresql/%I
# 要求这些目录必须挂载。如果没有挂载,服务就不能启动。
PartOf=postgresql.service
# 指定这个 unit 文件是 PostgreSQL 服务的一部分。
ReloadPropagatedFrom=postgresql.service
#重新加载配置文件时要等待 postgresql.service 文件。
Before=postgresql.service
# 指定在 postgresql.service 之前启动。
After=network.target
#指定在 network.target 启动后再启动。
[Service] Type=forking
#指定服务的类型为 forking,表示服务会创建一个子进程并在父进程退出时退出。
ExecStart=-/usr/bin/pg_ctlcluster --skip-systemctl-redirect %i start
#指定服务启动时需要运行的命令。
TimeoutStartSec=0
# 指定服务启动超时时间,设置为 0 表示没有超时时间限制。
ExecStop=/usr/bin/pg_ctlcluster --skip-systemctl-redirect -m fast %i stop
# 指定服务停止时需要运行的命令。
TimeoutStopSec=1h
# 指定服务停止超时时间,设置为 1 小时。
ExecReload=/usr/bin/pg_ctlcluster --skip-systemctl-redirect %i reload
# 指定服务重新加载配置文件时需要运行的命令。
PIDFile=/run/postgresql/%i.pid
# 指定服务进程的 PID 文件路径。
SyslogIdentifier=postgresql@%i
# 指定服务在日志中的标识。
OOMScoreAdjust=-900
# 调整内核的进程杀死优先级。
[Install]
WantedBy=multi-user.target
#指定服务所在的 target(这里是 multi-user.target),表示在启动 multi-user.target 时会启动这个服务。
%i 和 %I 是占位符,在运行时将被替换为实际的值。
%i 代表实例标识符,是一个字符串,用于标识特定服务或套接字的实例。当在同一系统上运行多个具有唯一配置的相同服务或套接字时,这是非常有用的。
例如,如果在同一系统上运行两个名为 main 和 replica 的 PostgreSQL 集群,则可以使用 %i 占位符定义两个 unit 文件:
/etc/systemd/system/postgresql@main.service
/etc/systemd/system/postgresql@replica.service
启动或停止服务时,需要将实例标识符作为参数指定:
systemctl start postgresql@main.service
systemctl stop postgresql@replica.service
%I 代表实例名称,类似于实例标识符,但已进行了清理,以成为有效的文件名。通常在文件路径名中使用,以标识特定实例的配置文件或数据目录。
例如,如果您有一个名为 main 的 PostgreSQL 集群,则配置文件可能位于 /etc/postgresql/main/postgresql.conf,数据目录可能位于 /var/lib/postgresql/main/。
通过在 unit 文件中使用 %I,systemd 将自动用实例名称替换占位符。这可以简化管理同一服务的多个实例,因为您可以使用带有不同 %I 值的相同 unit 文件来管理每个实例。
相关推荐
-
第18问:MySQL CPU 高了,怎么办?2025-02-24 10:27:18
-
mysql索引类型 normal, unique, full text
mysql索引类型 normal, unique, full text2025-02-24 10:05:05 -
uwsgi+django+nginx 搭建部分总结2025-02-24 10:03:33
-
使用Docker配置Nginx环境部署Nextcloud2025-02-24 10:02:03
-
Nginx安装和怎么使用2025-02-24 10:00:45