- 論壇徽章:
- 0
|
今天有空又做了一次Oracle 10g跨越Resetlogs時(shí)間點(diǎn)進(jìn)行恢復(fù),對(duì)于其中日志推進(jìn)的問題,以及如何跨越的,進(jìn)行了最大限度的求證。
C:\Documents and Settings\Administrator>rman target /
恢復(fù)管理器: Release 11.1.0.6.0 - Production on 星期二 12月 30 21:13:46 2008
Copyright (c) 1982, 2007, Oracle. All rights reserved.
連接到目標(biāo)數(shù)據(jù)庫: ORCL (DBID=1202355191)
RMAN> backup database plus archivelog delete all input;
(字?jǐn)?shù)限制,過程略)
恢復(fù)管理器完成。
SQL> alter system switch logfile; -----這里切換到了序列第60的日志,之前的序列為59
系統(tǒng)已更改。
SQL> select count(*) from t;
select count(*) from t
*
第 1 行出現(xiàn)錯(cuò)誤:
ORA-00942: 表或視圖不存在
SQL> select * from nam.t;
ID TDATE TSCN
---------- -------------- ----------
1 30-12月-08 393466
2 30-12月-08 393466
3 30-12月-08 393466
4 30-12月-08 393466
5 30-12月-08 393466
6 30-12月-08 393466
7 30-12月-08 393466
8 30-12月-08 393466
9 30-12月-08 393466
10 30-12月-08 393466
已選擇10行。
SQL> conn nam/nam
已連接。
SQL> begin
2 for i in 11 .. 20 loop
3 insert into t values(i,sysdate,dbms_flashback.get_system_change_number);
4 end loop;
5 commit;
6 end;
7 /
PL/SQL 過程已成功完成。
SQL> alter system switch logfile; -----這里切換到了序列第61的日志,之前的序列為60
系統(tǒng)已更改。
SQL> begin
2 for i in 21 .. 30 loop
3 insert into t values(i,sysdate,dbms_flashback.get_system_change_number);
4 end loop;
5 commit;
6 end;
7 /
PL/SQL 過程已成功完成。
SQL> alter system switch logfile; -----這里切換到了序列第62的日志,之前的序列為61
系統(tǒng)已更改。
SQL> select * from t;
ID TDATE TSCN
---------- -------------- ----------
12 30-12月-08 393652
13 30-12月-08 393652
14 30-12月-08 393652
15 30-12月-08 393652
16 30-12月-08 393652
17 30-12月-08 393652
18 30-12月-08 393652
19 30-12月-08 393652
20 30-12月-08 393652
21 30-12月-08 393667
22 30-12月-08 393667
ID TDATE TSCN
---------- -------------- ----------
23 30-12月-08 393667
24 30-12月-08 393667
25 30-12月-08 393667
26 30-12月-08 393667
27 30-12月-08 393667
28 30-12月-08 393667
29 30-12月-08 393667
30 30-12月-08 393667
1 30-12月-08 393466
2 30-12月-08 393466
3 30-12月-08 393466
ID TDATE TSCN
---------- -------------- ----------
4 30-12月-08 393466
5 30-12月-08 393466
6 30-12月-08 393466
7 30-12月-08 393466
8 30-12月-08 393466
9 30-12月-08 393466
10 30-12月-08 393466
11 30-12月-08 393652
已選擇30行。
SQL> archive log list;
數(shù)據(jù)庫日志模式 存檔模式
自動(dòng)存檔 啟用
存檔終點(diǎn) USE_DB_RECOVERY_FILE_DEST
最早的聯(lián)機(jī)日志序列 60
下一個(gè)存檔日志序列 62
當(dāng)前日志序列 62
C:\Documents and Settings\Administrator>set nls_date_format=yyyy-mm-dd hh24:mi:ss
SQL> select recid,stamp,first_time,sequence# from v$log_history where recid > 94
;
RECID STAMP FIRST_TIME SEQUENCE#
---------- ---------- ------------------- ----------
95 674860547 2008-12-30 21:14:09 58
96 674860657 2008-12-30 21:15:46 59
97 674860793 2008-12-30 21:17:37 60
98 674860817 2008-12-30 21:19:53 61
現(xiàn)在測(cè)試恢復(fù)到60的之前狀態(tài),NAM.T應(yīng)該只有10條記錄。
關(guān)閉數(shù)據(jù)庫,刪除數(shù)據(jù)文件。
SQL> shutdown abort;
ORACLE 例程已經(jīng)關(guān)閉。
RMAN> startup mount;
Oracle 實(shí)例已啟動(dòng)
數(shù)據(jù)庫已裝載
系統(tǒng)全局區(qū)域總計(jì) 535662592 字節(jié)
Fixed Size 1334380 字節(jié)
Variable Size 213910420 字節(jié)
Database Buffers 314572800 字節(jié)
Redo Buffers 5844992 字節(jié)
RMAN> run {
2> set until sequence 60 thread 1;
3> restore database;
4> recover database;
5> }
正在執(zhí)行命令: SET until clause
使用目標(biāo)數(shù)據(jù)庫控制文件替代恢復(fù)目錄
啟動(dòng) restore 于 30-12月-08
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=154 設(shè)備類型=DISK
通道 ORA_DISK_1: 正在開始還原數(shù)據(jù)文件備份集
通道 ORA_DISK_1: 正在指定從備份集還原的數(shù)據(jù)文件
通道 ORA_DISK_1: 將數(shù)據(jù)文件 00001 還原到 G:\ORADATA\ORCL\SYSTEM01.DBF
通道 ORA_DISK_1: 將數(shù)據(jù)文件 00002 還原到 G:\ORADATA\ORCL\SYSAUX01.DBF
通道 ORA_DISK_1: 將數(shù)據(jù)文件 00003 還原到 G:\ORADATA\ORCL\UNDOTBS01.DBF
通道 ORA_DISK_1: 將數(shù)據(jù)文件 00004 還原到 G:\ORADATA\ORCL\USERS01.DBF
通道 ORA_DISK_1: 將數(shù)據(jù)文件 00005 還原到 G:\ORADATA\ORCL\NAM01.DBF
通道 ORA_DISK_1: 正在讀取備份片段 G:\BACKUP\B_20081230_43_1
通道 ORA_DISK_1: 段句柄 = G:\BACKUP\B_20081230_43_1 標(biāo)記 = TAG20081230T211418
通道 ORA_DISK_1: 已還原備份片段 1
通道 ORA_DISK_1: 還原完成, 用時(shí): 00:01:06
完成 restore 于 30-12月-08
啟動(dòng) recover 于 30-12月-08
使用通道 ORA_DISK_1
正在開始介質(zhì)的恢復(fù)
線程 1 序列 59 的歸檔日志已作為文件 G:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2008_
12_30\O1_MF_1_59_4ON7VKC7_.ARC 存在于磁盤上
通道 ORA_DISK_1: 正在開始將歸檔日志還原到默認(rèn)目標(biāo)
通道 ORA_DISK_1: 正在還原歸檔日志
歸檔日志線程=1 序列=58
通道 ORA_DISK_1: 正在讀取備份片段 G:\BACKUP\B_20081230_44_1
通道 ORA_DISK_1: 段句柄 = G:\BACKUP\B_20081230_44_1 標(biāo)記 = TAG20081230T211549
通道 ORA_DISK_1: 已還原備份片段 1
通道 ORA_DISK_1: 還原完成, 用時(shí): 00:00:01
歸檔日志文件名=G:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2008_12_30\O1_MF_1_58_4ON9
H4QG_.ARC 線程=1 序列=58
通道 default: 正在刪除歸檔日志
歸檔日志文件名=G:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2008_12_30\O1_MF_1_58_4ON9
H4QG_.ARC RECID=208 STAMP=674862308
歸檔日志文件名=G:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2008_12_30\O1_MF_1_59_4ON7
VKC7_.ARC 線程=1 序列=59
介質(zhì)恢復(fù)完成, 用時(shí): 00:00:02
完成 recover 于 30-12月-08
RMAN> alter database open resetlogs;
數(shù)據(jù)庫已打開
RMAN> exit
恢復(fù)管理器完成。
-------檢查狀態(tài)
SQL> conn nam/nam
已連接。
SQL> select * from t;
ID TDATE TSCN
---------- ------------------- ----------
1 2008-12-30 21:12:49 393466
2 2008-12-30 21:12:49 393466
3 2008-12-30 21:12:49 393466
4 2008-12-30 21:12:49 393466
5 2008-12-30 21:12:49 393466
6 2008-12-30 21:12:49 393466
7 2008-12-30 21:12:49 393466
8 2008-12-30 21:12:49 393466
9 2008-12-30 21:12:49 393466
10 2008-12-30 21:12:49 393466
已選擇10行。
SQL> create tt as select * from t;
create tt as select * from t
*
第 1 行出現(xiàn)錯(cuò)誤:
ORA-00901: 無效 CREATE 命令
SQL> create table tt as select * from t;
表已創(chuàng)建。
SQL> alter system switch logfile;
系統(tǒng)已更改。
SQL> select count(*) from tt;
COUNT(*)
----------
10
SQL> insert into tt select * from tt;
已創(chuàng)建10行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統(tǒng)已更改。
SQL> select recid,stamp,first_time,sequence# from v$log_history where recid > 94;
RECID STAMP FIRST_TIME SEQUENCE#
---------- ---------- ------------------- ----------
95 674860547 2008-12-30 21:14:09 58
96 674860657 2008-12-30 21:15:46 59
97 674860793 2008-12-30 21:17:37 60
98 674860817 2008-12-30 21:19:53 61
99 674863695 2008-12-30 21:45:23 1
100 674863732 2008-12-30 22:08:15 2
已選擇6行。
SQL>
此時(shí),日志的RECID繼續(xù)增長(zhǎng),控制文件保留了歸檔日志的序列,這也就證明了resetlogs的恢復(fù)成為可能(引用EYGLE的原話)
再次刪除所有數(shù)據(jù)文件,再次恢復(fù)(注意,10g之前使用當(dāng)前resetlogs過的控制文件是不能夠恢復(fù)以前的備份)
RMAN> startup mount;
Oracle 實(shí)例已啟動(dòng)
數(shù)據(jù)庫已裝載
系統(tǒng)全局區(qū)域總計(jì) 535662592 字節(jié)
Fixed Size 1334380 字節(jié)
Variable Size 213910420 字節(jié)
Database Buffers 314572800 字節(jié)
Redo Buffers 5844992 字節(jié)
RMAN> run {
2> restore database;
3> recover database;
4> }
啟動(dòng) restore 于 2008-12-30 22:29:39
使用目標(biāo)數(shù)據(jù)庫控制文件替代恢復(fù)目錄
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=154 設(shè)備類型=DISK
通道 ORA_DISK_1: 正在開始還原數(shù)據(jù)文件備份集
通道 ORA_DISK_1: 正在指定從備份集還原的數(shù)據(jù)文件
通道 ORA_DISK_1: 將數(shù)據(jù)文件 00001 還原到 G:\ORADATA\ORCL\SYSTEM01.DBF
通道 ORA_DISK_1: 將數(shù)據(jù)文件 00002 還原到 G:\ORADATA\ORCL\SYSAUX01.DBF
通道 ORA_DISK_1: 將數(shù)據(jù)文件 00003 還原到 G:\ORADATA\ORCL\UNDOTBS01.DBF
通道 ORA_DISK_1: 將數(shù)據(jù)文件 00004 還原到 G:\ORADATA\ORCL\USERS01.DBF
通道 ORA_DISK_1: 將數(shù)據(jù)文件 00005 還原到 G:\ORADATA\ORCL\NAM01.DBF
通道 ORA_DISK_1: 正在讀取備份片段 G:\BACKUP\B_20081230_43_1
通道 ORA_DISK_1: 段句柄 = G:\BACKUP\B_20081230_43_1 標(biāo)記 = TAG20081230T211418
通道 ORA_DISK_1: 已還原備份片段 1
通道 ORA_DISK_1: 還原完成, 用時(shí): 00:01:16
完成 restore 于 2008-12-30 22:31:00
啟動(dòng) recover 于 2008-12-30 22:31:00
使用通道 ORA_DISK_1
正在開始介質(zhì)的恢復(fù)
線程 1 序列 59 的歸檔日志已作為文件 G:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2008_
12_30\O1_MF_1_59_4ON7VKC7_.ARC 存在于磁盤上
線程 1 序列 1 的歸檔日志已作為文件 G:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2008_1
2_30\O1_MF_1_1_4ONBTHQX_.ARC 存在于磁盤上
線程 1 序列 2 的歸檔日志已作為文件 G:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2008_1
2_30\O1_MF_1_2_4ONBVNPY_.ARC 存在于磁盤上
通道 ORA_DISK_1: 正在開始將歸檔日志還原到默認(rèn)目標(biāo)
通道 ORA_DISK_1: 正在還原歸檔日志
歸檔日志線程=1 序列=58
通道 ORA_DISK_1: 正在讀取備份片段 G:\BACKUP\B_20081230_44_1
通道 ORA_DISK_1: 段句柄 = G:\BACKUP\B_20081230_44_1 標(biāo)記 = TAG20081230T211549
通道 ORA_DISK_1: 已還原備份片段 1
通道 ORA_DISK_1: 還原完成, 用時(shí): 00:00:02
歸檔日志文件名=G:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2008_12_30\O1_MF_1_58_4OND
570H_.ARC 線程=1 序列=58
通道 default: 正在刪除歸檔日志
歸檔日志文件名=G:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2008_12_30\O1_MF_1_58_4OND
570H_.ARC RECID=215 STAMP=674865063
歸檔日志文件名=G:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2008_12_30\O1_MF_1_59_4ON7
VKC7_.ARC 線程=1 序列=59
介質(zhì)恢復(fù)完成, 用時(shí): 00:00:06
完成 recover 于 2008-12-30 22:31:10
RMAN> alter database open;
數(shù)據(jù)庫已打開
RMAN>
SQL> select count(*) from t;
COUNT(*)
----------
10
SQL> select count(*) from tt;
COUNT(*)
----------
20
SQL>
跳過了第60個(gè)日志到第62個(gè)日志,然后正確應(yīng)用了1-2的日志。
到這里我在想,這種恢復(fù)手段的應(yīng)用范圍,也許這樣做的目的僅僅是為了備份一次,然后做了不完全恢復(fù),再繼續(xù)使用數(shù)據(jù)庫但是沒有備份,那么恢復(fù)的時(shí)候自然就跳過了resetlogs的那些個(gè)日志,控制文件里面應(yīng)該記錄的信息就應(yīng)該包含被resetlogs的日志序列,這樣恢復(fù)時(shí)自然會(huì)跳過。
SQL> select recid,stamp,first_time,first_change#,sequence# from v$log_history wh
ere recid > 94;
RECID STAMP FIRST_TIME FIRST_CHANGE# SEQUENCE#
---------- ---------- ------------------- ------------- ----------
95 674860547 2008-12-30 21:14:09 393517 58
96 674860657 2008-12-30 21:15:46 393559 59
97 674860793 2008-12-30 21:17:37 393610 60
98 674860817 2008-12-30 21:19:53 393662 61
99 674863695 2008-12-30 21:45:23 393611 1
100 674863732 2008-12-30 22:08:15 398609 2
101 674865190 2008-12-30 22:08:52 398626 3
已選擇7行。
SQL>
注意,60的起始SCN和1的起始SCN是連在一起的,也就是說,從60開始的后續(xù)SCN是作廢的。
于是,我DMUP了控制文件:
***************************************************************************
REDO THREAD RECORDS
***************************************************************************
(size = 256, compat size = 256, section max = 8, section in-use = 1,
last-recid= 0, old-recno = 0, last-recno = 0)
(extent = 1, blkno = 9, numrecs = 
THREAD #1 - status:0xf thread links forward:0 back:0
#logs:3 first:1 last:3 current:1 last used seq#:0x4
enabled at scn: 0x0000.0006018b 12/30/2008 21:45:23
disabled at scn: 0x0000.00000000 01/01/1988 00:00:00
opened at 12/30/2008 22:33:10 by instance orcl
Checkpointed at scn: 0x0000.00066649 12/30/2008 22:33:10
thread:1 rba 0x4.2.10)
這一段信息讓我恍然大悟,跨越恢復(fù)時(shí),應(yīng)該按照SCN進(jìn)行日志推進(jìn),查看v$archived_log
SQL> select stamp,
2 sequence#,
3 first_change#,
4 first_time,
5 next_change#,
6 end_of_redo_type
7 from v$archived_log x
8 where x.stamp > 674860547
9 order by first_change#
10 /
STAMP SEQUENCE# FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# END_OF_REDO_TYPE
---------- ---------- ------------- ----------- ------------ ----------------
674860548 58 393517 2008-12-30 393559
674860548 58 393517 2008-12-30 393559
674865063 58 393517 2008-12-30 393559
674862308 58 393517 2008-12-30 393559
674860657 59 393559 2008-12-30 393610
674860657 59 393559 2008-12-30 393610
674860794 60 393610 2008-12-30 393662
674860794 60 393610 2008-12-30 393662
674863696 1 393611 2008-12-30 398609
674863696 1 393611 2008-12-30 398609
674860818 61 393662 2008-12-30 393676
674860818 61 393662 2008-12-30 393676
674862324 62 393676 2008-12-30 394231 RESETLOGS
674862324 62 393676 2008-12-30 394231 RESETLOGS
674863733 2 398609 2008-12-30 398626
674863733 2 398609 2008-12-30 398626
674865192 3 398626 2008-12-30 419400
674865192 3 398626 2008-12-30 419400
18 rows selected
SQL>
把當(dāng)前日志歸檔后,再次DUMP控制文件
SQL> alter system archive log current;
系統(tǒng)已更改。
SQL> alter system switch logfile;
系統(tǒng)已更改。
SQL> alter system switch logfile;
系統(tǒng)已更改。
SQL> alter system switch logfile;
系統(tǒng)已更改。
SQL> alter session set events 'immediate trace name CONTROLF level 4';
會(huì)話已更改。
SQL> select d.value || '/' || lower(rtrim(i.instance, chr(0))) || '_ora_' ||
2 p.spid || '.trc' trace_file_name
3 from (select p.spid
4 from v$mystat m, v$session s, v$process p
5 where m.statistic# = 1
6 and s.sid = m.sid
7 and p.addr = s.paddr) p,
8 (select t.instance
9 from v$thread t, v$parameter v
10 where v.name = 'thread'
11 and (v.value = 0 or t.thread# = to_number(v.value))) i,
12 (select value from v$parameter where name = 'user_dump_dest') d
13 /
TRACE_FILE_NAME
-------------------------------------------------------------------------------
e:\oracle\diag\rdbms\orcl\orcl\trace/orcl_ora_2884.trc
SQL>
看一下信息,注意Checkpointed at scn
***************************************************************************
REDO THREAD RECORDS
***************************************************************************
(size = 256, compat size = 256, section max = 8, section in-use = 1,
last-recid= 0, old-recno = 0, last-recno = 0)
(extent = 1, blkno = 9, numrecs = 
THREAD #1 - status:0xf thread links forward:0 back:0
#logs:3 first:1 last:3 current:3 last used seq#:0x9
enabled at scn: 0x0000.0006018b 12/30/2008 21:45:23
disabled at scn: 0x0000.00000000 01/01/1988 00:00:00
opened at 12/30/2008 22:33:10 by instance orcl
Checkpointed at scn: 0x0000.00066d55 12/30/2008 23:18:13
thread:1 rba 0x9.2.10)
第一次DUMP信息 Checkpointed at scn 0x0000.00066649,第二次Checkpointed at scn 0x0000.00066d55,但是,enabled at scn: 0x0000.0006018b沒有變化。
繼續(xù)DUMP序列為60的歸檔文件
SQL> select stamp,
2 NAME,
3 sequence#
4 from v$archived_log
5 where sequence#=60
6 /
STAMP NAME SEQUENCE#
---------- -------------------------------------------------------------------------------- ----------
674860794 E:\ORACLE\PRODUCT\11.1.0\DB_1\RDBMS\ARC00060_0674761419.001 60
674860794 G:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2008_12_30\O1_MF_1_60_4ON7ZSRF_.ARC 60
SQL> alter system dump logfile 'E:\ORACLE\PRODUCT\11.1.0\DB_1\RDBMS\ARC00060_067
4761419.001';
系統(tǒng)已更改。
SQL> select d.value || '/' || lower(rtrim(i.instance, chr(0))) || '_ora_' ||
2 p.spid || '.trc' trace_file_name
3 from (select p.spid
4 from v$mystat m, v$session s, v$process p
5 where m.statistic# = 1
6 and s.sid = m.sid
7 and p.addr = s.paddr) p,
8 (select t.instance
9 from v$thread t, v$parameter v
10 where v.name = 'thread'
11 and (v.value = 0 or t.thread# = to_number(v.value))) i,
12 (select value from v$parameter where name = 'user_dump_dest') d
13 /
TRACE_FILE_NAME
--------------------------------------------------------------------------------
e:\oracle\diag\rdbms\orcl\orcl\trace/orcl_ora_3236.trc
SQL>
把59也DUMP一下,比較其中信息:
60記錄的信息比59的要多了很多,但我沒發(fā)現(xiàn)有什么特別有價(jià)值的信息。。看一下控制文件記錄的數(shù)據(jù)文件部分:
***************************************************************************
DATA FILE RECORDS
***************************************************************************
(size = 520, compat size = 520, section max = 100, section in-use = 6,
last-recid= 23, old-recno = 0, last-recno = 0)
(extent = 1, blkno = 11, numrecs = 100)
DATA FILE #1:
(name # G:\ORADATA\ORCL\SYSTEM01.DBF
creation size=0 block size=8192 status=0xe head=8 tail=8 dup=1
tablespace 0, index=1 krfil=1 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:185 scn: 0x0000.00066649 12/30/2008 22:33:10
Stop scn: 0xffff.ffffffff 12/30/2008 22:28:36
Creation Checkpointed at scn: 0x0000.0000000b 12/27/2008 13:48:04
thread:0 rba 0x0.0.0)
所以,我想,ORACLE是怎么判斷跨越恢復(fù)的呢,第一,肯定是按SCN來推進(jìn)的,那么,是怎么銜接的呢?應(yīng)該是控制文件在請(qǐng)求日志推進(jìn)時(shí)首先比較了restore出來的數(shù)據(jù)文件頭記錄的scn,之后和自己記錄的數(shù)據(jù)文件scn做比較,確定恢復(fù)的范圍。然后再根據(jù)自己記錄的enabled at scn: 0x0000.0006018b為歸檔日志的銜接標(biāo)志,當(dāng)從歷史歸檔日志中恢復(fù)到0x0000.0006018a時(shí)后續(xù)部分將不再恢復(fù),轉(zhuǎn)向控制文件中記錄的0x0000.0006018b所對(duì)應(yīng)的新序列日志(可能是歸檔,也可能是REDO)。啟動(dòng)數(shù)據(jù)庫后,v$archived_log里end_of_redo_type字段信息,應(yīng)該也是比較scn得出的結(jié)果,將first_change#與enabled at scn銜接的日志之后的未重置序列號(hào)的日志全部標(biāo)記上RESETLOGS(比如本案例中,60的first_change#是0x0000.0006018a,和控制文件中的enabled at scn: 0x0000.0006018b銜接,所以60之后的兩個(gè)日志,不包含60,都被注上了標(biāo)記RESETLOGS,雖然60沒有被著名標(biāo)記,由于SCN的關(guān)系,它其實(shí)也是個(gè)廢的)。
這只是我能力范圍內(nèi)最大限度的求證了,希望大家指正。 |
|