【转自】http://blog.itpub.net/21256317/viewspace-1062055/
使用rman进行坏块修复(ORA-01578、ORA-01110)
2012年的一天,处理的一个坏块问题。
环境:
Windows server 2003
Oracle 10.2.0.3 单实例
医院HIS系统
故障:
医药行业的某用户的一台数据库服务器(部署的HIS系统)断电后,开启数据库,某一部分业务无法操作,查看告警日志发现类似如下的坏块报错信息:
Dump file d:oracleproduct10.2.0adminorcldumporcl_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:ORACLEPRODUCT10.2.0ORADATAORCLSYSTEM01.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:ORACLEPRODUCT10.2.0ORADATAORCLSYSTEM01.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:ORACLEPRODUCT10.2.0ORADATAORCLSYSTEM01.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:ORACLEPRODUCT10.2.0ORADATAORCLSYSAUX01.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;