還是Oracle的資料庫破壞試驗,RMAN針對不同檔案的丟失進行恢復

louloueva發表於2009-01-17

昨天費了好大勁,接觸了一下資料庫的全備份和資料庫完全丟失後恢復
資料庫完全丟失的恢復,對於個人來說可能上來就接觸是稍微困難了些
所以其中有些步驟只是按照文件執行過去,並不是特別清楚其作用
對於備份恢復還需要慢慢深入、具體地去練習
今天就來分別對各種資料庫檔案的損壞進行鍼對性的恢復

昨天最後練習了全資料庫的資料檔案丟失的恢復
來細化一下吧,某個具體的資料檔案丟失後的恢復
把example,user,ts_test這幾個刪掉
startup,但到了mount,轉換到open時,報錯
ORA-01157: cannot identify/lock data file 4 - see DBWR trace file
ORA-01110: data file 4: '/home/oracle/oracle/oradata/test/users01.dbf'
需要user01.dbf,user表空間的資料檔案
進行資料檔案的單獨還原
RMAN> restore datafile 4;
還原後進行恢復
RMAN> recover datafile 4;
後面又陸續提示另外兩個表空間丟失,依照上面方法進行還原並恢復
都恢復後,用alter database open命令開啟資料庫,一切正常
在此處並未用resetlogs引數,因為恢復過程屬於完全恢復
recover所用的redo log或歸檔日誌都沒有丟失
資料可以恢復到資料庫最新的SCN狀態下
另外,因為全資料庫備份後並未有任何改動
而redo log也都存在,並足矣進行recover操作
所以,即便刪除現有歸檔日誌也能進行完全恢復
是否需要歸檔日誌,完全、不完全的選擇
這些會因為歸檔、備份的日期,redo log的有效性等因素有所差別

下面是針對某個表空間進行還原恢復,比如users表空間
RMAN>restore tablespace users;
RMAN>recover tablespace users;
但要注意,如果還原恢復一個open狀態下的表空間
要先將表空間offline後才能還原,不然報錯
ORA-19573: cannot obtain exclusive enqueue for datafile 4
offline表空間的SQL是ALTER TABLESPACE users OFFLINE [IMMEDIATE]
RMAN>SQL 'ALTER TABLESPACE users OFFLINE IMMEDIATE';
進行還原恢復後,要記得用ALTER TABLESPACE users ONLINE將表空間聯機
RMAN>SQL 'ALTER TABLESPACE users ONLINE';

對於redo log,RMAN線上備份策略中並不會儲存redo log
所以,當redo log丟失後,無法進行完全恢復
進行不完全恢復時,Oracle會自動建立redo log
具體來實踐一下步驟,先刪除test庫的所有redo log
此時資料庫只能到mount為止,無法open
這種情況可以直接在SqlPlus執行recover database until cancel
SQL>recover database until cancel;
然後執行
SQL>alter database open resetlogs;
這樣就可以了
不過,不同場合會有不同的恢復步驟,上面說的這個是最複雜的
是丟失全部redo log(主要是current redo log當前的)的恢復方式
如果丟失的不是current的,可以通過clear丟失的redo log進行重建
比如,我的test庫current日誌為group1的,我把組2的刪除(redo02.log)
然後執行(此時資料庫為mount)
SQL>ALTER DATABASE CLEAR LOGFILE
  2 '/home/oracle/oracle/oradata/test/redo02.log';
這裡要提一點,如果目標日誌是未歸檔的,需要在clear後加上unarchived
clear目標日誌後,就可以open了(不用resetlogs)
以前總結redo log的時候,談過如何往一個日誌組新增成員
利用這個功能再來實踐一下,新增成員命令如下
SQL> ALTER DATABASE ADD LOGFILE MEMBER
  2  '/home/oracle/oracle/oradata/test/redo02b.log' TO GROUP 2;
將各組都新增一個新成員,此時組2是current,刪除其中一個組員
switch幾次,讓新加入的成員全部生效(可通過v$logfile檢視)
通過v$log檢視current日誌是組2,刪除其中一個成員
關閉再開啟資料庫,可以open
但檢視alert日誌,可以看到有錯誤資訊
Errors in file /home/oracle/oracle/admin/test/bdump/test_lgwr_14179.trc:
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: '/home/oracle/oracle/oradata/test/redo02.log'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
Sat Jan 17 16:27:47 2009
Errors in file /home/oracle/oracle/admin/test/bdump/test_lgwr_14179.trc:
ORA-00321: log 2 of thread 1, cannot update log file header
ORA-00312: online log 2 thread 1: '/home/oracle/oracle/oradata/test/redo02.log'
Sat Jan 17 16:27:47 2009
Errors in file /home/oracle/oracle/admin/test/bdump/test_lgwr_14179.trc:
ORA-00313: open failed for members of log group 2 of thread 1
Thread 1 opened at log sequence 6
  Current log# 2 seq# 6 mem# 1: /home/oracle/oracle/oradata/test/redo02b.log
Successful open of redo thread 1
看到最後Oracle用組中的另一個成員來開啟資料庫
然後,我們可以通過先drop再add的方式恢復丟失日誌
SQL>alter database drop logfile member
  2 '/home/oracle/oracle/oradata/test/redo02.log';
SQL>alter database add logfile member
  2 '/home/oracle/oracle/oradata/test/redo02.log' to group 2;

最後再說個命令引數
以resetlogs方式open資料庫後,在重新備份資料庫時
可加delete all input,如下
backup database plus archivelog delete all input;
作用是刪除備份過的歸檔日誌,以節省硬碟空間
以後恢復前要先還原這些備份過的歸檔日誌
控制、引數檔案昨天已經提及過了,今天就不再細說

每次弄恢復就要花費不少時間……
一來是自己有些地方不太熟悉
二來查詢英文文件也頗費時間
還有恢復命令不像其它命令執行那麼快
每次都要等一等,我的test庫很小,有時一次命令還要執行好幾分鐘呢
這要是實際生產專案的大資料庫……
唉~恢復果然是個費勁的事情

經過最近一段時間的學習和實踐
對Oracle的一些基本備份恢復方法有了不少認識
本來今天想試試用RMAN的catalog,放到明天吧
今天的學習結束~看動畫去~^_^~

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/556359/viewspace-541329/,如需轉載,請註明出處,否則將追究法律責任。

相關文章