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