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

