【PostgreSQL数据目录下的postmaster.pid详解】

在我们启动PostgreSQL数据库的时候,偶尔会遇到如下的打印信息,它提示我们锁文件 “postmaster.pid"存在,并让我们检查是否以”/opt/ysl_pg14/data"为数据目录的已经启动了postmaster进程。那么这个 "postmaster.pid"究竟是做什么的?以及它的内容是如何呢?

[xmaster@mogdb-kernel-0005 data]$ pg_ctl start -D /opt/ysl_pg14/data/
pg_ctl: another server might be running; trying to start server anyway
waiting for server to start....2022-10-15 21:12:37.333 CST [178375] FATAL:  lock file "postmaster.pid" already exists
2022-10-15 21:12:37.333 CST [178375] HINT:  Is another postmaster (PID 178348) running in data directory "/opt/ysl_pg14/data"?
 stopped waiting
pg_ctl: could not start server
Examine the log output.

首先,我们看一下这个文件里的内容,"postmaster.pid"里边包含了8行内容

(1)178348: 代表Postgres主进程的PID
(2)/opt/ysl_pg14/data表示数据目录

[xmaster@mogdb-kernel-0005 data]$ cat -n postmaster.pid 
     1  178348
     2  /opt/ysl_pg14/data
     3  1665839543
     4  5432
     5  /tmp
     6  *
     7    2362435    262155
     8  ready 

(3)1665839543代表postmaster文件的创建时间

(4)5432是端口号
(5)/tmp是unix_socket_directories的目录
(6)*是listen_addresses的值

(7)2362435 262155是共享内存地址段(shared memory segments)的key,shmid
0x00240c43转化为10进制是2362435

(8)ready代表主进程状态.

postmaster.pid文件只有在数据库启动的时候才生成,

[xmaster@mogdb-kernel-0005 data]$ pg_ctl stop
waiting for server to shut down.... done
server stopped
[xmaster@mogdb-kernel-0005 data]$ cat -n postmaster.pid 
cat: postmaster.pid: No such file or directory
[xmaster@mogdb-kernel-0005 data]$ pg_ctl start -D /opt/ysl_pg14/data/
waiting for server to start....2022-10-15 22:01:04.743 CST [182525] LOG:  redirecting log output to logging collector process
2022-10-15 22:01:04.743 CST [182525] HINT:  Future log output will appear in directory "log".
 done
server started
[xmaster@mogdb-kernel-0005 data]$ cat -n postmaster.pid 
     1  182525
     2  /opt/ysl_pg14/data
     3  1665842464
     4  5432
     5  /tmp
     6  *
     7    2362435    262156
     8  ready   

在src/backend/postmaster/postmaster.c的PostmasterMain()函数里调用了一个CreateDataDirLockFile()函数,函数里包含的DIRECTORY_LOCK_FILE其实就是"postmaster.pid “这个文件。CreateDataDirLockFile()这个函数会在数据库集群所在目录创建数据库集群的lock文件"postmaster.pid”。这样就能保证我们不会对同一个数据库集群"启动两次"。也就出现了我们开头启动数据库时候打印的信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小怪兽ysl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值