聊聊PG數據庫的防誤刪除問題
?做DBA這二十多年里,誤刪除數據是處理起來最麻煩的事情。早期遇到過一個案例,當時的一個可視化開發工具是把所有代碼都保存在一個Oracle數據庫里的,而這個數據庫放在一臺普通的PC機上,并未做任何備份。有一次一不小心,被人把一個用戶的數據全刪了。這下子這個政府部門的業務系統都跑不起來了。后來我花了幾天時間才恢復了大部分數據,湊合讓大部分應用都恢復了。
Oracle的各種防誤刪除的方法已經被國內的第三方服務企業都研究的比較透了,這些年大部分的此類問題,都能夠通過一些工具或者特殊的方法實現恢復。不過現在很多企業都在將數據庫轉移到開源與國產化的環境。在這些新環境下,數據恢復依然是作為剛需存在的。今天我們來簡單聊聊PG數據庫的誤刪除恢復問題,因為目前很多國產數據庫都與PG同源,或者是基于PG社區版定制的。
防誤操作的底線是用備份恢復數據,數據庫備份也是數據庫運維的底線。如果實在沒辦法在在線庫中恢復數據的時候,使用備份集來恢復數據是十分重要的。可能有朋友會說了,我們有主備庫,是不是不需要備份了。這個觀點是錯誤的,主備庫只是高可用的方案,不能替代備份。當你誤刪一張表的時候,備庫也會被誤刪。只有備份才能通過離線恢復來恢復你所需要的所有數據。為了確保備份集的可靠性,至少保留兩個全備也是十分必要的。
除了備份之外,我們還可以通過規范一些操作來實現比較方便的誤刪恢復。與Oracle不同的是,PG的DDL是可以rollback的。在PG數據庫中,TRUNCATE、DROP等操作開始的時候,還會保留原有的文件。比如TRUNCATE TABLE的時候,首先會創建一個新文件作為數據存儲,原來的文件還保留著。當你執行rollback的時候,原來的數據可以很方便地恢復。不過一旦COMMIT,那么老的數據文件就會被從OS層面刪除。
基于此,要想實現PG數據庫被DROP/TRUNCATE的數據能夠恢復,還需要考慮操作系統的恢復問題。我們在選擇文件系統的時候,一定要選擇一個可恢復的帶日志的文件系統,比如XFS/EXT等。并且要打開并設置好日志。打開文件系統日志,可能會對寫操作有一些性能影響,不過對于絕大多數系統來說,這點影響完全是可以接受的,為了確保安全,啟用日志十分有必要。
除此之外,我們還要把OS層面的UNDELETE工具準備好,一旦遇到需要恢復數據的事情,立馬通過UNDELETE工具恢復被刪除的數據文件。一旦數據文件被恢復回來了,那么從文件中導出數據就是十分容易的事情了。目前在GIT上,有大量的開源工具可以用來從PG數據文件中下載數據。因此對于有個企業來說,在部署PG數據庫的時候,應該考慮準備好undelete工具,并在有比較靠譜的undelete工具的文件系統上部署PG數據庫。
實際上在使用比較復雜的方式恢復數據之前,我們還有更好的解決方法,比如使用psql工具的時候,把自動提交關閉,這樣的話在第一時間,我們還可以通過DDL ROLLBACK來實現最簡單的恢復。養成好的習慣或者規范化操作行為也是避免出大事的最好的方法。
最后一點,相對于Oracle數據庫的段管理的模式,PG的整個元數據相對還是有點繞的。有時候如果我們手頭有完整的元數據的歷史信息,那么在數據恢復的時候,可以很快的找到需要恢復的文件,從而可以在備份集中快速找到要恢復的數據,并用工具完成快速恢復。因此為了避免恢復數據時過于復雜,定期備份PG的關鍵元數據也十分重要。?