ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 利用RMAN修改损坏的数据块

利用RMAN修改损坏的数据块

原创 Linux操作系统 作者:mafeicnnui 时间:2011-08-15 17:37:36 0 删除 编辑

利用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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-08-12

  • 博文量
    7
  • 访问量
    4944