為何PgSQL主程序掛了,資料庫還可執行?

2021-09-23 17:39:33 字數 2368 閱讀 8872

資料庫主程序掛了,原有的連線還能繼續運算元據庫,你信嗎?下面,由dba+杭州群聯合發起人周正中告訴你,postgresql是怎麼可以做到的。

專家簡介

周正中網名:德哥@digoal

dba+杭州群聯合發起人之一

postgresql中國社群發起人之一,負責杭州分會,兼任社群cto一職。曾就職於斯凱網路,負責資料庫部門。現就職於阿里巴巴,負責rds pg核心組事務。

資料庫主程序掛了,原有的連線還能繼續運算元據庫,postgresql就可以做到,並且原來的程序對資料庫的操作是持久化的,不會丟資料哦。這得益於postgresql的程序結構設計。而且postmaster程序只負責了簡單的工作,例如監聽埠。

有人會問了,wal writer、backgroup writer程序都掛了,資料還能持久化?沒錯,因為backend process也可以完成這些操作,所以不用擔心資料丟失。

建立測試表。

將postgres主程序殺掉。

殺掉主程序後,只剩下backend process和logger程序,(當然wal buffer和shared buffer還在)。

然後在backend process對應的會話中寫入記錄。可以正常操作。

退出會話後,所有相關的程序都不在了,logger也退出了。

啟動資料庫。

檢視不到之前插入的資料,原因是那個事務是非同步的,而wal writter process程序當時已經不在了,backend process雖然可以完成flush wal buffer的功能,但是不像wal writter程序是週期性刷的,而是在申請不到buffer時才會觸發刷buffer的動作。

所以一條記錄就這樣丟失了。

接下來,我們使用同步事務,可以保證資料不丟失。

使用同步事務寫入資料並退出。

啟動資料庫。

可以看到,資料是持久化儲存的。

注意,雖然backend process可以寫wal buffer和shared buffer, 但是不能執行checkpoint, 因為這個操作是checkpoint做的,backend process只會告知它。當我們在postgres主程序被殺掉後,如果執行乙個比較大的操作導致觸發checkpoint的話,會在日誌中看到這樣的資訊。

包括autovacuum, stat collecter process都不在了,所以這些操作也會失敗。

例如:

可以看到對應的日誌:

統計資訊程序沒了,所以統計資訊也無法獲取。

這裡還引發乙個問題,如果我們使用長連線來監控資料庫狀態的話,無法了解主程序是否健康,所以最好還是用短連線來監控資料庫,至少可以判斷認證這塊還有主程序是否是正常的。不過短連線也有一定的問題,就是可能資料庫的連線被佔滿了,無法獲得連線。有利有弊,長連線+短連線的方式監控可能更加全面。

[其他]

關於crash自動重啟的引數:

restart_after_crash (boolean)

對應的**,某些場景會導致資料庫重啟。

src/backend/postmaster/postmaster.c

例如autovacuum程序被kill。斷開所有backend process,重啟autovacuum lanucher。

PGSQL資料庫公升級指令碼對比sql

with nms130tables as select from dblink host 127.0.0.1 dbname nms 130 user postgres password hik12345 select schemaname,tablename from pg tables as t ...

pgsql刪除仍有活動鏈結的資料庫

刪除資料庫的命令 drop database if exists testdb 但是這個命令可能會報錯 類似於 database is being accessed by other users.detail there is x other session using database.如 表示要...

pgsql資料庫和PHP中日期 時間戳處理函式

一.pgsql資料庫 1.獲取當前完整時間 now current timestamp 2.獲取當前日期 current date 3.獲取當前時間 current time 4.時間加減 now interval 2 year now interval 1 day now 10 m 說明 inte...