對于Oracle DBA來說,職業生涯中最糟的時刻,通常是去執行一次從未演練過的恢復。一個數據文件消失,一條沒有WHERE條件的DELETE被執行,或存儲陣列悄悄損壞了幾個塊——這時,你與更新簡歷之間的唯一屏障,就是那個你祈禱能用的備份和你依稀記得的操作步驟。
這篇運行手冊就為這樣的時刻而寫。它死磕一個絕大多數人壓力下都會搞混的概念:還原(restore)不是恢復(recover)。手冊直接把每種故障映射到對應的修復命令,從單個壞塊到整個數據庫回滾到錯誤發生前的一秒。
區別到底在哪?RESTORE是把數據文件從備份拷回來,它讓文件倒回到備份當時的那個時間點。RECOVER則是把還原后的文件,通過應用歸檔和在線重做日志向前滾——要么一路滾到現在,要么滾到你指定的某個時刻。幾乎沒人會單獨做還原,因為那等于丟掉備份之后的所有事務。標準恢復永遠是一對:RESTORE DATABASE; RECOVER DATABASE; ALTER DATABASE OPEN; 記住這對組合,下面的一切都是它的變體——變在還原哪些文件、恢復到多遠。
下面是故障→修復的對照表。不要把處理單個壞塊的命令用在整庫丟失上,要匹配最小范圍的恢復,才能把停機壓到最短:
1. 單個數據文件,無需停機:最常見的恢復場景,就一個數據文件或表空間丟了,數據庫其余部分還在服務。把那個文件離線,還原并恢復它,再重新上線,其他表空間上的用戶毫無感知。命令:ALTER DATABASE DATAFILE 7 OFFLINE; RESTORE DATAFILE 7; RECOVER DATAFILE 7; ALTER DATABASE DATAFILE 7 ONLINE;(把DATAFILE 7換成TABLESPACE users就是在表空間級別搞)。這也就是為什么還原速度比多數團隊以為的更重要——實際恢復多數時候只動一個文件,而不是整片土地。
2. 整個數據庫:先還原再恢復。數據庫起不來?啟動到mount狀態,RESTORE DATABASE,然后RECOVER DATABASE,最后OPEN。原理不變,只是范圍拉滿。
3. 針對人為錯誤的點時間恢復:要倒回一個致命的DELETE,用SET UNTIL(時間或SCN)放在RUN塊開頭,還原、恢復,最后OPEN RESETLOGS把庫打開。整個庫回退到錯誤前的那一刻。
4. 少數壞塊:塊介質恢復(Block Media Recovery)只修壞掉的那些塊,不動整個數據文件,省時高效。
5. 控制文件丟了:NOMOUNT啟動,SET DBID,然后RESTORE CONTROLFILE FROM AUTOBACKUP。控制文件沒了不代表世界末日,只要你記得自己的DBID。
貫穿一切的那條鐵律是:一個從沒測試過的備份,只是一廂情愿,不是恢復計劃。只有當你真的練過,你才知道它能跑。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.