終止 PostgreSQL 連線

Bilal Shahid 2023年1月30日
  1. 使用 ps -efgrep 檢視和終止 PostgreSQL 中的程序
  2. PostgreSQL 基本 TERMINATE_BACKEND() 函式
  3. LINUX 中的 PostgreSQL 連線 RESTART
  4. UBUNTU 中的 pg_ctl restart 用於終止預先存在的 PostgreSQL 會話
終止 PostgreSQL 連線

我們將在本文中學習如何終止 PostgreSQL 會話。任何開啟的連線都通過後臺程序或任務執行,儘管退出使用者介面或命令列工具 PSQL,這些程序或任務可能不再存在。

使用 ps -efgrep 檢視和終止 PostgreSQL 中的程序

讓我們看看我們如何發出這些命令來殺死當前訪問 PostgreSQL 會話的所有程序。Linux 系統使用 PIPE 使附加的命令有意義然後工作。

讓我們將上面的命令分為兩種不同的語法; psgrep。正如 LINUX 手冊中定義的那樣,ps 用於檢視我們系統的所有正在執行和可用的程序。

語法:

ps [options]

OPTIONS 包括以下內容。

Use the standard syntax to see every process on the system:
          ps -e
          ps -ef
          ps -eF
          ps -ely

我們沒有在此選項列表中新增更多可用選項,因為我們目前想要檢視 -ef 關鍵字。使用上述任何一種方法都可以使命令正常工作。

因為我們使用 grep 對其進行管道化,從而為我們帶來匹配特定模式的結果,所以它在 MANPAGES 中作為一個子句列出,用於列印匹配特定模式的行。

語法:

grep [OPTION...] PATTERNS [FILE...]
       grep [OPTION...] -e PATTERNS ... [FILE...]
       grep [OPTION...] -f PATTERN_FILE ... [FILE...]

grepFILE 中搜尋模式。有時可能不是檔案而是檔案索引。

檔案索引在 Linux 系統中很常見,它可以指示標準輸入、開啟的檔案或從某個命令顯示的一組結果。

在上面的例子中,我們獲取了 Linux 系統中所有當前程序的集合,然後從這個集合中獲取匹配 PostgreSQL 關鍵字或附加到 PostgreSQL 的程序的結果。

因此,我們可以使用 kill 命令終止程序,其 ID 顯示在我們的結果中。該命令將訊號傳遞給指定要終止的程序。

命令:

int kill(pid_t pid, int sig);

pid 中,你將 Process-ID 作為引數傳遞。這是殺死當前可能正在執行的 PostgreSQL 程序、任務和查詢的有效方法。

我們可以使用下面的命令來殺死曾經發現的似乎是我們的 PostgreSQL 會話的程序。

命令:

SUDO KILL -9 $(lsof -i :3000 -t) or '#' (The former depends on MacOSX)

SUDO KILL -9 不適合,因為它無法清除系統中程序訪問和留下的臨時檔案並重置其終端連線。該程序也不能刪除與它當前使用或附加的套接字的連線。

代替 -9,你可以發出 -15-2-1,完全可以替代 -9 關鍵字。

kill 使用如下語法。

kill [-signal|-s  signal|-p] [-q  value]

要檢視它是否完美執行,你可以從以下返回的結果中進行檢查。

0      success
1      failure
64     partial success (when more than one process is specified)

PostgreSQL 基本 TERMINATE_BACKEND() 函式

上面提供的解決方案僅適用於 Linux 系統及其版本。但是,我們有通用的解決方案,可能適用於在各種作業系統上執行的 PostgreSQL 會話。

在 PostgreSQL 中定義的 System Administration 函式下,一組 Server Signaling 函式在成功和失敗時返回 TrueFalse,並將控制訊號傳送到提及或選擇的程序。

如文件中所列,這些函式預設情況下僅限於超級使用者,但可以使用 GRANT 將訪問許可權授予其他人,但有註明的例外情況。

最好以 SUPERUSER 身份訪問資料庫以使用此類命令。要呼叫此函式,你可以編寫以下查詢。

SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE
pid != pg_backend_pid()  AND datname = '[your_Database_name]'

PG_STAT_ACTIVITY 是活動後端中程序的檢視。而 PID 是該表(檢視)中的一列。然後我們將 PID 與我們的 BACKGROUND_PID 進行比較。

我們不能終止我們當前的 PostgreSQL 會話,因為它負責殺死所有併發和預先存在的 PostgreSQL 連線。

作為替代方案,你也可以使用 PG_CANCEL_BACKEND(pid),因為它們都將 SIGINTSIGTERM 傳送到提到的後臺程序。

這些訊號是具有更嚴格實現的 KILL 訊號。在系統資訊功能下,你將能夠找到 PG_BACKEND_PID(),其使用說明如下。

pg_backend_pid()    int Process ID of the server process attached to the current session

確保不要意外終止我們當前的會話。在舊版本的 PostgreSQL 中,你可以使用 PROCPID 而不是 PID

LINUX 中的 PostgreSQL 連線 RESTART

我們可以使用 RESTART 關鍵字來終止連線到 PostgreSQL 會話的所有連線。如介紹中所述,我們可以從 Windows 中的工作管理員中殺死後臺程序,或者完全重新啟動我們的系統以終止所有由於效率低下而不適合的連線。

命令 - 在 Linux 中:

sudo service postgresql restart

而對於 BREWHOMEBREW 的縮寫,一種從 LINUX 命令列安裝軟體包的工具。

命令 - 在 Linux 中:

brew services restart postgresql

如果使用 BREW 安裝 PostgreSQL,這將起作用。

UBUNTU 中的 pg_ctl restart 用於終止預先存在的 PostgreSQL 會話

在 UBUNTU MAN PAGES 中,你可以看到 PG_CTL,它初始化、啟動、停止或控制 PostgreSQL 會話。控制也可以包括 RESTART

語法:

pg_ctl restart [-w] [-t seconds] [-s] [-D datadir] [-c]
              [-m s[mart] | f[ast] | i[mmediate]] [-o options]

為簡單起見,我們可以發出包含 Postgres 的目錄名稱,然後執行以下命令。

pg_ctl restart -D /usr/local/var/postgres

如果你的目錄與上面給出的目錄不同且不同,你可以使用下一個命令找到它們。

ps aux | grep postgres

要了解此命令,你可以參考本教程提供的第一個解決方案中詳細解釋的類似命令之一。有時,你可能需要使用 LAUNCHCTL 命令來啟用命令列上的子命令,這些子命令可能來自標準輸入。

命令:

$ launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

再一次,如果找不到 HOMEBREW``PLISTDIR,你可以再次執行 AUX 命令。

我們希望你瞭解我們可以在不同作業系統中終止或終止 PostgreSQL 連線的各種方法。

作者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

相關文章 - PostgreSQL Connection