Oracle特殊恢复原理与实战_05 使用BBED跳过归档的恢复
使用BBED跳过归档的恢复
模拟场景:在做恢复时发现丢失部分归档
开启归档
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 44
Next log sequence to archive 46
Current log sequence 46
SQL> show parameter recovery
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /u01/app/oracle/fast_recovery_
area
db_recovery_file_dest_size big integer 10G
recovery_parallelism integer 0
|
创建表空间、用户、表并插入数据
create tablespace skip_arch datafile '/u01/app/oracle/oradata/orcl/skip_arch01.dbf' size 50m;
create user lyj identified by lyj default tablespace skip_arch;
grant dba to lyj;
conn lyj/lyj
create table t1 (id int,name varchar2(10));
insert into t1 values (1,'AAAAAA');
commit;
|
对6号文件做备份
conn / as sysdba
col FILE_NAME for a60
select FILE_ID,FILE_NAME from dba_data_files order by 1;
FILE_ID FILE_NAME
---------- ------------------------------------------------------------
1 /u01/app/oracle/oradata/orcl/system01.dbf
2 /u01/app/oracle/oradata/orcl/sysaux01.dbf
3 /u01/app/oracle/oradata/orcl/undotbs01.dbf
4 /u01/app/oracle/oradata/orcl/users01.dbf
5 /u01/app/oracle/oradata/orcl/dsi01.dbf
6 /u01/app/oracle/oradata/orcl/skip_arch01.dbf
rman target /
backup datafile 6 format '/oradata/rmanbackup/datafile5_%U';
|
切换归档日志
select sequence#,status from v$archived_log order by 1 desc;
SEQUENCE# S
---------- -
45 A
44 A
43 A
42 A
41 A
40 A
# 多次切换
alter system switch logfile;
/
select sequence#,status from v$archived_log order by 1 desc;
SEQUENCE# S
---------- -
51 A
50 A
49 A
48 A
47 A
46 A
# 查看归档文件
cd /u01/app/oracle/fast_recovery_area/ORCL/archivelog/2018_03_19
ll
total 56544
-rw-r----- 1 oracle oinstall 36331008 Mar 19 00:01 o1_mf_1_45_fbx39wby_.arc
-rw-r----- 1 oracle oinstall 21547008 Mar 19 15:05 o1_mf_1_46_fbyrbkbz_.arc
-rw-r----- 1 oracle oinstall 2048 Mar 19 15:05 o1_mf_1_47_fbyrbmnn_.arc
-rw-r----- 1 oracle oinstall 1536 Mar 19 15:05 o1_mf_1_48_fbyrbqww_.arc
-rw-r----- 1 oracle oinstall 1024 Mar 19 15:06 o1_mf_1_49_fbyrbs1o_.arc
-rw-r----- 1 oracle oinstall 1024 Mar 19 15:06 o1_mf_1_50_fbyrbt9w_.arc
-rw-r----- 1 oracle oinstall 1024 Mar 19 15:06 o1_mf_1_51_fbyrbv64_.arc
# 删除48、49号归档
rm o1_mf_1_48_fbyrbqww_.arc o1_mf_1_49_fbyrbs1o_.arc
ll
total 56536
-rw-r----- 1 oracle oinstall 36331008 Mar 19 00:01 o1_mf_1_45_fbx39wby_.arc
-rw-r----- 1 oracle oinstall 21547008 Mar 19 15:05 o1_mf_1_46_fbyrbkbz_.arc
-rw-r----- 1 oracle oinstall 2048 Mar 19 15:05 o1_mf_1_47_fbyrbmnn_.arc
-rw-r----- 1 oracle oinstall 1024 Mar 19 15:06 o1_mf_1_50_fbyrbt9w_.arc
-rw-r----- 1 oracle oinstall 1024 Mar 19 15:06 o1_mf_1_51_fbyrbv64_.arc
|
离线6号文件
select FILE#, CREATION_CHANGE#,CHECKPOINT_CHANGE#,UNRECOVERABLE_CHANGE#,LAST_CHANGE#,OFFLINE_CHANGE#,STATUS
from v$datafile order by 1;
FILE# CREATION_CHANGE# CHECKPOINT_CHANGE# UNRECOVERABLE_CHANGE# LAST_CHANGE# OFFLINE_CHANGE# STATUS
---------- ---------------- ------------------ --------------------- ------------ --------------- -------
1 7 3571679 0 2985399 SYSTEM
2 1834 3571679 0 2985399 ONLINE
3 923328 3571679 0 2985399 ONLINE
4 16143 3571679 0 2985399 ONLINE
5 2959979 3571679 0 2985399 ONLINE
6 3570623 3571679 0 0 ONLINE
SQL> alter database datafile 6 offline;
Database altered.
select FILE#, CREATION_CHANGE#,CHECKPOINT_CHANGE#,UNRECOVERABLE_CHANGE#,LAST_CHANGE#,OFFLINE_CHANGE#,STATUS
from v$datafile order by 1;
FILE# CREATION_CHANGE# CHECKPOINT_CHANGE# UNRECOVERABLE_CHANGE# LAST_CHANGE# OFFLINE_CHANGE# STATUS
---------- ---------------- ------------------ --------------------- ------------ --------------- -------
1 7 3571679 0 2985399 SYSTEM
2 1834 3571679 0 2985399 ONLINE
3 923328 3571679 0 2985399 ONLINE
4 16143 3571679 0 2985399 ONLINE
5 2959979 3571679 0 2985399 ONLINE
6 3570623 3571679 0 3572789 0 RECOVER
|
archivelog模式下,当数据文件offline时,其对应的数据文件头stop scn会更新,同时controlfile中该datafile的stop scn信息也会更新,此时也会更新offline scn,并且offline scn等于stop scn。
对6号文件进行还原
rman target /
RMAN> restore datafile 6;
Starting restore at 2018-03-19 15:49:54
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00006 to /u01/app/oracle/oradata/orcl/skip_arch01.dbf
channel ORA_DISK_1: reading from backup piece /oradata/rmanbackup/datafile5_05su6blm_1_1
channel ORA_DISK_1: piece handle=/oradata/rmanbackup/datafile5_05su6blm_1_1 tag=TAG20180319T145901
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:03
Finished restore at 2018-03-19 15:49:57
|
6号数据文件无法被online
SQL> alter database datafile 6 online;
alter database datafile 6 online
*
ERROR at line 1:
ORA-01113: file 6 needs media recovery
ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/skip_arch01.dbf'
|
对6号文件进行恢复时因归档丢失报错
RMAN> recover datafile 6;
Starting recover at 2018-03-19 15:53:03
using channel ORA_DISK_1
starting media recovery
archived log for thread 1 with sequence 46 is already on disk as file /u01/app/oracle/fast_recovery_area/ORCL/archivelog/2018_03_19/o1_mf_1_46_fbyrbkbz_.arc
archived log for thread 1 with sequence 47 is already on disk as file /u01/app/oracle/fast_recovery_area/ORCL/archivelog/2018_03_19/o1_mf_1_47_fbyrbmnn_.arc
archived log for thread 1 with sequence 50 is already on disk as file /u01/app/oracle/fast_recovery_area/ORCL/archivelog/2018_03_19/o1_mf_1_50_fbyrbt9w_.arc
archived log for thread 1 with sequence 51 is already on disk as file /u01/app/oracle/fast_recovery_area/ORCL/archivelog/2018_03_19/o1_mf_1_51_fbyrbv64_.arc
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 03/19/2018 15:53:03
RMAN-06053: unable to perform media recovery because of missing log
RMAN-06025: no backup of archived log for thread 1 with sequence 49 and starting SCN of 3571670 found to restore
RMAN-06025: no backup of archived log for thread 1 with sequence 48 and starting SCN of 3571667 found to restore
|
跳归档恢复
# 归档序列48、49已丢失,从50开始恢复
select to_char(SEQUENCE#,'xxxxxxxxxxx') seq,
to_char(FIRST_CHANGE#,'xxxxxxxxxxx') scn
from v$archived_log where SEQUENCE#=50;
SEQ SCN
------------ ------------
32 367fd9 # d97f3600
# 把上面的值更新到6号文件头
BBED> info
File# Name Size(blks)
----- ---- ----------
1 /u01/app/oracle/oradata/orcl/system01.dbf 97281
2 /u01/app/oracle/oradata/orcl/sysaux01.dbf 96001
3 /u01/app/oracle/oradata/orcl/undotbs01.dbf 21121
4 /u01/app/oracle/oradata/orcl/users01.dbf 641
5 /u01/app/oracle/oradata/orcl/dsi01.dbf 64001
6 /u01/app/oracle/oradata/orcl/skip_arch01.dbf 6400
BBED> set file 6 block 1
FILE# 6
BLOCK# 1
BBED> map /v
File: /u01/app/oracle/oradata/orcl/skip_arch01.dbf (6)
Block: 1 Dba:0x01800001
------------------------------------------------------------
Data File Header
struct kcvfh, 860 bytes @0
struct kcvfhbfh, 20 bytes @0
struct kcvfhhdr, 76 bytes @20
ub4 kcvfhrdb @96
struct kcvfhcrs, 8 bytes @100
ub4 kcvfhcrt @108
ub4 kcvfhrlc @112
struct kcvfhrls, 8 bytes @116
ub4 kcvfhbti @124
struct kcvfhbsc, 8 bytes @128
ub2 kcvfhbth @136
ub2 kcvfhsta @138
struct kcvfhckp, 36 bytes @484 ##
BBED> p kcvfhckp
struct kcvfhckp, 36 bytes @484
struct kcvcpscn, 8 bytes @484 ## SCN
ub4 kscnbas @484 0x00367eb2
ub2 kscnwrp @488 0x0000
ub4 kcvcptim @492 0x39e32eb6
ub2 kcvcpthr @496 0x0001
union u, 12 bytes @500
struct kcvcprba, 12 bytes @500
ub4 kcrbaseq @500 0x0000002e ## SEQ
ub4 kcrbabno @504 0x00009623
ub2 kcrbabof @508 0x0010
ub1 kcvcpetb[0] @512 0x02
ub1 kcvcpetb[1] @513 0x00
ub1 kcvcpetb[2] @514 0x00
ub1 kcvcpetb[3] @515 0x00
ub1 kcvcpetb[4] @516 0x00
ub1 kcvcpetb[5] @517 0x00
ub1 kcvcpetb[6] @518 0x00
ub1 kcvcpetb[7] @519 0x00
# 修改SCN
BBED> dump /v offset 484 count 32
File: /u01/app/oracle/oradata/orcl/skip_arch01.dbf (6)
Block: 1 Offsets: 484 to 515 Dba:0x01800001
-------------------------------------------------------
b27e3600 00000000 b62ee339 01000000 l .~6........9....
2e000000 23960000 1000774a 02000000 l ....#.....wJ....
<16 bytes per line>
BBED> modify /x d9 offset 484
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
File: /u01/app/oracle/oradata/orcl/skip_arch01.dbf (6)
Block: 1 Offsets: 484 to 515 Dba:0x01800001
------------------------------------------------------------------------
d97e3600 00000000 b62ee339 01000000 2e000000 23960000 1000774a 02000000
<32 bytes per line>
BBED> modify /x 7f3600 offset 485
File: /u01/app/oracle/oradata/orcl/skip_arch01.dbf (6)
Block: 1 Offsets: 485 to 516 Dba:0x01800001
------------------------------------------------------------------------
7f360000 000000b6 2ee33901 0000002e 00000023 96000010 00774a02 00000000
<32 bytes per line>
BBED> sum apply
Check value for File 6, Block 1:
current = 0xc392, required = 0xc392
# 修改SEQ
|
