【转载】 使用rman进行坏块修复(ORA-01578、ORA-01110)

【转自】http://blog.itpub.net/21256317/viewspace-1062055/

使用rman进行坏块修复(ORA-01578ORA-01110

 

2012年的一天,处理的一个坏块问题。

 

环境:

Windows server 2003

Oracle 10.2.0.3 单实例

医院HIS系统

 

故障:

医药行业的某用户的一台数据库服务器(部署的HIS系统)断电后,开启数据库,某一部分业务无法操作,查看告警日志发现类似如下的坏块报错信息:

 

Dump file d:\oracle\product\10.2.0\admin\orcl\bdump\orcl_j002_1872.trc部分内容如下:
Mon Jul 02 22:17:29 2012
ORACLE V10.2.0.3.0 - Production vsnsta=0
vsnsql=14 vsnxtr=3
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
Windows Server 2003 Version V5.2 Service Pack 2
CPU                 : 8 - type 586, 2 Physical Cores
Process Affinity    : 0x00000000
Memory (Avail/Total): Ph:14514M/16382M, Ph+PgF:16031M/17822M, VA:2626M/4095M
Instance name: orcl
Redo thread mounted by this instance: 1
Oracle process number: 28
Windows thread id: 1872, image: ORACLE.EXE (J002)
*** 2012-07-02 22:17:29.718
*** ACTION NAME:(GATHER_STATS_JOB) 2012-07-02 22:17:29.703
*** MODULE NAME:(DBMS_SCHEDULER) 2012-07-02 22:17:29.703
*** SERVICE NAME:(SYS$USERS) 2012-07-02 22:17:29.703
*** SESSION ID:(147.1) 2012-07-02 22:17:29.703
ORA-00604: error occurred at recursive SQL level 2
ORA-01578: ORACLE data block corrupted (file # 1, block # 71013)
ORA-01110: data file 1: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF'
*** 2012-07-02 22:17:29.734
GATHER_STATS_JOB: GATHER_TABLE_STATS('"SYSMAN"','"MGMT_SEVERITY"','""', ...)
ORA-00604: error occurred at recursive SQL level 2
ORA-01578: ORACLE data block corrupted (file # 1, block # 71013)
ORA-01110: data file 1: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF'
*** 2012-07-02 22:17:52.515
GATHER_STATS_JOB: GATHER_TABLE_STATS('"SYS"','"HISTGRM$"','""', ...)
ORA-01578: ORACLE data block corrupted (file # 1, block # 71013)
ORA-01110: data file 1: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF'
*** 2012-07-02 22:20:55.312
GATHER_STATS_JOB: GATHER_TABLE_STATS('"ZLHIS"','"病人医嘱记录"','""', ...)
ORA-00604: error occurred at recursive SQL level 2
ORA-01578: ORACLE data block corrupted (file # 3, block # 56437)
ORA-01110: data file 3: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF'
……

 

分析:

SYSTEM和SYSAUX表空间数据文件出现坏块。

先查看损坏的是什么类型的数据库对象:

SQL>select  owner,segment_name,segment_type from dba_extents where file_id=1 and 71013 between block_id and block_id+blocks-1;

 

这是sys用户的一个簇,还有一个是sys 用户的一个索引。

 

处理:

还好系统是归档模式,有rman备份,这样处理就比较简单了,使用blockrecover 对坏块进行在线修复。

rman target /

RMAN> blockrecover datafile 1 block 71013;

RMAN> blockrecover datafile 3 block 56437;

 

 

 

通常使用rman进行坏块修复的步骤:

适应场景:归档模式,有近期数据库的rman全备份

 

用dbv实用程序对该文件做数据块的检验:(此处最好使用绝对路径,否则可能报错DBV-00600 Fatal Error – [21] [2] [0] [0])

$ dbv file=/u01/app/oracle/oradata/ora10g/system01.dbf  blocksize=8192

 

对数据库中的坏块进行验证。

RMAN> backup validate database;

检验后检查视图 V$DATABASE_BLOCK_CORRUPTION

SQL> select * from v$database_block_corruption;

 

为了不影响现有业务的运行,通过RMAN使用oracle BMR(Block Media Recover).

BMR可以比使用restore database节省大量的宕机时间,在恢复期间只有坏块的文件不可访问,而其他可以继续访问。

 

RMAN> blockrecover datafile 10 block 36,85,126,321;

 

还可以通过blockrecover corruption list进行块的恢复,这是在大量块损坏时使用,前提是先执行backup validate database,在V$DATABASE_BLOCK_CORRUPTION里有对应的坏块的列表。

 

RMAN> blockrecover corruption list;

posted @ 2017-04-01 16:34  dudu_java  阅读(1215)  评论(0编辑  收藏  举报