錯刪除表空間,有rman全備的恢復 錯刪除表空間,有rman全備的恢復
1.生成測試資料 SQL> startup ORACLE 例程已經啟動。 Total System Global Area 105978600 bytes Fixed Size 453352 bytes Variable Size 79691776 bytes Database Buffers 25165824 bytes Redo Buffers 667648 bytes 資料庫裝載完畢。 資料庫已經開啟。 SQL> select * from a; select * from a * ERROR 位於第 1 行: ORA-00942: 表或檢視不存在 已用時間: 00: 00: 00.00 SQL> create table a (a int) tablespace users;
表已建立。 已用時間: 00: 00: 00.02 SQL> insert into a values (10) 2 ; 已建立 1 行。 已用時間: 00: 00: 00.00 SQL> commit; 提交完成。 已用時間: 00: 00: 00.00 SQL> archive log list; 資料庫日誌模式 存檔模式 自動存檔 啟用 存檔終點 d:oracleoradatartestarchive 最早的概要日誌序列 1 下一個存檔日誌序列 2 當前日誌序列 2 SQL> alter system switch logfile; 系統已更改。 已用時間: 00: 00: 00.00 SQL> archive log list; 資料庫日誌模式 存檔模式 自動存檔 啟用 存檔終點 d:oracleoradatartestarchive 最早的概要日誌序列 2 下一個存檔日誌序列 3 當前日誌序列 3 SQL> alter system switch logfile; 系統已更改。 已用時間: 00: 00: 03.00 SQL> select max(ktuxescnw * power(2, 32) + ktuxescnb) scn from x$ktuxe; SCN ---------- 69701 已用時間: 00: 00: 00.00 SQL> select max(ktuxescnw * power(2, 32) + ktuxescnb) scn from x$ktuxe; SCN ---------- 69783 已用時間: 00: 00: 00.00 SQL> select * from a; A ---------- 10 已用時間: 00: 00: 00.00 SQL> archive log list; 資料庫日誌模式 存檔模式 自動存檔 啟用 存檔終點 d:oracleoradatartestarchive 最早的概要日誌序列 4 下一個存檔日誌序列 5 當前日誌序列 5 2.做全備 RMAN> show all; RMAN 配置引數為: CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default CONFIGURE BACKUP OPTIMIZATION OFF; # default CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default CONFIGURE DEVICE TYPE DISK PARALLELISM 1; # default CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default CONFIGURE MAXSETSIZE TO UNLIMITED; # default 這裡是CONFIGURE CONTROLFILE AUTOBACKUP OFF RMAN> run { 2> allocate channel C1 type disk; 3> backup full tag 'FullBackup' format 'D:backupfull%d_%u_%s_%p.dbf' database include current controlfile; 4> sql ' alter system archive log current'; 5> release channel C1; 6> }
RMAN> list backup; 備份集列表 ===================
BS 關鍵字 型別 LV 大小 裝置型別 經過時間 完成時間 ------- ---- -- ---------- ----------- ------------ ---------- 1 Full 191M DISK 00:00:21 09-6月 -06 BP 關鍵字: 1 狀態: AVAILABLE 標記:FULLBACKUP 段名:D:BACKUPFULLRTEST_02HL6K65_2_1.DBF 包含的 SPFILE: 修改時間: 08-6月 -06 備份集 1 中的資料檔案列表 檔案 LV 型別 Ckp SCN Ckp 時間 名稱 ---- -- ---- ---------- ---------- ---- 1 Full 69776 09-6月 -06 D:ORACLEORADATARTESTSYSTEM01.DBF 2 Full 69776 09-6月 -06 D:ORACLEORADATARTESTUNDOTBS01.DBF 3 Full 69776 09-6月 -06 D:ORACLEORADATARTESTUSERS01.DBF 注意這裡的SCN,以後要恢復到這個SCN.這裡沒有用backup filesperset 3 archivelog all delete input;命令備份歸檔檔案.如果這個執行了這個命令那麼在最後恢復的時候要restore歸檔檔案. 3.刪表空間 SQL> drop tablespace users including contents; 表空間已丟棄。 已用時間: 00: 00: 01.02 SQL> archive log list; 資料庫日誌模式 存檔模式 自動存檔 啟用 存檔終點 d:oracleoradatartestarchive 最早的概要日誌序列 4 下一個存檔日誌序列 5 當前日誌序列 5 SQL> select max(ktuxescnw * power(2, 32) + ktuxescnb) scn from x$ktuxe; SCN ---------- 69874 已用時間: 00: 00: 00.00 刪tablespace users的OS檔案 4.shutdown immediate 5.從全備中恢復控制檔案 SQL> startup nomount; ORACLE 例程已經啟動。 Total System Global Area 105978600 bytes Fixed Size 453352 bytes Variable Size 79691776 bytes Database Buffers 25165824 bytes Redo Buffers 667648 bytes RMAN> restore controlfile from 'D:backupFULL02HL6FFO_2_1'; 6.用dbms_backup_restore還原所有資料檔案.注意是所有的資料檔案,而不單是users表空間的資料檔案.
SQL> DECLARE 2 devtype varchar2(256); 3 done boolean; 4 BEGIN 5 devtype:=sys.dbms_backup_restore.deviceAllocate (type=>'',ident=>'t1'); 6 sys.dbms_backup_restore.restoreSetDatafile; 7 sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>01,toname=>'D:oracleo radatartestSYSTEM01.DBF'); 8 sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>02,toname=>'D:oracleo radatartestUNDOTBS01.DBF'); 9 sys.dbms_backup_restore.restoreDatafileTo(dfnumber=>03,toname=>'D:oracleo radatartestUSERS01.DBF'); 10 sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'D:backupFU LLRTEST_02HL6K65_2_1.DBF', params=>null); 11 sys.dbms_backup_restore.deviceDeallocate; 12 END; 13 / PL/SQL 過程已成功完成。 已用時間: 00: 00: 02.02 /////////////////////////////////////////////////////////這時已經有D:oracleoradatartestUSERS01.DBF檔案了. SQL> startup force mount; ORACLE 例程已經啟動。 Total System Global Area 105978600 bytes Fixed Size 453352 bytes Variable Size 79691776 bytes Database Buffers 25165824 bytes Redo Buffers 667648 bytes 資料庫裝載完畢。 7.不完全恢復資料庫到scn=69776時,注意這裡要做不完全恢復,如果用until cancel,就恢復不了users表空間 RMAN> Recover database until scn 69776; 啟動 recover 於 09-6月 -06 使用通道 ORA_DISK_1 正在開始介質的恢復 存檔日誌執行緒 1 序列 4 已作為檔案 D:ORACLEORADATARTESTREDO01.LOG 存在於磁碟上 存檔日誌檔名 =D:ORACLEORADATARTESTREDO01.LOG 執行緒 =1 序列 =4 完成介質的恢復 完成 recover 於 09-6月 -06 (如果開始備份了歸檔檔案,並刪除了,那麼要先用dbms_backup_restore.restoreSetArchivedLog來恢復歸檔檔案,如果直接執行RMAN>restore ARCHIVELOG ALL會報錯RMAN-20242: specification does not match any archive log in the recovery catalog) 恢復歸檔檔案的命令舉例如下: DECLARE devtype varchar2(256); done boolean; BEGIN devtype:=sys.dbms_backup_restore.deviceAllocate (type=>'',ident=>'t1'); sys.dbms_backup_restore.restoreSetArchivedLog(destination=>'D:ORACLEORADATAARCHIVELOG'); sys.dbms_backup_restore.restoreArchivedLogRange; sys.dbms_backup_restore.restoreBackupPiece(done=>done,handle=>'D:TESTRMANFULL_LOG_03HKHN39_1_1.BAK', params=>null); sys.dbms_backup_restore.deviceDeallocate; END; / 8.開啟資料庫 SQL> alter database open; alter database open * ERROR 位於第 1 行: ORA-01589: 要開啟資料庫則必須使用 RESETLOGS 或 NORESETLOGS 選項 已用時間: 00: 00: 00.04 SQL> alter database open resetlogs;
資料庫已更改。 已用時間: 00: 00: 06.07 SQL> select * from a; A ---------- 10 已用時間: 00: 00: 00.00 SQL> 最初想透過rman來恢復資料檔案,但是發現不行,全備中控制檔案的備份沒有記錄備份的資訊,如果是CONFIGURE CONTROLFILE AUTOBACKUP ON,那麼透過 控制檔案單獨備份的備份集來恢復控制檔案,那麼就可以rman來恢復資料檔案.
|