一、发现问题
日检查发现异常情况,告警日志没出现明显坏块情况。EM报有坏块
二、确认问题
dbv工具测试有坏块,rman检查没有坏块,视图V$DATABASE_BLOCK_CORRUPTION显示有坏块。
确定坏块在sysawu文件上
三、解决问题(重建数据库避开坏块,库名不能更改)
重命名原数据库的数据文件,复制一份重命名为原数据文件名称(目的,卸载原数据库且不删除 原数据文件防止坏块转移)
dbca卸载库,dbca建库
数据库能正常运行。暂时恢复生产,等待新服务器并迁移。
四、验证并恢复生产
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
遇到坏块问题的解决方法及思路
一、RMAN(Recovery Manager)工具
在线使用Recovery Manager扫描坏块和备份时,需要数据库运行在归档
模式(archive log),否则只能在数据库未打开(mount)的情况下进
行;
RMAN>backup check logical validate datafile n ;
以上命令可以检查数据文件是否包含坏块,同时并不产生实际的备份输
出。
而且当使用Recovery Manager进行实际的数据库备份时,同时也就进行
了坏块检查。
直接使用RMAN的命令:backup validate check logical database;
结
合V$DATABASE_BLOCK_CORRUPTION视图更方便。
二、告警日志中快速识别
遇到坏块问题时,数据库的异常表现通常有:
报告ORA-01578错误。
报告ORA-1110错误。
报告ORA-00600错误。其中,第一个参数为2000-8000,Cache layer 2000 – 4000,Transaction layer 4000 – 6000,Data layer 6000 - 8000。
Trace文件中出现Corrupt block dba: 0x160c5958 . found。 分析对象失败。
后台进程,如DBWR,LGWR出现长时间异常等待,如LGWR wait for redo copy。
三、
修复数据库坏块
dbv
你也可以用dbv工具看一下你现在其他的数据文件有没有还有坏块的
dbv file='yourfilename'
确定发生坏块的数据库对象
SELECT tablespace_name,
segment_type,
owner,
segment_name
FROM dba_extents
WHERE file_id =
AND between block_id AND block_id+blocks-1; (定位数据库坏块位置)
用Oracle提供的DBMS_REPAIR包标记出坏块
exec DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('','');
4.使用Create table as select命令将表中其它块上的记录保存到另一张表上
create table corrupt_table_bak
as
select * from corrupt_table;
5.用DROP TABLE命令删除有坏块的表
drop table corrupt_table;
6.用alter table rename命令恢复原来的表
alter table corrupt_table_bak
rename to corrupt_table;
7.如果表上存在索引,则要重建表上的索引
PART2
2014.7.22研究恢复数据库坏块: