如果数据库库文件有备份 ,并且是可用的备份,oracle可以通过备份修复坏块。
0.修复过程是在线操作,不需要文件offline
1.修复是针对块级别,修复时间很短
2.修复命令使用blockrecover
4.可以同时修复多个文件的多个坏块
SQL> create tablespace userdata datafile 'E:\ORACLE\ORADATA\DB01\userdata01.dbf' size 1m;
表空间已创建。
SQL> conn buffer/oracle
已连接。
SQL> create table t as select * from DBA_tables;
表已创建。
SQL> host rman target /
恢复管理器: Release 10.2.0.1.0 - Production on 星期日 3月 23 13:01:22 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到目标数据库: DB01 (DBID=1281151392)
重要的是在这里要有备份
RMAN> backup datafile 6;
启动 backup 于 23-3月 -08
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=149 devtype=DISK
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00006 name=E:\ORACLE\ORADATA\DB01\USERDATA01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 23-3月 -08
通道 ORA_DISK_1: 已完成段 1 于 23-3月 -08
段句柄=E:\ORACLE\FLASH_RECOVERY_AREA\DB01\BACKUPSET\2008_03_23\O1_MF_NNNDF_TAG20080323T130137_3YCS1L2G_.BKP 标记=TAG2008
0323T130137 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 23-3月 -08
RMAN> exit
恢复管理器完成。
SQL> show user
USER 为 "BUFFER"
SQL> insert into t select * from t;
已创建1579行。
SQL> /
insert into t select * from t
*
第 1 行出现错误:
ORA-01653: 表 BUFFER.T 无法通过 8 (在表空间 USERDATA 中) 扩展
SQL> commit;
提交完成。
SQL> select count(*) from t;
COUNT(*)
----------
3158
SQL> alter system checkpoint;
系统已更改。
SQL> conn / as sysdba
已连接。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
使用ultra edit工具破坏6号文件
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 222301060 bytes
Database Buffers 381681664 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
数据库已经打开。
SQL> select count(*) from buffer.t;
select count(*) from buffer.t
*
第 1 行出现错误:
ORA-01578: ORACLE 数据块损坏 (文件号 6, 块号 23)
ORA-01110: 数据文件 6: 'E:\ORACLE\ORADATA\DB01\USERDATA01.DBF'
oracle数据库RMAN工具在做备份的时候会检查坏块,如果发现的话 ,会记录到下面的视图中
SQL> desc v$database_block_corruption
名称 是否为空? 类型
----------------------------------------------------------------- -------- --------------------------------------------
FILE# NUMBER
BLOCK# NUMBER
BLOCKS NUMBER
CORRUPTION_CHANGE# NUMBER
CORRUPTION_TYPE VARCHAR2(9)
SQL> select * from v$database_block_corruption;
未选定行
SQL> host rman target /
恢复管理器: Release 10.2.0.1.0 - Production on 星期日 3月 23 13:05:32 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到目标数据库: DB01 (DBID=1281151392)
通过下面这条命令,并不是做一个备份 ,只是对文件做一次校验,当然也可以发现坏块
RMAN> backup validate datafile 6;
启动 backup 于 23-3月 -08
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=130 devtype=DISK
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00006 name=E:\ORACLE\ORADATA\DB01\USERDATA01.DBF
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 23-3月 -08
RMAN> exit
恢复管理器完成。
SQL> select * from v$database_block_corruption;
FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
6 23 1 0 CHECKSUM
使用rman命令修复坏块
SQL> host rman target /
恢复管理器: Release 10.2.0.1.0 - Production on 星期日 3月 23 13:07:14 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到目标数据库: DB01 (DBID=1281151392)
RMAN> blockrecover datafile 6 block 23;
启动 blockrecover 于 23-3月 -08
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=137 devtype=DISK
通道 ORA_DISK_1: 正在恢复块
通道 ORA_DISK_1: 正在指定要从备份集恢复的块
正在恢复数据文件 00006 的块
通道 ORA_DISK_1: 正在读取备份段 E:\ORACLE\FLASH_RECOVERY_AREA\DB01\BACKUPSET\2008_03_23\O1_MF_NNNDF_TAG20080323T130137_3
YCS1L2G_.BKP
通道 ORA_DISK_1: 已从备份段 1 恢复块
段句柄 = E:\ORACLE\FLASH_RECOVERY_AREA\DB01\BACKUPSET\2008_03_23\O1_MF_NNNDF_TAG20080323T130137_3YCS1L2G_.BKP 标记 = TAG
20080323T130137
通道 ORA_DISK_1: 块恢复完成, 用时: 00:00:01
正在开始介质的恢复
介质恢复完成, 用时: 00:00:03
完成 blockrecover 于 23-3月 -08
RMAN> exit
恢复管理器完成。
SQL> select count(*) from buffer.t;
COUNT(*)
----------
3158
坏块修复后,并不会更新v$database_block_corruption,需要下次备份的时候更新
SQL> select * from v$database_block_corruption;
FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
6 23 1 0 CHECKSUM
SQL> host rman target /
恢复管理器: Release 10.2.0.1.0 - Production on 星期日 3月 23 13:09:43 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到目标数据库: DB01 (DBID=1281151392)
RMAN> backup validate datafile 6;
启动 backup 于 23-3月 -08
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=132 devtype=DISK
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件 fno=00006 name=E:\ORACLE\ORADATA\DB01\USERDATA01.DBF
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 23-3月 -08
RMAN> exit
恢复管理器完成。
SQL> select * from v$database_block_corruption;
未选定行
SQL> |
|