很早之前写的一个小文档没事就发上来:
刚接手一个小库准备rman全备一下结果报错说有一个坏块无法备份
查看alert日志发现system表空间存在一个坏块
Errors in file /u01/app/oracle/admin/sms/bdump/sms_j001_19329.trc:
ORA-01578: ORACLE data block corrupted (file # 1, block # 33076)
ORA-01110: data file 1: '/u01/app/oracle/oradata/sms/system01.dbf'
定位33076号坏块前的extents中的内容
select
tablespace_name,segment_type,owner,segment_name
from
dba_extents
where file_id=1
and block_id<=33076
and (block_id+blocks-1)>=33076
/
TABLESPACE_NAME SEGMENT_TYPE OWNER SEGMENT_NAME
-------------------- -------------------- - ------------------- --------------------
SYSTEM INDEX SYS I_OBJAUTH2
此坏块为一个索引中的块,删除重建。
查找出坏块中索引的元数据留作备用
SQL> SET LONG 2000
SQL> select dbms_metadata.get_ddl('INDEX','I_OBJAUTH2','SYS') FROM DUAL;
DBMS_METADATA.GET_DDL('INDEX','I_OBJAUTH2','SYS')
--------------------------------------------------------------------------------
CREATE INDEX "SYS"."I_OBJAUTH2" ON "SYS"."OBJAUTH$" ("GRANTEE#", "OBJ#", "COL#")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "SYSTEM"
SQL>
重建索引,报错
SQL> alter index I_OBJAUTH2 rebuild;
alter index I_OBJAUTH2 rebuild;
*
ERROR at line 1:
ORA-00701: object necessary for warmstarting database cannot be altered
百度到eygle说的高水位上有些索引是可以通过rebuild来改变其位置的,但是在正常模式下,Oracle不允许rebuild这些索引;
两种解决方案1.通过migrate模式。
2.通过一个内部事件
地址在这里http://www.eygle.com/archives/2007/02/ora_00701_warmstarting.html
我采取第一种方法
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL> startup migrate
ORACLE instance started.
SQL> alter index I_OBJAUTH2 rebuild;
Index altered.
修改成功
关库正常起库。
rman备份成功,alert日志也无报错了。