ITPub博客

首页 > 数据库 > PostgreSQL > PostgreSQL数据目录下的postmaster.pid详解

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

原创 PostgreSQL 作者:T1YSL 时间:2022-10-16 22:06:48 0 删除 编辑

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


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69990629/viewspace-2918605/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
中国开源软件推进联盟PG分会系列技术丛书《快速掌握PostgreSQL版本新特性》一书副主编。数据库技术专家。数据库认证讲师、恩墨学院数据库讲师。擅长MySQL数据库、PostgreSQL等开源数据库。拥有MySQL-OCP 、PostgreSQL-PGCM等数据库认证。

注册时间:2020-12-12

  • 博文量
    152
  • 访问量
    160792