使用rman恢复坏块
环境:
oracle oracle 10g 10.2.0.5
os linux 5.8
1)创建一个表空间,
SQL> create tablespace test datafile '/oradata/ORCL/datafile/test.dbf' size 20m;
Tablespace created.
SQL> col file_name for a20
SQL> select file_id,file_name,tablespace_name from dba_data_files;
FILE_ID FILE_NAME TABLESPACE_NAME
---------- -------------------- ------------------------------
1 /oradata/ORCL/datafi SYSTEM
le/o1_mf_system_cc22
vck6_.dbf
2 /oradata/ORCL/datafi UNDOTBS1
le/o1_mf_undotbs1_cc
22vcor_.dbf
3 /oradata/ORCL/datafi SYSAUX
le/o1_mf_sysaux_cc22
vck9_.dbf
4 /oradata/ORCL/datafi USERS
le/o1_mf_users_cc22v
cox_.dbf
5 /oradata/ORCL/datafi DS
le/ds.dbf
6 /oradata/ORCL/datafi TEST
le/test.dbf
2)创建一个表,插入数据
SQL> create table tt1 tablespace test as select * from dba_objects;
Table created.
SQL> insert into tt1 select * from tt1;
insert into tt1 select * from tt1
*
ERROR at line 1:
ORA-01653: unable to extend table SYS.TT1 by 128 in tablespace TEST
3)备份datafile 6
RMAN> report schema;
Report of database schema
List of Permanent Datafiles
===========================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1 490 SYSTEM *** /oradata/ORCL/datafile/o1_mf_system_cc22vck6_.dbf
2 30 UNDOTBS1 *** /oradata/ORCL/datafile/o1_mf_undotbs1_cc22vcor_.dbf
3 260 SYSAUX *** /oradata/ORCL/datafile/o1_mf_sysaux_cc22vck9_.dbf
4 5 USERS *** /oradata/ORCL/datafile/o1_mf_users_cc22vcox_.dbf
5 30 DS *** /oradata/ORCL/datafile/ds.dbf
6 20 TEST *** /oradata/ORCL/datafile/test.dbf
List of Temporary Files
=======================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1 20 TEMP 32767 /oradata/ORCL/datafile/o1_mf_temp_cc22x63b_.tmp
RMAN> backup datafile 6 format '/oradata/test_%U';
Starting backup at 02-MAR-16
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00006 name=/oradata/ORCL/datafile/test.dbf
channel ORA_DISK_1: starting piece 1 at 02-MAR-16
channel ORA_DISK_1: finished piece 1 at 02-MAR-16
piece handle=/oradata/test_03qvecp6_1_1 tag=TAG20160302T020214 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:03
Finished backup at 02-MAR-16
RMAN> list backup of database;
List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
1 Full 551.39M DISK 00:00:36 02-MAR-16
BP Key: 1 Status: AVAILABLE Compressed: NO Tag: TAG20160302T011126
Piece Name: /oradata/full_data_01qve9pu_1_1
List of Datafiles in backup set 1
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- --------- ----
1 Full 555332 02-MAR-16 /oradata/ORCL/datafile/o1_mf_system_cc22vck6_.dbf
2 Full 555332 02-MAR-16 /oradata/ORCL/datafile/o1_mf_undotbs1_cc22vcor_.dbf
3 Full 555332 02-MAR-16 /oradata/ORCL/datafile/o1_mf_sysaux_cc22vck9_.dbf
4 Full 555332 02-MAR-16 /oradata/ORCL/datafile/o1_mf_users_cc22vcox_.dbf
5 Full 555332 02-MAR-16 /oradata/ORCL/datafile/ds.dbf
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
3 Full 19.09M DISK 00:00:01 02-MAR-16
BP Key: 3 Status: AVAILABLE Compressed: NO Tag: TAG20160302T020214
Piece Name: /oradata/test_03qvecp6_1_1
List of Datafiles in backup set 3
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- --------- ----
6 Full 558602 02-MAR-16 /oradata/ORCL/datafile/test.dbf
4)可以用 bbed等软件模拟破坏文件(不好模拟啊) 这里使用dd命令
[oracle@test oradata]$ dd of=/oradata/test.dbf bs=8192 conv=notrunc seek=133<<EOF
> Corrupted block!
> EOF
0+1 records in
0+1 records out
17 bytes (17 B) copied, 2.4e-05 seconds, 708 kB/s
[oracle@test oradata]$
5)dbv检测
[oracle@test bin]$ ./dbv file=/oradata/test.dbf blocksize=8192
DBVERIFY: Release 10.2.0.5.0 - Production on Wed Mar 2 03:56:09 2016
Copyright (c) 1982, 2007, Oracle. All rights reserved.
DBVERIFY - Verification starting : FILE = /oradata/test.dbf
Page 133 is marked corrupt
Corrupt block relative dba: 0x01800085 (file 6, block 133)
Bad header found during dbv:
Data in bad block:
type: 67 format: 7 rdba: 0x65747075
last change scn: 0x636f.6c622064 seq: 0x6b flg: 0x21
spare1: 0x72 spare2: 0x72 spare3: 0x0
consistency value in tail: 0x92d20601
check value in block header: 0xb0a
block checksum disabled
DBVERIFY - Verification complete
Total Pages Examined : 1280
Total Pages Processed (Data) : 1125
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing (Index): 0
Total Pages Processed (Other): 34
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 120
Total Pages Marked Corrupt : 1
Total Pages Influx : 0
Highest block SCN : 561906 (0.561906)
6)查询表
SQL> alter system flush buffer_cache;
System altered.
SQL> select count(*) from tt1;
ORA-01578: ORACLE data block corrupted (file # 6, block # 133)
ORA-01110: data file 6: '/oradata/test.dbf'
7)rman 恢复(前提得有备份)
RMAN> blockrecover datafile 6 block 133 ;
Starting blockrecover at 02-MAR-16
using channel ORA_DISK_1
channel ORA_DISK_1: restoring block(s)
channel ORA_DISK_1: specifying block(s) to restore from backup set
restoring blocks of datafile 00006
channel ORA_DISK_1: reading from backup piece /oradata/test_06qvejau_1_1
channel ORA_DISK_1: restored block(s) from backup piece 1
piece handle=/oradata/test_06qvejau_1_1 tag=TAG20160302T035406
channel ORA_DISK_1: block restore complete, elapsed time: 00:00:01
starting media recovery
media recovery complete, elapsed time: 00:00:01
Finished blockrecover at 02-MAR-16
8)查看恢复成功
SQL> select count(*) from tt1;
COUNT(*)
----------
50053