【Oracle】探究recover database until scn
在ogg資料初始化中,對於使用rman進行資料初始化和匯入匯出、資料泵進行資料初始化,最終啟動replicat程序時使用的是不同的兩個引數。
對於rman進行初始化的,我們使用的語句是:
start replicat rep_ynkg , atcsn xxxxxx
對於匯入匯出及資料泵進行初始化的,我們使用的語句是:
start replicat rep_ynkg , aftercsn xxxxx
原因是使用rman進行恢復時使用recover database until scn xxxxxx;進行的恢復,這個語句的恢復結果並不包含最後指定的xxxxxx這個scn。而匯入匯出及資料泵進行初始化時使用的
之前只是瞭解這個概念,沒有進行實驗,最近剛好有人問這個問題,做了個小實驗證明了下recover database until scn xxxxxx;不包最後指定的scn值。實驗過程如下(實驗步驟較長,對於非關鍵步驟只進行語言描述,就不貼出操作步驟了):
1.源庫建立system.test測試表。
create table system.test as select * from dba_objects where 1=2;
2.源庫增加goldengate extract程序,對system.test資料進行獲取。
3.源庫備份全庫。
4.源庫對測試表插入增量資料:
SQL> insert into system.test select * from dba_objects where rownum<=1;
1 row created.
SQL> commit;
Commit complete.
5.源庫歸檔current logfile
6.將源庫備份和歸檔傳輸到目標庫所在主機。
7.在源庫goldengate中使用logdump,檢視捕獲到增量資料的scn號。
Logdump 1 >open ./dirdat/t2000000
Current LogTrail is /home/oracle/ggs/dirdat/t2000000
Logdump 2 >ghdr on
Logdump 3 >detail data
Logdump 4 >ggstoken detail
略。。
Logdump 7 >n
___________________________________________________________________
Hdr-Ind : E (x45) Partition : . (x04)
UndoFlag : . (x00) BeforeAfter: A (x41)
RecLength : 198 (x00c6) IO Time : 2016/07/04 19:59:41.000.000
IOType : 5 (x05) OrigNode : 255 (xff)
TransInd : . (x03) FormatType : R (x52)
SyskeyLen : 0 (x00) Incomplete : . (x00)
AuditRBA : 33 AuditPos : 7736
Continued : N (x00) RecCount : 1 (x01)
2016/07/04 19:59:41.000.000 Insert Len 198 RBA 1053
Name: SYSTEM.TEST
After Image: Partition 4 G s
0000 0007 0000 0003 5359 5300 0100 0900 0000 0549 | ........SYS........I
434f 4c24 0002 0004 ffff 0000 0003 0006 0000 0002 | COL$................
3230 0004 0005 0000 0001 3200 0500 0900 0000 0554 | 20........2........T
4142 4c45 0006 0015 0000 3230 3133 2d30 382d 3234 | ABLE......2013-08-24
3a31 313a 3337 3a33 3500 0700 1500 0032 3031 332d | :11:37:35......2013-
3038 2d32 343a 3131 3a34 373a 3337 0008 0017 0000 | 08-24:11:47:37......
0013 3230 3133 2d30 382d 3234 3a31 313a 3337 3a33 | ..2013-08-24:11:37:3
Column 0 (x0000), Len 7 (x0007)
0000 0003 5359 53 | ....SYS
Column 1 (x0001), Len 9 (x0009)
0000 0005 4943 4f4c 24 | ....ICOL$
Column 2 (x0002), Len 4 (x0004)
ffff 0000 | ....
Column 3 (x0003), Len 6 (x0006)
0000 0002 3230 | ....20
Column 4 (x0004), Len 5 (x0005)
0000 0001 32 | ....2
Column 5 (x0005), Len 9 (x0009)
0000 0005 5441 424c 45 | ....TABLE
Column 6 (x0006), Len 21 (x0015)
0000 3230 3133 2d30 382d 3234 3a31 313a 3337 3a33 | ..2013-08-24:11:37:3
35 | 5
Column 7 (x0007), Len 21 (x0015)
0000 3230 3133 2d30 382d 3234 3a31 313a 3437 3a33 | ..2013-08-24:11:47:3
37 | 7
Column 8 (x0008), Len 23 (x0017)
0000 0013 3230 3133 2d30 382d 3234 3a31 313a 3337 | ....2013-08-24:11:37
3a33 35 | :35
Column 9 (x0009), Len 9 (x0009)
0000 0005 5641 4c49 44 | ....VALID
Column 10 (x000a), Len 5 (x0005)
0000 0001 4e | ....N
Column 11 (x000b), Len 5 (x0005)
0000 0001 4e | ....N
Column 12 (x000c), Len 5 (x0005)
0000 0001 4e | ....N
Column 13 (x000d), Len 5 (x0005)
0000 0001 31 | ....1
Column 14 (x000e), Len 4 (x0004)
ffff 0000 | ....
GGS tokens:
TokenID x52 'R' ORAROWID Info x00 Length 20
4141 4156 7561 4141 4241 4141 584c 4241 4141 0001 | AAAVuaAABAAAXLBAAA..
TokenID x4c 'L' LOGCSN Info x00 Length 7
3133 3036 3731 39 | 1306719
TokenID x36 '6' TRANID Info x00 Length 8
392e 352e 3132 3330 | 9.5.1230
可以看到捕獲到增量資料時,源端資料庫提交的scn號為1306719
8.在目標機對資料庫進行restore。
9.對目標庫使用語句進行recover,指定scn為1306719
RMAN> recover database until scn 1306719;
10.使用resetlogs開啟目標庫,檢視scn為1306719時提交的增量資料是否存在。
SQL> alter database open resetlogs;
Database altered.
SQL> select count(*) from system.test;
COUNT(*)
----------
0
可以看到增量資料並不存在!!!!
11.之後我們刪除目標端資料庫的資料檔案,重新進行恢復。最終指定scn為1306720,比剛才的scn大1。
RMAN> restore database ;
略。。。
RMAN> recover database until scn 1306720;
Starting recover at 04-JUL-16
using channel ORA_DISK_1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 07/04/2016 20:12:06
RMAN-20208: UNTIL CHANGE is before RESETLOGS change
RMAN> list incarnation;
List of Database Incarnations
DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1 1 SOURCEDB 310015860 PARENT 1 24-AUG-13
2 2 SOURCEDB 310015860 PARENT 925702 31-JAN-16
3 3 SOURCEDB 310015860 CURRENT 1306720 04-JUL-16
RMAN> reset database to incarnation 2;
database reset to incarnation 2
RMAN> recover database until scn 1306720;
12.使用resetlogs開啟目標庫,檢視scn為1306720時提交的增量資料是否存在。
SQL> alter database open resetlogs;
Database altered.
SQL> select count(*) from system.test;
COUNT(*)
----------
1
可以看到這次增量資料成功恢復進來了!!!
實驗表明使用recover database until scn xxxxxx;並不包含指定的這個scn~