天天看點

PostgreSQL 資料檔案災難恢複 - 解析與資料dump

postgresql , 資料檔案 , pg_filedump , 安全 , tde

俗話說常在河邊站哪有不濕鞋,作為一名戰鬥在一線的dba或者開發者,可能有遇到過磁盤損壞,磁盤陣列損壞,如果有備份或者備庫的話,還好。

如果沒有備份,或者沒有備庫(通常有一些小型或者創業型的企業),那麼遇到磁盤損壞或者其他原因(比如掉電檔案系統損壞),導緻資料庫的資料檔案并不完整時,如何從有限的資料中找出資料呢?

比如postgresql,如果讀到壞塊,會報塊不可讀的錯誤,這種情況下通過設定zero_damaged_pages=on可以跳過損壞的資料塊。

如果連中繼資料都損壞了,又或者壞了一些磁盤,隻有某些表空間被幸免于難,這些情況下你的資料庫都已經無法啟動時,如何能從有限的資料檔案中找回資料呢?

pg_filedump是postgresql社群托管的一個項目,類似于pg_xlogdump,不需要開啟資料庫,可以直接從資料檔案中将資料dump出來。

pg_filedump實際上可以dump 堆表、索引資料檔案,控制檔案的内容。(從pg_filedump引用的頭檔案也能看出端倪)

安裝很簡單

指令幫助如下,通常來說,你隻需要指定需要dump的檔案即可。

如果檔案的塊頭損壞了,那麼你可以手工指定一些資訊,包括塊大小,段大小,解析哪個塊,根據什麼格式解析(字段類型清單)等。

1. 建立測試表

2. 插入測試資料

3. 找出表對應的資料檔案

4. 調用checkpoint,把資料刷盤,便于我們接下來的觀察

5. 使用pg_filedump直接讀取資料檔案,導出資料

為了得到記錄,需要提供一下字段類型list,必須保證與表結構一緻

copy得到的就是使用-d提供的類型清單decode拼裝的記錄。

是不是可以從檔案中dump資料了呢?莫急,還要看看掩碼哦,否則你不知道這條記錄是否為你需要的,因為它可能是dead tuple。

例子

每條記錄,頭部都有infomask, infomask2掩碼,掩碼表示的意思,可以參考頭檔案

比如什麼是dead tuple呢?

觀察

檢視新版本(編号為9345資料塊,第86條記錄)

對于資料檔案的組織形式,可以參考頭檔案

src/include/storage

每個塊内的組織,與對象類型有關,比如堆表,b-tree,hash等索引,toast, fsm等。

可以參考資料layout介紹

<a href="https://www.postgresql.org/docs/9.6/static/storage.html">https://www.postgresql.org/docs/9.6/static/storage.html</a>

也可以參考對應類型的頭檔案

閱讀pg_filedump的源碼,也有助于你對postgresql存儲構造的了解

不妨仔細閱讀以下頭檔案

我們已經看到,使用pg_filedump可直接decode資料檔案的内容,是以洩露資料檔案其實是比較危險的。

那麼如何防止脫褲呢?tde是一個很好的手段,即資料檔案透明加密。你可以參考我末尾的文章。

另外還有加密方法,比如對敏感資料,使用加密字段存儲。加解密交給程式完成。徹底杜絕因洩露檔案導緻的資料洩露。

<a href="https://github.com/digoal/blog/blob/master/201506/20150601_01.md">《postgresql 資料庫安全指南》</a>

<a href="https://github.com/digoal/blog/blob/master/201610/20161031_01.md">《postgresql 透明加密(tde,fde) - 塊級加密》</a>