刚发现这个问题时候,粗粗的查了一下,以为是空间不足原因,把之前的备份删除了,为后面的悲惨埋下了伏笔。
通过在 oracle用户下面执行:
dbv file=/opt/oracle/oradata/ORCL/sysaux01.dbf,可以看到,file 3, block 308634
是文件3,数据块308634有坏掉。不用如命令,其实在alter日志里也可以看到。
按理说,有个命令 blockrecover可以恢复坏掉,但之前说了,把我之前的备份删除了,执行此命令则提示:no back,没办法。找林工吧。
林工说,执行:
SELECT tablespace_name, segment_type, owner, segment_name
FROM dba_extents
WHERE file_id = 3
and 308634 between block_id AND block_id + blocks - 1;
结果是显示tablespace_name owner segment_type segment_name sysaux index sys i_wri$optstat_h_st的一些东西。
再执行:select count(*) from WRI$_OPTSTAT_HISTGRM_HISTORY;
结果是:2690623
再执行:alter index sys.i_wri$_optstat_h_st rebuild;
结果是:index altered.
再检查下:
dbv file=/opt/oracle/oradata/ORCL/sysaux01.dbf,发现还是有坏块提示,file 3, block 308634
再用
SELECT tablespace_name, segment_type, owner, segment_name
FROM dba_extents
WHERE file_id = 3
and 308634 between block_id AND block_id + blocks - 1;
结果是: no rows selected.
再用rman备份,发现可以了。
林工说,再用 run {blockrecover datafile 3 block 308634;}
修复下。果然可以修改,提示:finished recover
再用dbv检查时,已经没有坏块了。搞定!