在recover datafile的过程当中如果丢失了需要的归档将使得recover无法进行,使用bbed工具可以跳过丢失的归档进行recover datafile。
实验过程如下:
SYS@ORCL>select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
SYS@ORCL>create tablespace bbed_test_tbs
2 datafile '/u01/app/oracle/oradata/ORCL/bbed_test_tbs01.dbf' size 20M;
Tablespace created.
SYS@ORCL>create table bbed_test1 tablespace bbed_test_tbs as select * from dba_objects;
Table created.
SYS@ORCL>create table bbed_test2 tablespace bbed_test_tbs as select * from dba_objects;
Table created.
SYS@ORCL>archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 2
Next log sequence to archive 4
Current log sequence 4
SYS@ORCL>select file#||' '||name||' '||bytes from v$datafile;
FILE#||''||NAME||''||BYTES
--------------------------------------------------------------------------------
1 /u01/app/oracle/oradata/ORCL/system01.dbf 503316480
2 /u01/app/oracle/oradata/ORCL/undotbs01.dbf 36700160
3 /u01/app/oracle/oradata/ORCL/sysaux01.dbf 262144000
4 /u01/app/oracle/oradata/ORCL/users01.dbf 5242880
5 /u01/app/oracle/oradata/ORCL/example01.dbf 104857600
6 /u01/app/oracle/oradata/ORCL/bbed_test_tbs01.dbf 20971520
6 rows selected.
使用rman备份datafile 6
[oracle@jp bbed]$ rman target /
Recovery Manager: Release 10.2.0.1.0 - Production on Thu Jun 19 21:33:16 2014
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database: ORCL (DBID=1356549586)
RMAN> backup datafile 6;
Starting backup at 19-JUN-14
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=143 devtype=DISK
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00006 name=/u01/app/oracle/oradata/ORCL/bbed_test_tbs01.dbf
channel ORA_DISK_1: starting piece 1 at 19-JUN-14
channel ORA_DISK_1: finished piece 1 at 19-JUN-14
piece handle=/u01/app/oracle/flash_recovery_area/ORCL/backupset/2014_06_19/o1_mf_nnndf_TAG20140619T213426_9t73x2s8_.bkp tag=TAG20140619T213426 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
Finished backup at 19-JUN-14
然后在库里修改datafile 6中存储的数据
SYS@ORCL>delete from bbed_test1;
50316 rows deleted.
SYS@ORCL>commit;
Commit complete.
SYS@ORCL>alter system switch logfile;
System altered.
SYS@ORCL>alter system switch logfile;
System altered.
SYS@ORCL>alter system switch logfile;
System altered.
然后关闭数据库删除datafile 6
SYS@ORCL>shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
[oracle@jp ORCL]$ ls
bbed_test_tbs01.dbf control03.ctl redo02.log system01.dbf users01.dbf
control01.ctl example01.dbf redo03.log temp01.dbf
control02.ctl redo01.log sysaux01.dbf undotbs01.dbf
[oracle@jp ORCL]$ mv bbed_test_tbs01.dbf bbed_test_tbs01.dbf.bak
启动数据库:
SYS@ORCL>startup
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 83887696 bytes
Database Buffers 197132288 bytes
Redo Buffers 2973696 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
ORA-01110: data file 6: '/u01/app/oracle/oradata/ORCL/bbed_test_tbs01.dbf'
数据库无法启动因为此时datafile 6丢失,使用rman的备份恢复数据文件,尝试打开数据库
RMAN> restore datafile 6;
Starting restore at 19-JUN-14
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=155 devtype=DISK
channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00006 to /u01/app/oracle/oradata/ORCL/bbed_test_tbs01.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/oracle/flash_recovery_area/ORCL/backupset/2014_06_19/o1_mf_nnndf_TAG20140619T213426_9t73x2s8_.bkp
channel ORA_DISK_1: restored backup piece 1
piece handle=/u01/app/oracle/flash_recovery_area/ORCL/backupset/2014_06_19/o1_mf_nnndf_TAG20140619T213426_9t73x2s8_.bkp tag=TAG20140619T213426
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 19-JUN-14
SYS@ORCL>alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 6 needs media recovery
ORA-01110: data file 6: '/u01/app/oracle/oradata/ORCL/bbed_test_tbs01.dbf'
此时报datafile 6需要进行recover。
这时我们删除归档,然后尝试recover datafile 6
[oracle@jp archivelog]$ cd 2014_06_19/
[oracle@jp 2014_06_19]$ ls
o1_mf_1_3_9t73hdco_.arc o1_mf_1_5_9t740dxd_.arc
o1_mf_1_4_9t74035o_.arc o1_mf_1_6_9t740sv7_.arc
[oracle@jp 2014_06_19]$ rm -f *
[oracle@jp 2014_06_19]$ ls
SYS@ORCL>recover datafile 6;
ORA-00279: change 507768 generated at 06/19/2014 21:34:26 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2014_06_19/o1_mf_1_4_%u_.arc
ORA-00280: change 507768 for thread 1 is in sequence #4
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00308: cannot open archived log
'/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2014_06_19/o1_mf_1_4_9t7403
5o_.arc'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
无法恢复,提示需要的归档文件不存在
Dump出文件头:
SYS@ORCL>alter session set events 'immediate trace name file_hdrs level 10';
Session altered.
SYS@ORCL>SYS@ORCL>oradebug setmypid;
Statement processed.
SYS@ORCL>oradebug tracefile_name
/u01/app/oracle/admin/ORCL/udump/orcl_ora_9065.trc
查看dump文件:
DATA FILE #1:
(name #7) /u01/app/oracle/oradata/ORCL/system01.dbf
creation size=0 block size=8192 status=0xe head=7 tail=7 dup=1
tablespace 0, index=1 krfil=1 prev_file=0
unrecoverable scn: 0x0000.00000000 01/01/1988 00:00:00
Checkpoint cnt:56 scn: 0x0000.0007c39c 06/19/2014 21:37:19
Stop scn: 0x0000.0007c39c 06/19/2014 21:37:19
Creation Checkpointed at scn: 0x0000.00000009 06/30/2005 19:10:11
thread:0 rba:(0x0.0.0)
这时system数据文件的,然后我们使用bbed将datafile 6的scn和system数据文件的scn改为一致。
BBED> set dba 6,1
DBA 0x01800001 (25165825 6,1)
BBED> map
File: /u01/app/oracle/oradata/ORCL/bbed_test_tbs01.dbf (6)
Block: 1 Dba:0x01800001
------------------------------------------------------------
Data File Header
struct kcvfh, 676 bytes @0
ub4 tailchk @8188
BBED> p kcvfhckp
struct kcvfhckp, 36 bytes @484
struct kcvcpscn, 8 bytes @484
ub4 kscnbas @484 0x0007bf78
ub2 kscnwrp @488 0x0000
ub4 kcvcptim @492 0x32b46ee2
ub2 kcvcpthr @496 0x0001
union u, 12 bytes @500
struct kcvcprba, 12 bytes @500
ub4 kcrbaseq @500 0x00000004
ub4 kcrbabno @504 0x0000a54a
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
BBED> m /v 9cc3 offset 484
BBED-00201: invalid switch (/v)
BBED> m /x 9cc3 offset 484
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) Y
File: /u01/app/oracle/oradata/ORCL/bbed_test_tbs01.dbf (6)
Block: 1 Offsets: 484 to 995 Dba:0x01800001
------------------------------------------------------------------------
9cc30700 0000e7b7 e26eb432 0100f50d 04000000 4aa50000 10000000 02000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
0a000a00 0a000100 00000000 00000000 00000000 02008001 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
<32 bytes per line>
BBED> sum apply
Check value for File 6, Block 1:
current = 0x862e, required = 0x862e
然后回到数据库recover datafile 6,尝试打开数据库。
SYS@ORCL>recover datafile 6;
Media recovery complete.
SYS@ORCL>alter database open;
Database altered.