PostgreSQL “千萬” 不能做 五大 foolish 操作

工作時間長了,可能就會總結出來一些東西,千萬不能做,做了會讓你後悔莫及。

先說一些我們的前提

1 擁有數據庫的所有權限

2 不能通過故意的方式來毀掉一個數據庫 例如 rm -rf

那我們就開始列一列那些操作會讓你追悔莫及

1 刪除pg_class

對系統表不敬,大部分數據庫都有自己的系統表,而這些表中存儲着非常重要的信息,postgresql 中的 pg_catalog 中的pg_class 算是一個核心的表。

我們看看清空他怎麼樣

truncate table pg_catalog.pg_class;

即使你擁有初始的最大的權限,PG 的核心表,你也是沒有權利去刪除他的。

但如果你換了一種方法

然後你退出,在psql 連入到postgresql中你會發現,不OK了

pg_class 是PG中最重要的系統表之一,其中存儲着所有的系統的表中的object 的信息,OID信息,將他delete 後,基本上pg 無法在提供正常的服務,甚至是連入到PG中。

2 對系統文件的誤刪除

在很多數據庫中都有關鍵的控制文件,清理了配置控制文件的後果也是可以讓你記憶深刻。下面我們刪除PG中的 pg_control

此時我們建立一個新的數據庫,就失敗了

具體這樣的操作的失敗的原因,是檢查點的位置保存在文件pg_control中。因此,在恢復開始時,服務器首先讀取pg_control,讀取檢查點記錄,通過從檢查點記錄中指定的日誌位置向前掃描來執行重做操作。所以在刪除了pg_control後,首先檢查點的checkpoint的工作就無法進行下去了。整體的數據庫系統就無法繼續工作,導致系統崩潰。

那如果刪除了pg_control 後還能讓PG重新啓動嗎?,可以但結果可能並不是你要的,即使你使用pg_resetwal 恢復了pg_control 數據庫可以啓動後,但很可能你得到得的結果是


所以pg_control 是你不能丟失的控制文件。

3  清理你的模板數據庫

模板數據庫,意思即使你創建其他數據庫的基礎,例如裏面已經加載的擴展信息,或者你往裏面添加的任何數據庫,表,或者存儲過程  ,觸發器等元素,都會在你 create database 後從模板數據庫中帶過來。

當然有人說,你刪不掉 template1 template0 兩個數據庫,因爲刪除的時候回報,他們是模板數據庫,不能刪除。

上圖就是刪除了模板數據庫,然後在創建數據庫的時候,就.......  failed.

4  設置權限的時候 pg_hba.conf, 如下圖設置

舉例我們設置一個賬號

則最低的保障是需要系統在非主機登陸時,提供賬號密碼的驗證,由於上面pg_hba的設置,導致任何人在任何時候,不使用任何密碼都可以登陸到數據庫中。

數據庫的安全蕩然無存。

5  寫 CTE 時使用recursive 時進行類似死循環的遞歸活動,造成語句最後失敗,並造成系統資源異常消耗。

這樣的語句會造成 

1系統資源嚴重消耗

2 系統的TEMP 庫瘋狂的使用,很可能會造成你的temp 庫佔用大量的磁盤空間

3 造成客戶端連接被 KILL 

實際上,還有不少的行爲會造成PG 異常,並且很難再去恢復,比如邏輯複製槽的問題,以及copy 的某些小機關的問題。

所以在你碰到一些難以解決的性能問題,或者奇怪的數據塊故障的時候,想想曾經對他做了什麼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章