在oracle10g之前使用resetlogs打開數據庫之后,之前的的備份就不能用于恢復了。即不能進行跨resetlogs時間點的恢復。所以要求執行完之后馬上進行全庫備份。
Oracle10g以后允許跨越resetlogs時間點進行完全或者不完全恢復。實驗如下:
-
執行全庫備份。
RMAN> backup database plus archivelog delete all input;
insert into test select * from test;
SQL> alter system switch logfile;
SQL> commit;
Commit complete.
SQL> alter system switch logfile;
System altered.
SQL> truncate table test;
Table truncated.
SQL> alter system switch logfile;
System altered.
SQL> select * from v$log_history;
SQL> select recid,stamp,sequence#,first_change#,first_time,next_change# from v$log_history
2 where recid >80;
RECIDSTAMP FIRST_CHANGE# FIRST_TIME NEXT_CHANGE#
---------- ---------- ------------- ------------ ------------
81 856723148 2130643 27-AUG-14 2130889
82 856752323 2130889 27-AUG-14 2155374
83 856753004 2155375 28-AUG-14 2175380
84 856753636 2175380 28-AUG-14 2176030
85 856754916 2176030 28-AUG-14 2177334
86 856754945 2177334 28-AUG-14 2177347
87 856755046 2177347 28-AUG-14 2178414
88 856755142 2178414 28-AUG-14 2178471
89 856755199 2178471 28-AUG-14 2178508
90 856755243 2178508 28-AUG-14 2178543
91 856755424 2178543 28-AUG-14 2178823
RECIDSTAMP FIRST_CHANGE# FIRST_TIME NEXT_CHANGE#
---------- ---------- ------------- ------------ ------------
92 856755456 2178823 28-AUG-14 2178836
93 856755483 2178836 28-AUG-14 2178940
13 rows selected.
-
關閉數據庫、刪除數據模擬故障
刪除之后,執行如下
RMAN> startup mount;
Oracle instance started
database mounted
Total System Global Area 599785472 bytes
Fixed Size 2022600 bytes
Variable Size 268436280 bytes
Database Buffers 322961408 bytes
Redo Buffers 6365184 bytes
RMAN> run{
set until sequence 12 thread 1;
restore database;
recover database;
}
這里判斷具體到那個sequence,當前查詢如下,歷史查看v$log_history的sequence#:
Sql>archive log list;
如果出現這個錯誤:
SQL> recover database until cancel;
ORA-00283: recovery session canceled due to errors
ORA-01610: recovery using the BACKUP CONTROLFILE option must be done
SQL> recover database BACKUP CONTROLFILE
ORA-00905: missing keyword
解決:
recover database using backup controlfile until cancel;
RMAN> alter database open resetlogs;
查看序號是否復位:
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 0
Next log sequence to archive 1
Current log sequence 1
SQL> create conn xzsp create tt able tt as select * from dba_users;
Table created.
SQL> alter system switch logfile;
System altered.
SQL> select count(*) from tt;
COUNT(*)
----------
26
SQL> inert in sert into tt select * from tt;
26 rows created.
SQL> /
52 rows created.
SQL> /
104 rows created.
SQL> commit
2 ;
Commit complete.
SQL> alter system switch logfile;
System altered.
SQL> select recid,stamp,first_change#,first_time,next_change# from v$log_history;
RECID STAMP SEQUENCE# FIRST_CHANGE# FIRST_TIME NEXT_CHANGE#
---------- ---------- ---------- ------------- ------------ ------------
100 856759449 1 2179277 28-AUG-14 2179707
101 856759476 2 2179707 28-AUG-14 2179788
102 856761071 1 2179621 28-AUG-14 2179920
103 856761108 2 2179920 28-AUG-14 2179945
103 rows selected.
Oracle保留了resetlogs之前的日志序列號,并且日志recid繼續增長,控制文件也保留了歸檔日志的序列。所以可以跨RESETLOGS進行恢復。10g以前 是不能夠使用當前控制文件恢復之前的備份的。
RMAN> run {
2> restore database;
3> recover database;
4> }
SQL> select count(*) from tt;
COUNT(*)
----------
208
恢復能夠完成,還有log_archive_format有關系。
Sql>show parameter log_archive_format
log_archive_format string archive_%t_%s_%r.log
這里的%R是oracle新增的參數,是resetlogs的標志號.這一歸檔日志格式可以是不同Incarnation的數據庫歸檔日志避免相互覆蓋,從而跨越resetlogs恢復的日志基礎得以保證。
?
?
思考:這里看到rman備份只有一次,是在resetlogs之前,第二次完全恢復是基于之前的備份。這里看到oracle10確實是越過了resetlog執行了恢復。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
