天萃荷净
Oracle研究中心案例分析:运维DBA反映Oracle数据库无法启动并报错ORA-00604 ORA-01578,分析原因为遇核心对象bootstrap$有坏块的解决办法。change bootstrap$ table with bbed to skip corrupt block on i undo1 。
在数据库启动的时如遇核心对象(特别是bootstrap$中的对象)有坏块,会抛出ORA-00604,ORA-01578导致数据库启动失败。下面是模拟在数据库启动时遇到i_undo1索引块完全被损坏的情况下,通过跳过i_undo1来正常启动数据库。如果块只是部分损坏,可以考虑通过bbed来手动修复块。
下面是测试11.2.0.3环境,请不要在生产环境操作。
一般索引(特别是对象小于59)引坏块时,我个人习惯使用下面2种解决方案:
1,修改oracle二进制文件,通过修改SQL,不走索引,不过此方案需要注意:在二进制文件中的sql,都有长度记录,如果修改sql语句后,需要修改相应SQL的长度。
2,修改boostrap$表删除创建索引的行记录。下面是采用方法2来处理
1 环境介绍
下面的实验只能在相同的环境操作,不过的环境请注意需要变化的部分内容
oracleplus.net>!uname -a
Linux orcl9i 2.6.9-89.EL #1 Mon Apr 20 10:22:29 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
oracleplus.net>select * from v$version where rownum=1;
BANNER
——————————————————————————–
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – 64bit Production
2 查询i_undo1索引信息
查询i_undo1区的信息,主要用于下面dd命令操作
oracleplus.net>@extent.sql
Enter value for owner: sys
Enter value for segment_name: i_undo1
Enter value for tablespace_name:
FILE BLOCK
OWNER:SEGMENT_NAME ID FNO EXTENT_ID BEGIN_END
——————– —– —– ———- ————-
SYS.I_UNDO1 1 1 0 320~327
查询创建i_undo1在bootstrap$中的位置,也可以通过其它数据库查询
oracleplus.net>select * from bootstrap$ where sql_text like ‘%I_UNDO1%’;
LINE# OBJ# SQL_TEXT
———- ———- ——————————————————————————————————————————————————
34 34 CREATE UNIQUE INDEX I_UNDO1 ON UNDO$(US#) PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645 PCTI
NCREASE 0 OBJNO 34 EXTENTS (FILE 1 BLOCK 320))
查询i_undo1对象存放的物理位置
oracleplus.net>select obj#,
dbms_rowid.rowid_relative_fno(rowid) file_id,
dbms_rowid.rowid_block_number(rowid) block_id,
dbms_rowid.ROWID_ROW_NUMBER(rowid) row_id
from bootstrap$
where obj# = 34order by obj#;
FILE
OBJ# ID BLOCK_ID ROW_ID
———- —– ———- ———-
34 1 521 8
查询在obj$表中存放的位置
oracleplus.net>select obj#,
dbms_rowid.rowid_relative_fno(rowid) file_id,
dbms_rowid.rowid_block_number(rowid) block_id,
dbms_rowid.ROWID_ROW_NUMBER(rowid) row_id
from ind$
where obj# = 34
order by obj#;
FILE
OBJ# ID BLOCK_ID ROW_ID
———- —– ———- ———-
34 1 145 3
1 row selected.
查询在ind$表中存放的位置
oracleplus.net>select obj#,
dbms_rowid.rowid_relative_fno(rowid) file_id,
dbms_rowid.rowid_block_number(rowid) block_id,
dbms_rowid.ROWID_ROW_NUMBER(rowid) row_id
from obj$
where obj# = 34
order by obj#;
FILE
OBJ# ID BLOCK_ID ROW_ID
———- —– ———- ———-
34 1 241 39
查询数据文件的位置
oracleplus.net>sele