SQL> create tablespace block_rec;
表空间已创建。
SQL> select name from v$datafile;
NAME
-------------------------------------------------------------------------------
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\SYSTEM01.DBF
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\UNDOTBS01.DBF
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\SYSAUX01.DBF
G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\USERS01.DBF
G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_OMF_TEST_326SNC34_.DBF
+DG1/ora10g/datafiles/asmtbs01.dbf
G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_BLOCK_RE_32MMQWTH_.DBF
已选择7行。
SQL> select file#,name from v$datafile;
FILE# NAME
-------------------------------------------------------------------------------
1 G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\SYSTEM01.DBF
2 G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\UNDOTBS01.DBF
3 G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\SYSAUX01.DBF
4 G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\USERS01.DBF
5 G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_OMF_TEST_326SNC34_.DBF
6 +DG1/ora10g/datafiles/asmtbs01.dbf
7 G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_BLOCK_RE_32MMQWTH_.DBF
已选择7行。
SQL> alter database datafile 7 resize 1m;
数据库已更改。
SQL> create user block_rec identified by "block_rec"
2 temporary tablespace temp
3 default tablespace block_rec
4 quota unlimited on block_rec;
用户已创建。
SQL> grant resource,connect to block_rec;
授权成功。
SQL> conn block_rec/block_rec@ora10g;
已连接。
SQL> create table t(a number);
表已创建。
SQL> begin
2 for x in 1..1000 loop
3 insert into t values(x);
4 commit;
5 end loop;
6 end;
7 /
PL/SQL 过程已成功完成。
SQL> select count(*) from t;
COUNT(*)
----------
1000
备份当前数据库:
C:\Documents and Settings\linyuefeng>rman target / nocatalog
恢复管理器: Release 10.2.0.1.0 - Production on 星期六 4月 21 16:54:29 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到目标数据库: ORA10G (DBID=3937140947)
使用目标数据库控制文件替代恢复目录
RMAN> backup as backupset database plus archivelog tag='fulldatabase';
启动 backup 于 21-4月 -07
当前日志已存档
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=85 devtype=DISK
通道 ORA_DISK_1: 正在启动存档日志备份集
通道 ORA_DISK_1: 正在指定备份集中的存档日志
输入存档日志线程 =1 序列 =1 记录 ID=6 时间戳=620258970
输入存档日志线程 =1 序列 =2 记录 ID=7 时间戳=620424206
输入存档日志线程 =1 序列 =3 记录 ID=8 时间戳=620486944
输入存档日志线程 =1 序列 =4 记录 ID=9 时间戳=620497466
输入存档日志线程 =1 序列 =5 记录 ID=10 时间戳=620497621
输入存档日志线程 =1 序列 =6 记录 ID=11 时间戳=620497719
输入存档日志线程 =1 序列 =7 记录 ID=12 时间戳=620499360
通道 ORA_DISK_1: 正在启动段 1 于 21-4月 -07
通道 ORA_DISK_1: 已完成段 1 于 21-4月 -07
段句柄=G:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\07IFO4D2_1_1 标记=FULLDATABASE 注
释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:09
通道 ORA_DISK_1: 正在启动存档日志备份集
通道 ORA_DISK_1: 正在指定备份集中的存档日志
输入存档日志线程 =1 序列 =10 记录 ID=1 时间戳=620168764
输入存档日志线程 =1 序列 =11 记录 ID=2 时间戳=620170149
输入存档日志线程 =1 序列 =12 记录 ID=3 时间戳=620172357
输入存档日志线程 =1 序列 =13 记录 ID=4 时间戳=620174799
输入存档日志线程 =1 序列 =14 记录 ID=5 时间戳=620175861
通道 ORA_DISK_1: 正在启动段 1 于 21-4月 -07
通道 ORA_DISK_1: 已完成段 1 于 21-4月 -07
段句柄=G:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\08IFO4DB_1_1 标记=FULLDATABASE 注
释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:08
完成 backup 于 21-4月 -07
启动 backup 于 21-4月 -07
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00001 name=G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\SYSTEM01.DBF
输入数据文件 fno=00003 name=G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\SYSAUX01.DBF
输入数据文件 fno=00005 name=G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_OMF_TEST_326
SNC34_.DBF
输入数据文件 fno=00006 name=+DG1/ora10g/datafiles/asmtbs01.dbf
输入数据文件 fno=00002 name=G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\UNDOTBS01.DB
F
输入数据文件 fno=00004 name=G:\ORACLE\PRODUCT\10.2.0\ORADATA\ORA10G\USERS01.DBF
输入数据文件 fno=00007 name=G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_BLOCK_RE_32M
MQWTH_.DBF
通道 ORA_DISK_1: 正在启动段 1 于 21-4月 -07
通道 ORA_DISK_1: 已完成段 1 于 21-4月 -07
段句柄=G:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\09IFO4DL_1_1 标记=TAG20070421T1656
20 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:01:16
完成 backup 于 21-4月 -07
启动 backup 于 21-4月 -07
当前日志已存档
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动存档日志备份集
通道 ORA_DISK_1: 正在指定备份集中的存档日志
输入存档日志线程 =1 序列 =8 记录 ID=13 时间戳=620499458
通道 ORA_DISK_1: 正在启动段 1 于 21-4月 -07
通道 ORA_DISK_1: 已完成段 1 于 21-4月 -07
段句柄=G:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\0AIFO4G2_1_1 标记=FULLDATABASE 注
释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:03
完成 backup 于 21-4月 -07
启动 Control File and SPFILE Autobackup 于 21-4月 -07
段 handle=G:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\C-3937140947-20070421-02 commen
t=NONE
完成 Control File and SPFILE Autobackup 于 21-4月 -07
SQL> insert into t select * from t;
已创建1000行。
SQL> insert into t select * from t;
已创建2000行。
SQL> insert into t select * from t;
已创建4000行。
SQL> commit;
提交完成。
使用EDIT编辑数据文件
G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_BLOCK_RE_32MMQWTH_.DBF,然后保存。
SQL> alter system flush buffer_cache;
SQL> conn block_rec/block_rec@ora10g;
已连接。
SQL> select count(*) from t;
select count(*) from t
*
第 1 行出现错误:
ORA-01578: ORACLE 数据块损坏 (文件号 7, 块号 15)
ORA-01110: 数据文件 7:
'G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_BLOCK_RE_32MMQWTH_.DBF'
在ALERT.LOG文件中也会记载:
Corrupt block relative dba: 0x01c0000f (file 7, block 15)
Bad check value found during buffer read
Data in bad block:
type: 6 format: 2 rdba: 0x01c0000f
last change scn: 0x0000.000e92e9 seq: 0x3 flg: 0x04
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x92e90603
check value in block header: 0xcf7e
computed block checksum: 0x74c8
Reread of rdba: 0x01c0000f (file 7, block 15) found same corrupted data
Sat Apr 21 17:16:32 2007
Corrupt Block Found
TSN = 9, TSNAME = BLOCK_REC
RFN = 7, BLK = 15, RDBA = 29360143
OBJN = 51507, OBJD = 51507, OBJECT = T, SUBOBJECT =
SEGMENT OWNER = BLOCK_REC, SEGMENT TYPE = Table Segment
可以用DBV进行检查:
C:\Documents and Settings\linyuefeng>dbv file=G:\oracle\oradata\ORA10G\DATAFILE\
O1_MF_BLOCK_RE_32MMQWTH_.DBF blocksize=8192
DBVERIFY: Release 10.2.0.1.0 - Production on 星期六 4月 21 17:23:44 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
DBVERIFY - 开始验证: FILE = G:\oracle\oradata\ORA10G\DATAFILE\O1_MF_BLOCK_RE_32M
MQWTH_.DBF
页 12 标记为损坏
Corrupt block relative dba: 0x01c0000c (file 7, block 12)
Bad check value found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x01c0000c
last change scn: 0x0000.000e9956 seq: 0x1 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x99560601
check value in block header: 0x90b7
computed block checksum: 0x56ad
页 15 标记为损坏
Corrupt block relative dba: 0x01c0000f (file 7, block 15)
Bad check value found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x01c0000f
last change scn: 0x0000.000e92e9 seq: 0x3 flg: 0x04
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x92e90603
check value in block header: 0xcf7e
computed block checksum: 0xaeec
DBVERIFY - 验证完成
检查的页总数: 128
处理的页总数 (数据): 11
失败的页总数 (数据): 0
处理的页总数 (索引): 0
失败的页总数 (索引): 0
处理的页总数 (其它): 11
处理的总页数 (段) : 0
失败的总页数 (段) : 0
空的页总数: 104
标记为损坏的总页数: 2
流入的页总数: 0
最高块 SCN : 956758 (0.956758)
也可以使用RMAN进行检查,然后相关的坏块记录会记录到v$database_block_corruption中:
SQL> select * from v$database_block_corruption where file#=7;
未选定
RMAN> backup validate datafile 7;
启动 backup 于 21-4月 -07
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00007 name=G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_BLOCK_RE_32M
MQWTH_.DBF
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:03
完成 backup 于 21-4月 -07
SQL> select * from v$database_block_corruption where file#=7;
FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO
----- ---------- ---------- ------------------ ---------
7 12 1 0 CHECKSUM
7 15 1 0 CHECKSUM
进行恢复:
RMAN> blockrecover datafile 7 block 12,15;
启动 blockrecover 于 21-4月 -07
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在恢复块
通道 ORA_DISK_1: 正在指定要从备份集恢复的块
正在恢复数据文件 00007 的块
通道 ORA_DISK_1: 正在读取备份段 G:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\09IFO4DL_
1_1
通道 ORA_DISK_1: 已从备份段 1 恢复块
段句柄 = G:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\09IFO4DL_1_1 标记 = TAG20070421T
165620
通道 ORA_DISK_1: 块恢复完成, 用时: 00:00:02
正在开始介质的恢复
介质恢复完成, 用时: 00:00:03
完成 blockrecover 于 21-4月 -07
查看数据:
SQL> select count(*) from t;
COUNT(*)
----------
8000
SQL> select * from v$database_block_corruption where file#=7;
FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO
----- ---------- ---------- ------------------ ---------
7 12 1 0 CHECKSUM
7 15 1 0 CHECKSUM
RMAN> backup validate datafile 7;
启动 backup 于 21-4月 -07
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00007 name=G:\ORACLE\ORADATA\ORA10G\DATAFILE\O1_MF_BLOCK_RE_32M
MQWTH_.DBF
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 21-4月 -07
SQL> select * from v$database_block_corruption where file#=7;
未选定行
SQL> drop user block_rec cascade;
用户已删除。
SQL> drop tablespace block_rec including contents and datafiles;
表空间已删除。
最好再进行一次全备份。