利用RMAN修改损坏的数据块
一、系统环境
操作系统:Microsoft Windows XP [版本 5.1.2600]
数据库 : Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 – Production
二、实验步骤
C:\>SET ORACLE_SID=MF
C:\>SQLPLUS / AS SYSDBA
SQL*PLUS: RELEASE 10.2.0.1.0 - PRODUCTION ON MON AUG 15 16:54:59 2011
COPYRIGHT (C) 1982, 2005, ORACLE. ALL RIGHTS RESERVED.
连接到:
ORACLE DATABASE 10G ENTERPRISE EDITION RELEASE 10.2.0.1.0 - PRODUCTION
WITH THE PARTITIONING, OLAP AND DATA MINING OPTIONS
启用归档:
SQL>SHUTDOWN IMMEDIATE
SQL>STARTUP MOUNT
SQL>ALTER DATABASE ARCHIVELOG;
查询归档:
SQL> ARCHIVE LOG LIST
数据库日志模式 存档模式
自动存档 启用
存档终点 D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS
最早的联机日志序列 6
下一个存档日志序列 8
当前日志序列 8
RMAN备份:
SQL> HOST RMAN TARGET /
恢复管理器: RELEASE 10.2.0.1.0 - PRODUCTION ON MON AUG 15 17:03:30 2011
COPYRIGHT (C) 1982, 2005, ORACLE. ALL RIGHTS RESERVED.
连接到目标数据库: MF (DBID=2242674473)
RMAN> BACKUP TABLESPACE USERS;
启动 BACKUP 于 15-AUG-11
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=141 DEVTYPE=DISK
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
输入数据文件
FNO=00004 NAME=D:\ORACLE\PRODUCT\10.2.0\ORADATA\MF\USERS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 15-AUG-11
通道 ORA_DISK_1: 已完成段 1 于 15-AUG-11
段句柄=D:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\02MK2N4T_1_1
标记=TAG20110815T170429 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:03
完成 BACKUP 于 15-AUG-11
模拟坏块:
SQL> DROP TABLE SCOTT.T1;
表已删除。
SQL> CREATE TABLE SCOTT.T1 AS SELECT * FROM DBA_OBJECTS;
表已创建。
SQL> SELECT COUNT(0) FROM SCOTT.T1;
COUNT(0)
----------
50318
SQL> SELECT SEGMENT_NAME, HEADER_FILE ,HEADER_BLOCK FROM DBA_SEGMENTS
WHERE SEGMENT_NAME='T1' AND WNER='SCOTT';
SEGMENT_NAME HEADER_FILE HEADER_BLOCK
-------------------- ----------- ----------------------- ----------------------
T1 4 1315
SQL> SELECT TO_CHAR(1315*8*1024, 'XXXXXXXXXXXXXXXXXXXXX') FROM DUAL;
TO_CHAR(1315*8*1024,'X
-----------------------------------
A46000
SQL> SELECT TO_CHAR(1316*8*1024, 'XXXXXXXXXXXXXXXXXXXXX') FROM DUAL;
TO_CHAR(1316*8*1024,'X
---------------------------------
A48000
可以用UE找出Table T01的段头块进行破坏,段头块是UE打开数据库文件如上图的
A46000H---18000H,破坏这之间的数据,修改数据之前先进行三次日志切换或执行一次系全局检查点,让刚创建的表中的数据都正常地归档。
SQL> SELECT NAME FROM V$DATAFILE WHERE FILE#=4;
NAME
----------------------------------------------------------------------------
D:\ORACLE\PRODUCT\10.2.0\ORADATA\MF\USERS01.DBF
破坏了块头之后,再次进行查询,结果还是可以正常查询出结果:
SQL> SELECT COUNT(0) FROM SCOTT.T1;
COUNT(0)
-------------------
50318
说明:由于之前查询过该表,而该表中的数据都在DB_BUFFER_CACHE中,所以以上查询是直接从BUFFER_CACHE中读取的,因而不会报错,当执行了下面的命令后,再次查询会报错。
SQL> ALTER SYSTEM FLUSH BUFFER_CACHE;
SQL> SELECT COUNT(0) FROM SCOTT.T1;
SELECT COUNT(0) FROM SCOTT.T1
*
第 1 行出现错误:
ORA-01578: ORACLE 数据块损坏 (文件号 4, 块号 1315)
ORA-01110: 数据文件 4: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\MF\USERS01.DBF'
利用DBV检查坏块:
SQL> HOST DBV
FILE='D:\ORACLE\PRODUCT\10.2.0\ORADATA\MF\USERS01.DBF' BLOCKSIZE=8192;
DBVERIFY: RELEASE 10.2.0.1.0 - PRODUCTION ON MON AUG 15 17:26:01 2011
COPYRIGHT (C) 1982, 2005, ORACLE. ALL RIGHTS RESERVED.
DBVERIFY - 开始验证: FILE = D:\ORACLE\PRODUCT\10.2.0\ORADATA\MF\USERS01.DBF
页 1315 标记为损坏
CORRUPT BLOCK RELATIVE DBA: 0X01000523 (FILE 4, BLOCK 1315)
BAD CHECK VALUE FOUND DURING DBV:
DATA IN BAD BLOCK:
TYPE: 35 FORMAT: 2 RDBA: 0X01000523
LAST CHANGE SCN: 0X0000.000934A0 SEQ: 0X1 FLG: 0X04
SPARE1: 0X0 SPARE2: 0X0 SPARE3: 0X0
CONSISTENCY VALUE IN TAIL: 0X34A02301
CHECK VALUE IN BLOCK HEADER: 0X6352
COMPUTED BLOCK CHECKSUM: 0XA000
DBVERIFY - 验证完成
检查的页总数: 2080
处理的页总数 (数据): 1543
失败的页总数 (数据): 0
处理的页总数 (索引): 93
失败的页总数 (索引): 0
处理的页总数 (其它): 175
处理的总页数 (段) : 0
失败的总页数 (段) : 0
空的页总数: 268
标记为损坏的总页数: 1
流入的页总数: 0
最高块 SCN : 603292 (0.603292)
查询出坏块:CORRUPT BLOCK RELATIVE DBA: 0X01000523 (FILE 4, BLOCK 1315)
RMAN恢复
SQL> HOST RMAN TARGET /
恢复管理器: RELEASE 10.2.0.1.0 - PRODUCTION ON MON AUG 15 17:27:49 2011
COPYRIGHT (C) 1982, 2005, ORACLE. ALL RIGHTS RESERVED.
连接到目标数据库: MF (DBID=2242674473)
RMAN> BLOCKRECOVER DATAFILE 4 BLOCK 13152> ;
启动 BLOCKRECOVER 于 15-AUG-11
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=143 DEVTYPE=DISK
通道 ORA_DISK_1: 正在恢复块
通道 ORA_DISK_1: 正在指定要从备份集恢复的块
正在恢复数据文件 00004 的块
通道 ORA_DISK_1: 正在读取备份段 D:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\02MK2N4T_1_1
通道 ORA_DISK_1: 已从备份段 1 恢复块
段句柄 = D:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\02MK2N4T_1_1 标记 = TAG20110815T170429
通道 ORA_DISK_1: 块恢复完成, 用时: 00:00:02
正在开始介质的恢复
介质恢复完成, 用时: 00:00:03
完成 BLOCKRECOVER 于 15-AUG-11
RMAN> EXIT
恢复管理器完成。
恢复后再次查询没有问题了
SQL> SELECT COUNT(0) FROM SCOTT.T1;
COUNT(0)
---------------------
50318
总结:
当数据库在运行过程中出现坏块时,数据库可以在打开状态下可以使用RMAN来恢复,但是数据库必须是归档模式,同时必须有该块数据文件的备份以及所有的归档日志才能进行恢复。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8319781/viewspace-704912/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8319781/viewspace-704912/