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


























