PostgreSQL資料目錄下的postmaster.pid詳解

T1YSL發表於2022-10-16

在我們啟動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部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2918605/,如需轉載,請註明出處,否則將追究法律責任。

相關文章