您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關通過linux命令來將postgresql殺死有什么影響的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
在數據庫的服務器上通過linux 命令來將postgresql 殺死 例如 kill -9 xxxx,這樣做到底會對postgresql 產生什么影響,不少人都曾經這樣干過,為什么說這樣做,糟糕透了。
首先我們需要理解一下postgresql 在 linux中的運行機制,system call and fork() system call ,其中
是system call
postgres 102414 1 0 08:34 ? 00:00:00 /usr/local/postgres/bin/postgres -D /pgdata/data
在下邊的這些就為 fork() sytem call
postgres 102415 102414 0 08:34 ? 00:00:00 postgres: logger
postgres 102417 102414 0 08:34 ? 00:00:00 postgres: checkpointer
postgres 102418 102414 0 08:34 ? 00:00:00 postgres: background writer
postgres 102419 102414 0 08:34 ? 00:00:00 postgres: walwriter
postgres 102420 102414 0 08:34 ? 00:00:00 postgres: autovacuum launcher
postgres 102421 102414 0 08:34 ? 00:00:00 postgres: archiver
postgres 102422 102414 0 08:34 ? 00:00:01 postgres: stats collector
postgres 102423 102414 0 08:34 ? 00:00:00 postgres: logical replication launcher
postgres 102415 102414 0 08:34 ? 00:00:00 postgres: logger
postgres 102417 102414 0 08:34 ? 00:00:00 postgres: checkpointer
postgres 102418 102414 0 08:34 ? 00:00:00 postgres: background writer
postgres 102419 102414 0 08:34 ? 00:00:00 postgres: walwriter
postgres 102420 102414 0 08:34 ? 00:00:00 postgres: autovacuum launcher
postgres 102421 102414 0 08:34 ? 00:00:00 postgres: archiver
postgres 102422 102414 0 08:34 ? 00:00:01 postgres: stats collector
postgres 102423 102414 0 08:34 ? 00:00:00 postgres: logical replication launcher
上面的通過調用fork()來創建一個新進程。此系統調用復制當前進程,在進程表中創建一個具有許多與當前進程相同屬性的新條目。新創建的進程將是調用進程的子進程
所以父進程為pid 字進程為ppid
當然也可以通過 pstree 來查看當前主線程之間的從屬關系
PostgreSQL 調用LINUX 操作系統的信號種類有以下幾種
1 Abrt 異常終止信號
2 int 外部中斷,類似于Ctrl +C 的結果
3 quit 直接清理正在運行的線程,并且對臨時產生的文件不清理
4 term 這個命令就是就是我們熟悉的 kill 命令
5 hup 重新初始化線程的命令
6 用戶調用定義
下面我們做一個test , 看看我們要是kill -9 一個用戶連接會有什么問題
下面是在kill 當前連接到數據庫的用戶process 后的日志
如果圖看不清我把關鍵的一句粘一下
WARNING: terminating connection because of crash of another server process
我們在對比一下kill 用戶連接的進程后的,database 的那些子進程的數字,倒吸一口涼氣了吧。
那馬上看到這里有人就會產生一個問題,那我怎么kill掉 那個 白占著資源,不干活的用戶。
(問題答案將在文末給出)
那么我們翻過來的看一下,在kill -9 一個用戶連接的process后會發生什么
1 用戶的連接process 被kill -9 干掉2
2 終止任何其他活躍的服務器進程
3 警告因為你的這項操作會導致服務器postgresql其他的進程crash
4 所有的服務器的postgresql processes 重新初始化
也就是日志的這幾句話
database system was not properly shut down; automatic recovery in progress
redo starts at 5/1C000098
invalid record length at 5/1C000108: wanted 24, got 0
redo done at 5/1C0000D0
database system is ready to accept connections
OK 到這里你還敢隨便 kill -9 人家用戶的連接,尤其是幾百G 或上T 的大庫,Are you crazy ?
那到底正確的做法是什么
pg_terminate_backend 命令在數據庫里面去KILL 掉這個用戶的連接。
而且不會對數據庫產生任何的危害。(見上圖)
所以你還在天天的kill -9 用戶的process ,建議你住手。
感謝各位的閱讀!關于“通過linux命令來將postgresql殺死有什么影響”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。