暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

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

原创 阎书利 2022-10-15
3047

在我们启动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 

image.png

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

image.png

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

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

(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”。这样就能保证我们不会对同一个数据库集群"启动两次"。也就出现了我们开头启动数据库时候打印的信息。

image.png

image.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论