刪除表空間,有rman全備的恢復(使用dbms_backup_restore來進行恢復)

rainbowbridg發表於2007-01-17

刪除表空間,有rman全備的恢復

錯刪除表空間,有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來恢復資料檔案.
ref: http://blog.chinaunix.net/u/20140/showart.php?id=126027[@more@]

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

相關文章