[20170301]dg環境下線上日志損壞5.txt
--//星期天跟别人聊天時提到的恢複方法,如果資料庫的線上日志損壞,而日志已經傳輸到dg上,是否可以将dg的日志傳輸過來用于恢複.
--//問:使用備庫切換為主庫不就ok了嗎?
--//答:備庫的性能無法應付正常的業務.
--//^_^,這種情況倒是很常見,備庫僅僅起一個備份的作用.真正出了問題無法作為業務庫使用.通過測試驗證可行性:
1.環境:
--//檢查dg日志傳輸與應用正常.這很關鍵,不然dg沒有最新的應用日志.
SCOTT@book> @ &r/ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
--//測試前最好清除歸檔以及備份.
SCOTT@book> create table t as select rownum id , lpad(chr(96+rownum),10,chr(96+rownum)) name from dual connect by level<=20;
Table created.
--session 1:
update t set name=upper(name) where id=1;
commit ;
SYS@book> select rowid,t.* from scott.t where rownum=1;
ROWID ID NAME
------------------ ---------- --------------------
AAAWD4AAEAAAAIjAAA 1 AAAAAAAAAA
SYS@book> @ &r/rowid AAAWD4AAEAAAAIjAAA
OBJECT FILE BLOCK ROW ROWID_DBA DBA TEXT
---------- ---------- ---------- ---------- -------------------- -------------------- ----------------------------------------
90360 4 547 0 0x1000223 4,547 alter system dump datafile 4 block 547 ;
--//記錄在那個資料塊.
--session 2,修改不送出:
update t set name=upper(name) where id=2;
--session 3,選擇異常關機便于模拟增加恢複難度.
shutdown abort.
2.在主庫上與備庫做一個冷備份:(正常不要選擇這樣模式關機作為冷備份)
$ mkdir /u01/backup/20170301B
$ cp -ar /mnt/ramdisk/book/* /u01/backup/20170301B/ /* 拷貝檔案的目錄/u01/backup/20170301B. */
$ ll /mnt/ramdisk/book/r*.log
-rw-r----- 1 oracle oinstall 52429312 2017-02-27 11:23:33 /mnt/ramdisk/book/redo01.log
-rw-r----- 1 oracle oinstall 52429312 2017-02-27 11:08:17 /mnt/ramdisk/book/redo02.log
-rw-r----- 1 oracle oinstall 52429312 2017-02-27 11:08:22 /mnt/ramdisk/book/redo03.log
-rw-r----- 1 oracle oinstall 52429312 2017-02-27 11:02:16 /mnt/ramdisk/book/redostb01.log
-rw-r----- 1 oracle oinstall 52429312 2017-02-27 11:02:16 /mnt/ramdisk/book/redostb02.log
-rw-r----- 1 oracle oinstall 52429312 2017-02-27 11:02:16 /mnt/ramdisk/book/redostb03.log
-rw-r----- 1 oracle oinstall 52429312 2017-02-27 11:02:16 /mnt/ramdisk/book/redostb04.log
--//删除日志.
$ /bin/rm /mnt/ramdisk/book/r*.log
--//備庫的冷備份不再貼出.
3.開始恢複測試:
SYS@book> startup
ORACLE instance started.
Total System Global Area 634732544 bytes
Fixed Size 2255792 bytes
Variable Size 197133392 bytes
Database Buffers 427819008 bytes
Redo Buffers 7524352 bytes
Database mounted.
ORA-00313: open failed for members of log group 3 of thread 1
ORA-00312: online log 3 thread 1: '/mnt/ramdisk/book/redo03.log'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
--//暫時禁止傳輸日志.
SYS@book> alter system set log_archive_dest_state_2=defer;
System altered.
4.首先确定要恢複到scn是多少:
--//打開備庫到mount:
SYS@bookdg> @ &r/logfile
GROUP# STATUS TYPE MEMBER IS_ GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
------ ------ ------- -------------------------------- --- ------ ------- --------- ----------- --------- ------- --- ---------- ------------- ------------------- ------------ -------------------
1 ONLINE /mnt/ramdisk/book/redo01.log NO 1 1 695 52428800 512 1 YES CURRENT 13276910949 2017-02-28 14:40:12 2.814750E+14
2 ONLINE /mnt/ramdisk/book/redo02.log NO 2 1 0 52428800 512 1 YES UNUSED 13276889179 2017-02-27 08:59:01 2.814750E+14
3 ONLINE /mnt/ramdisk/book/redo03.log NO 3 1 0 52428800 512 1 YES UNUSED 13276910486 2017-02-28 14:40:06 13276910949 2017-02-28 14:40:12
4 STANDBY /mnt/ramdisk/book/redostb01.log NO
5 STANDBY /mnt/ramdisk/book/redostb02.log NO
6 STANDBY /mnt/ramdisk/book/redostb03.log NO
7 STANDBY /mnt/ramdisk/book/redostb04.log NO
7 rows selected.
SYS@bookdg> select * from v$standby_log ;
GROUP# DBID THREAD# SEQUENCE# BYTES BLOCKSIZE USED ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME LAST_CHANGE# LAST_TIME
------ ---------- ------- --------- ----------- --------- ------------ --- ---------- ------------- ------------------- ------------ ------------------- ------------ -------------------
4 1337401710 1 695 52428800 512 78848 YES ACTIVE 13276910949 2017-02-28 14:40:12 13276911100 2017-02-28 14:42:35
5 UNASSIGNED 1 0 52428800 512 0 NO UNASSIGNED
6 UNASSIGNED 0 0 52428800 512 0 YES UNASSIGNED
7 UNASSIGNED 0 0 52428800 512 0 YES UNASSIGNED
--//LAST_CHANGE#=13276911100.而是可以确定最新的接收日志的檔案是/mnt/ramdisk/book/redostb01.log.
--//我建議在備庫打開flashback 功能.
SYS@bookdg> alter database flashback on;
Database altered.
SYS@bookdg> alter system dump logfile '/mnt/ramdisk/book/redostb01.log' validate;
--//檢查轉儲檔案:
DUMP OF REDO FROM FILE '/mnt/ramdisk/book/redostb01.log'
Opcodes *.*
RBAs: 0x000000.00000000.0000 thru 0xffffffff.ffffffff.ffff
SCNs: scn: 0x0000.00000000 thru scn: 0xffff.ffffffff
Times: creation thru eternity
VALIDATE ONLY
FILE HEADER:
Compatibility Vsn = 186647552=0xb200400
Db ID=1337401710=0x4fb7216e, Db Name='BOOK'
Activation ID=1337448558=0x4fb7d86e
Control Seq=36141=0x8d2d, File size=102400=0x19000
File Number=4, Blksiz=512, File Type=2 LOG
descrip:"Thread 0001, Seq# 0000000695, SCN 0x0003175d9565-0xffffffffffff"
thread: 1 nab: 0xffffffff seq: 0x000002b7 hws: 0x2 eot: 0 dis: 0
resetlogs count: 0x35711eb0 scn: 0x0000.000e2006 (925702)
prev resetlogs count: 0x3121c97a scn: 0x0000.00000001 (1)
Low scn: 0x0003.175d9565 (13276910949) 02/28/2017 14:40:12
Next scn: 0xffff.ffffffff 01/01/1988 00:00:00
Enabled scn: 0x0000.000e2006 (925702) 11/24/2015 09:11:12
Thread closed scn: 0x0003.175d9565 (13276910949) 02/28/2017 14:40:12
Disk cksum: 0xb59c Calc cksum: 0xb59c
Terminal recovery stop scn: 0x0000.00000000
Terminal recovery 01/01/1988 00:00:00
Most recent redo scn: 0x0000.00000000
Largest LWN: 0 blocks
End-of-redo stream : No
Maximize performance mode
Miscellaneous flags: 0x822000
Thread internal enable indicator: thr: 0, seq: 0 scn: 0x0000.00000000
Zero blocks: 0
Format ID is 2
redo log key is 12e926f77b40c080dc716e8a264c329f
redo log key flag is 5
Enabled redo threads: 1
END OF REDO DUMP
----- Redo read statistics for thread 1 -----
Read rate (SYNC): 76Kb in 0.01s => 7.47 Mb/sec
Total redo bytes: 1023Kb Longest record: 2Kb, moves: 0/10 moved: 0Mb (0%)
Longest LWN: 2Kb, reads: 142
Last redo scn: 0x0003.175d95fb (13276911099)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Change vector header moves = 0/23 (0%)
----------------------------------------------
--//最後的Last redo scn: 0x0003.175d95fb (13276911099).也就是講恢複就是使用這個檔案.
4.拷貝到主庫恢複看看.
--//備庫
$ scp /mnt/ramdisk/book/redostb01.log [email protected]:/u01/backup
--//嘗試在主庫恢複看看.
SYS@book> recover database until change 13276911099;
ORA-00279: change 13276910487 generated at 02/28/2017 14:40:06 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/archivelog/book/1_694_896605872.dbf
ORA-00280: change 13276910487 for thread 1 is in sequence #694
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00283: recovery session canceled due to errors
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/mnt/ramdisk/book/redo01.log'
ORA-01112: media recovery not started
--//檔案/mnt/ramdisk/book/redo01.log已經删除.
--//還差sequence #695的日志.
--//不能手動指定恢複日志檔案.
SYS@book> recover database using backup controlfile until cancel;
ORA-00279: change 13276910949 generated at 02/28/2017 14:40:12 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/archivelog/book/1_695_896605872.dbf
ORA-00280: change 13276910949 for thread 1 is in sequence #695
/u01/backup/redostb01.log
ORA-00354: corrupt redo log block header
ORA-00353: log corruption near block 155 change 13276911099 time 02/28/2017 14:42:35
ORA-00334: archived log: '/u01/backup/redostb01.log'
--//使用這樣恢複,注意要看提示,ORA-01112: media recovery not started.也就是這種異常關閉資料庫的redo,oracle根本不選擇恢複.
--//我在這裡測試N次,發現隻能使用如下指令recover database using backup controlfile until change 13276911099;
--//要使用參數using backup controlfile,并且要使用change NNNN,指定scn!!!
SYS@book> recover database using backup controlfile until change 13276911099;
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/mnt/ramdisk/book/system01.dbf'
--//還是要仔細看提示,實際上已經做到scn=13276911099.
SYS@book> SELECT file#, CHECKPOINT_CHANGE#,CHECKPOINT_TIME,UNRECOVERABLE_CHANGE#,UNRECOVERABLE_TIME,LAST_CHANGE#,LAST_TIME, OFFLINE_CHANGE#, ONLINE_CHANGE#,status,name FROM v$datafile where file#=1;
FILE# CHECKPOINT_CHANGE# CHECKPOINT_TIME UNRECOVERABLE_CHANGE# UNRECOVERABLE_TIME LAST_CHANGE# LAST_TIME OFFLINE_CHANGE# ONLINE_CHANGE# STATUS NAME
----- ------------------ ------------------- --------------------- ------------------- ------------ ------------------- --------------- -------------- ---------- --------------------------------------------------
1 13276911099 2017-02-28 14:42:35 0 925701 925702 SYSTEM /mnt/ramdisk/book/system01.dbf
SYS@book> SELECT file#, CHECKPOINT_CHANGE#, CHECKPOINT_TIME,CREATION_CHANGE# , RESETLOGS_CHANGE#,status, CHECKPOINT_COUNT,fuzzy,name,tablespace_name FROM v$datafile_header where file#=1;
FILE# CHECKPOINT_CHANGE# CHECKPOINT_TIME CREATION_CHANGE# RESETLOGS_CHANGE# STATUS CHECKPOINT_COUNT FUZ NAME TABLESPACE_NAME
----- ------------------ ------------------- ---------------- ----------------- ---------- ---------------- --- -------------------------------------------------- ------------------------------
1 13276911099 2017-02-28 14:42:35 7 925702 ONLINE 839 YES /mnt/ramdisk/book/system01.dbf SYSTEM
--//我僅僅查詢file#=1,主要全部查詢篇幅太大,而查詢file#=1也能說明問題.
--//如果執行recover database using backup controlfile until change 13276911100;(根本不執行恢複).
--//如果open resetlogs會報錯,但是實際上基本沒有問題,後面要提到加參數_allow_resetlogs_corruption=true;先放一下看看備庫.
5.備庫情況:
--//前面我執行
--//看alert檔案:
alter database flashback on
Starting background process RVWR
Wed Mar 01 08:38:19 2017
RVWR started with pid=21, OS id=32023
Allocated 3981120 bytes in shared pool for flashback generation buffer
Flashback Database Enabled at SCN 13276911100
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Completed: alter database flashback on
--//注意看目前備庫的scn=13276911100,比主庫的scn大1.
--//說明:在沒打開flashback前我也做了恢複測試,内容如下:
--//啟動備庫到mount狀态,執行:(備庫要加standby參數)
SYS@bookdg> recover standby database until cancel;
ORA-00279: change 13276911100 generated at 02/28/2017 14:42:35 needed for thread 1
ORA-00280: change 13276911100 for thread 1 is in sequence #695
/mnt/ramdisk/book/redostb01.log
ORA-00353: log corruption near block 155 change 13276911100 time 02/28/2017 14:42:35
ORA-00334: archived log: '/mnt/ramdisk/book/redostb01.log'
--//注意看提示并沒有啟動恢複,僅僅說明在block 155 change 13276911100中斷.
SYS@bookdg> recover standby database until change 13276911099;
Media recovery complete.
--//從這裡說明僅僅能恢複到scn=13276911099.而你實際檢視視圖v$v$datafile_header;
SYS@bookdg> SELECT file#, CHECKPOINT_CHANGE#, CHECKPOINT_TIME,CREATION_CHANGE# , RESETLOGS_CHANGE#,status, CHECKPOINT_COUNT,fuzzy,name,tablespace_name FROM v$datafile_header where file#=1;
1 13276911100 2017-02-28 14:42:35 7 925702 ONLINE 835 NO /mnt/ramdisk/book/system01.dbf SYSTEM
--//實際上現在資料檔案記錄的scn是13276911100.
6.主備庫差異:
--//從這裡可以看出主備庫檔案scn相差1,備庫的scn大于主庫的scn.如果主庫使用參數_allow_resetlogs_corruption=true;必須使用open resetlogs打開,
--//因為redo檔案已經不存在.這樣會生成新的incarnation,而新的scn是目前主庫的scn+1開始.
--//視乎這個切換是從on disk rba scn+1開始.并不以資料檔案記錄的scn開始.
SELECT cpdrt ,
'0x'||to_char(cplrba_seq,'FMxxxxxxxx') || '.' || to_char(cplrba_bno,'FMxxxxxxxx')|| '.' || to_char(cplrba_bof,'FMxxxx') "low_rba16",
'0x'||to_char(cpodr_seq,'FMxxxxxxxx') || '.' || to_char(cpodr_bno,'FMxxxxxxxx') || '.' || to_char(cpodr_bof,'FMxxxx') "on_disk_rba16",
TO_DATE (CPODT, 'MM-DD-YYYY HH24:MI:SS') cpodt_on_disk_rba,
SYSDATE current_sysdate,
ROUND ( (SYSDATE - TO_DATE (CPODT, 'MM-DD-YYYY HH24:MI:SS')) * 86400,
2)
diff_date,
CPODS ,
CPHBT,
current_scn,
current_scn - cpods diff_scn,
indx
FROM x$kcccp, v$database
WHERE CPLRBA_SEQ <> 0;
檢查點隊列 on disk rba 檢查點隊列
髒塊數量 時間戳 目前時間 on disk rba scn 檢查點心跳
CPDRT low_rba16 on_disk_rba16 CPODT SYSDATE DIFF_DATE CPODS CPHBT CURRENT_SCN DIFF_SCN INDX
------------ -------------------- -------------------- ------------------- ------------------- ---------- ---------------- ------------ ------------ ------------ ------------
91 0x2b6.3.0 0x2b7.9a.0 2017-02-28 14:42:34 2017-03-01 10:42:31 71997.00 13276911099 937460161 0 -13276911099 0
--//而備庫的這個scn依舊屬于前面的incarnation,無法繼續應用日志(傳輸沒有問題).
--//要解決這個問題有可以修改備庫資料檔案的scn-1.再執行reset database to incarnation N;
--//注采用主庫scn+1的方式,不行.我測試多次,也許要修改on disk rba scn,也就是控制檔案的scn.不做這個測試.
7.open resetlogs打開主庫看看:
SYS@book> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
--//^_^,不行.不知道為什麼實際上已經一緻了不知道為什麼不能打開.
SYS@book> create pfile='/tmp/book.ora' from spfile;
File created.
--加入1行:
*._allow_resetlogs_corruption=true;
SYS@book> shutdown immediate;
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
--//使用pfile參數檔案啟動:
SYS@book> startup mount pfile='/tmp/book.ora'
Total System Global Area 634732544 bytes
Fixed Size 2255792 bytes
Variable Size 197133392 bytes
Database Buffers 427819008 bytes
Redo Buffers 7524352 bytes
--//關閉資料庫,在使用spfile參數啟動資料庫,略.
Database closed.
Database opened.
8.現在備庫是否接收日志并應用:
--//主庫執行:
SYS@book> alter system set log_archive_dest_state_2=defer scope=memory;
SYS@book> alter system set log_archive_dest_state_2=enable scope=memory;
--//備庫執行:
SYS@bookdg> alter database recover managed standby database using current logfile disconnect ;
--//檢查alert:
alter database recover managed standby database using current logfile disconnect
Attempt to start background Managed Standby Recovery process (bookdg)
Wed Mar 01 10:51:35 2017
MRP0 started with pid=22, OS id=349
MRP0: Background Managed Standby Recovery process started (bookdg)
Wed Mar 01 10:51:36 2017
Using STANDBY_ARCHIVE_DEST parameter default value as /u01/app/oracle/archivelog/book
Wed Mar 01 10:51:37 2017
Primary database is in MAXIMUM PERFORMANCE mode
RFS[1]: Assigned to RFS process 353
RFS[1]: Selected log 6 for thread 1 sequence 2 dbid 1337401710 branch 937478950
RFS[2]: Assigned to RFS process 355
RFS[2]: New Archival REDO Branch: 937478950 Current: 896605872
RFS[2]: Selected log 7 for thread 1 sequence 1 dbid 1337401710 branch 937478950
RFS[2]: Standby in the future of new recovery destinationBranch(resetlogs_id) 937478950
Incomplete Recovery SCN: 13276911100
Resetlogs SCN: 13276911100
Flashback database to SCN 13276911099 to follow new branch
RFS[2]: New Archival REDO Branch(resetlogs_id): 937478950 Prior: 896605872
RFS[2]: Archival Activation ID: 0x522677de Current: 0x4fb7d86e
RFS[2]: Effect of primary database OPEN RESETLOGS
RFS[2]: Managed Standby Recovery process is active
RFS[2]: Incarnation entry added for Branch(resetlogs_id): 937478950 (bookdg)
Wed Mar 01 10:51:38 2017
Setting recovery target incarnation to 3
Archived Log entry 3 added for thread 1 sequence 1 ID 0x522677de dest 1:
started logmerger process
Wed Mar 01 10:51:41 2017
Managed Standby Recovery starting Real Time Apply
Warning: Recovery target destination is in a sibling branch
of the controlfile checkpoint. Recovery will only recover
changes to datafiles.
Datafile 1 (ckpscn 13276911100) is orphaned on incarnation#=2
MRP0: Detected orphaned datafiles!
Recovery will possibly be retried after flashback...
Errors in file /u01/app/oracle/diag/rdbms/bookdg/bookdg/trace/bookdg_pr00_357.trc:
ORA-19909: datafile 1 belongs to an orphan incarnation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Managed Standby Recovery not using Real Time Apply
Recovery Slave PR00 previously exited with exception 19909
Completed: alter database recover managed standby database using current logfile disconnect
$ cat /u01/app/oracle/diag/rdbms/bookdg/bookdg/trace/bookdg_pr00_357.trc
....
*** 2017-03-01 10:51:41.698 4329 krsh.c
*** 2017-03-01 10:51:41.721 4329 krsh.c
RMAN> list incarnation ;
using target database control file instead of recovery catalog
List of Database Incarnations
DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time
------- ------- -------- ---------------- --- ---------- ----------
1 1 BOOK 1337401710 PARENT 1 2013-08-24 11:37:30
2 2 BOOK 1337401710 PARENT 925702 2015-11-24 09:11:12
3 3 BOOK 1337401710 CURRENT 13276911100 2017-03-01 10:49:10
--//可以看出reset scn=13276911100.而資料檔案scn=13276911100.
--//也就是必須将資料檔案的scn-1. 13276911100-1=13276911099.
8.使用bbed修改備庫的scn=13276911099.
SYS@bookdg> @ &r/tx 13276911099
select 13276911099,trunc(13276911099/power(2,32)) scn_wrap,mod(13276911099,power(2,32)) scn_base from dual
13276911099 SCN_WRAP SCN_BASE
------------ ------------ ------------
13276911099 3 392009211
--//關閉主資料庫:
$ cat a.cmd
set count 8192
set width 210
assign dba 1,1 kcvfhckp.kcvcpscn.kscnbas=392009211
sum dba 1,1 apply
assign dba 2,1 kcvfhckp.kcvcpscn.kscnbas=392009211
sum dba 2,1 apply
assign dba 3,1 kcvfhckp.kcvcpscn.kscnbas=392009211
sum dba 3,1 apply
assign dba 4,1 kcvfhckp.kcvcpscn.kscnbas=392009211
sum dba 4,1 apply
assign dba 5,1 kcvfhckp.kcvcpscn.kscnbas=392009211
sum dba 5,1 apply
assign dba 6,1 kcvfhckp.kcvcpscn.kscnbas=392009211
sum dba 6,1 apply
quit
$ cat bbed.par
blocksize=8192
listfile=$HOME/bbed/filelist.txt
mode=edit
PASSWORD=blockedit
--//filelist.txt内容有可以執行生成:
SYS@bookdg> select file#||' '||name c60 from v$dbfile order by file#;
C60
------------------------------------------------------------
1 /mnt/ramdisk/book/system01.dbf
2 /mnt/ramdisk/book/sysaux01.dbf
3 /mnt/ramdisk/book/undotbs01.dbf
4 /mnt/ramdisk/book/users01.dbf
5 /mnt/ramdisk/book/example01.dbf
6 /mnt/ramdisk/book/tea01.dbf
6 rows selected.
--//關于bbed的相關内容可以參看我以前的文章.
$ $ORACLE_HOME/bin/bbed parfile=bbed.par cmdfile=a.cmd
..
--//執行過程略.
SYS@book> startup mount
1 13276911099 2017-02-28 14:42:35 7 925702 ONLINE 835 NO /mnt/ramdisk/book/system01.dbf SYSTEM
--ok!!
--//現在看看備庫是否接收日志并應用:
SYS@bookdg> @ &r/dg/dg
PROCESS PID STATUS CLIENT_P GROUP# THREAD# SEQUENCE# BLOCK# BLOCKS DELAY_MINS
--------- ------- ------------ -------- ---------------- ---------- ---------- ---------- ----------
RFS 454 IDLE UNKNOWN N/A 0 0 0 0 0
RFS 456 IDLE LGWR 1 1 4 8 1 0
ARCH 428 CLOSING ARCH 6 1 3 1 117 0
MRP0 433 WAIT_FOR_LOG N/A N/A 1 4 0 0 0
--//MRP0已經應用過去,SEQ#=4.
RFS 461 IDLE ARCH N/A 0 0 0 0 0
RFS 456 IDLE LGWR 1 1 4 100 1 0
MRP0 433 APPLYING_LOG N/A N/A 1 4 100 102400 0
--//OK現在已經恢複完成.
SYS@book> select rowid,t.* from scott.t where rownum<=3;
ROWID ID NAME
------------------ ------------ ----------
AAAWD4AAEAAAAIjAAA 1 AAAAAAAAAA
AAAWD4AAEAAAAIjAAB 2 bbbbbbbbbb
AAAWD4AAEAAAAIjAAC 3 cccccccccc
--//結果也正确.
總結:
1.不推薦這樣的恢複方式,僅僅測試與學習.
2.首先确定備庫是那個接收日志的檔案.
3.推薦備庫打開flashback on(而不是在出問題時打開),這樣可以復原到特定的scn,注意一個細節,這個我也測試(不再貼出),另外注意閃
回區設定大一些,僅僅保留長時間的閃回日志. 另外注意一個細節
SYS@bookdg> flashback database to scn 13276911099;
Flashback complete.
--//看資料檔案記錄的scn是13276911100. 比閃回的scn多1.也就是前面的例子如果要到scn=13276911099,實際上執行的是:
flashback database to scn 13276911098;
--//oracle 真奇怪....例子:
SYS@bookdg> select * from v$flashback_database_log;
OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE
-------------------- ------------------- ---------------- -------------- ------------------------
13276911100 2017-03-01 10:59:27 1440 104857600 310886400
SYS@bookdg> alter database recover managed standby database cancel;
SYS@bookdg> flashback database to scn 13276911200;
SYS@bookdg> SELECT file#, CHECKPOINT_CHANGE#,CHECKPOINT_TIME,UNRECOVERABLE_CHANGE#,UNRECOVERABLE_TIME,LAST_CHANGE#,LAST_TIME, OFFLINE_CHANGE#, ONLINE_CHANGE#,status,name FROM v$datafile where file#=1;
FILE# CHECKPOINT_CHANGE# CHECKPOINT_TIME UNRECOVERABLE_CHANGE# UNRECOVERABLE_TIME LAST_CHANGE# LAST_TIME OFFLINE_CHANGE# ONLINE_CHANGE# STATUS NAME
----- ------------------ ------------------- --------------------- ------------------- ------------ ------------------- --------------- -------------- ------- --------------------------------------------------
1 13276911201 2017-03-01 10:49:12 0 0 0 SYSTEM /mnt/ramdisk/book/system01.dbf
SYS@bookdg> SELECT file#, CHECKPOINT_CHANGE#, CHECKPOINT_TIME,CREATION_CHANGE# , RESETLOGS_CHANGE#,status, CHECKPOINT_COUNT,fuzzy,name,tablespace_name FROM v$datafile_header;
FILE# CHECKPOINT_CHANGE# CHECKPOINT_TIME CREATION_CHANGE# RESETLOGS_CHANGE# STATUS CHECKPOINT_COUNT FUZ NAME TABLESPACE_NAME
----- ------------------ ------------------- ---------------- ----------------- ------- ---------------- --- -------------------------------------------------- ------------------------------
1 13276911201 2017-03-01 10:49:12 7 13276911100 ONLINE 835 NO /mnt/ramdisk/book/system01.dbf SYSTEM
--//flashback scn=13276911200,而控制檔案與資料檔案記錄的scn=13276911201.
4.檢查日志完成性,避免問題擴大:
alter system dump logfile '/mnt/ramdisk/book/redostb01.log' validate;
5.要在主庫應用日志,必須執行:
recover database using backup controlfile until change 13276911099;
--其他方式都是不行的.
recover database using backup controlfile until change cancel;
recover database until change 13276911099;
recover database using backup controlfile until change NNNN;
--NNN 大于提示ORA-00353: log corruption near block 155 change 13276911099 time 02/28/2017 14:42:35裡面提到scn,都不執行.
6.我的測試主庫一定要用_allow_resetlogs_corruption=true;打開:
7.備庫資料檔案的scn要-1:
--//使用bbed修改,可以參考前面的操作.
--//采用主庫scn+1的方式甚至+2的方式都不行,v$database_incarnation記錄的RESETLOGS_CHANGE#都是13276911100.
8.一定要認真看提示與alert以及轉儲檔案資訊,這是我測試最大的收獲.
9.我這些測試重複了N次,往往出現問題時情況N複雜.僅僅提供一些恢複思路.累,測試3天.