當前位置: 首頁>>技術教程>>正文


postgresql – 如何很好地停止所有 postgres 進程

問題描述

當您不記得數據庫目錄是什麽,也沒有定義 PGDATA 環境變量時,如何使用 pg_ctl(或其他方式)很好地停止所有 postgres 進程?

最佳辦法

可以安全地:

sudo pkill -u postgres

這會終止以用戶 postgres 身份運行的所有進程。或者:

pkill postgres

這會殺死所有名為 ‘postgres’ 的進程。

不要使用 kill -9 ( kill -KILL )。隻是 kill (沒有選項)做一個 SIGTERM ,這就是你想要的。

或者,如果可以連接到 PostgreSQL,則可以檢查 pgdata 位置。例如:

sudo -u postgres psql -c "SHOW data_directory";

…或者通過在 /proc/[postmaster pid]/environ 中檢查其環境變量,您可以在其中使用 ps -fHC postgres 標識郵政局長。查找其他 postgres 進程的父進程。例如:

postgres   794     1  0 Nov06 ?        00:00:03 /usr/pgsql-9.3/bin/postgres -D /var/lib/pgsql/9.3/data -p 5432
postgres   857   794  0 Nov06 ?        00:00:00   postgres: logger process   
postgres   871   794  0 Nov06 ?        00:00:00   postgres: checkpointer process   
postgres   872   794  0 Nov06 ?        00:00:00   postgres: writer process   
postgres   873   794  0 Nov06 ?        00:00:00   postgres: wal writer process   
postgres   874   794  0 Nov06 ?        00:00:03   postgres: autovacuum launcher process   
postgres   875   794  0 Nov06 ?        00:00:07   postgres: stats collector process   

它的數據目錄通常會顯示在它的命令行上。

次佳辦法

在同一個命令中看到 kill 和 postgres 讓我很緊張。要僅使用 pg_ctl 來回答問題,那將是:

pg_ctl -D $(psql -Xtc 'show data_directory') stop

-X 參數表示忽略 .psqlrc 文件。如果您將 psql 配置為發出查詢所用的時間(通過 \\timing 命令),這將很有用。

-t 參數表示刪除輸出頂部的列名和生成的總行數。

-c 參數包含要執行的 SQL 代碼。

運行裸機 psql -c 'show data_directory' 可能會產生以下輸出:

      data_directory
--------------------------
 /path/to/postgresql/data
(1 row)

因此,通過 $( ... ) 反引號會將 /path/to/postgresql/data 傳遞給 pg_ctl 的 -D 參數,然後它將以有序的方式停止數據庫。

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/13459.html,未經允許,請勿轉載。