sitemap

RSS地图

收藏本站

设为首页

Oracle研究中心

当前位置:Oracle研究中心 > 故障案例 >

【案例】Oracle报错ORA-01578的产生原因和解决办法

时间:2016-10-22 23:00   来源:Oracle研究中心   作者:HTZ   点击:

天萃荷净 运维DBA反映测试环境Oracle数据库在启动时报错ORA-01578,分析原因为由于坏块导致数据库无法启动报错。
数据库启动的时候遇到坏块,特别是SYSTEM表空间中的一些底层表,如UNDO$,OBJ$等一些表,会导致数据库不能正常open,当然我们可以通过增加一些隐藏参数来达到跳过坏块来启动数据库,也可以通过bbed工具来手动修复块来。下面是自己的一个测试环境遇到这样的错误,通过bbed工具来修复

1,数据库版本

SQL> select * from v$version;

BANNER
——————————————————————————–
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – 64bit Production
PL/SQL Release 11.2.0.3.0 – Production
CORE 11.2.0.3.0 Production
TNS for Linux: Version 11.2.0.3.0 – Production
NLSRTL Version 11.2.0.3.0 – Production

[oracle@oracleplus.net ~]$sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Sun May 25 04:36:03 2014

Copyright (c) 1982, 2011, Oracle. All rights reserved.

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area 237998080 bytes
Fixed Size 2227216 bytes
Variable Size 146801648 bytes
Database Buffers 83886080 bytes
Redo Buffers 5083136 bytes
Database mounted.
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-00604: error occurred at recursive SQL level 1
ORA-00607: Internal error occurred while making a change to a data block
ORA-00600: internal error code, arguments: [kdBlkCheckError], [1], [225],
[6108], [], [], [], [], [], [], [], []
Process ID: 12178
Session ID: 1 Serial number: 5

2,启动报错

[oracle@oracleplus.net ~]$sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Sun May 25 04:20:44 2014

Copyright (c) 1982, 2011, Oracle. All rights reserved.

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area 237998080 bytes
Fixed Size 2227216 bytes
Variable Size 146801648 bytes
Database Buffers 83886080 bytes
Redo Buffers 5083136 bytes
Database mounted.
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-00604: error occurred at recursive SQL level 1
ORA-01578: ORACLE data block corrupted (file # 1, block # 225)
ORA-01110: data file 1: ‘/oracle/app/oracle/oradata/orcl1123/system01.dbf’
Process ID: 1617
Session ID: 1 Serial number: 5

此块就是存储undo$基表的块,在数据库启动的时候,做恢复的时候,是需要去读undo块的,所以导致报错

3,bbed修复坏块

BBED> verify
DBVERIFY – Verification starting
FILE = /oracle/app/oracle/oradata/orcl1123/system01.dbf
BLOCK = 225

Block Checking: DBA = 4194529, Block Type = KTB-managed data block
Found block already marked corrupted

DBVERIFY – Verification complete

Total Blocks Examined : 1
Total Blocks Processed (Data) : 1
Total Blocks Failing (Data) : 0
Total Blocks Processed (Index): 0
Total Blocks Failing (Index): 0
Total Blocks Empty : 0
Total Blocks Marked Corrupt : 0
Total Blocks Influx : 0
Message 531 not found; product=RDBMS; facility=BBED
这里发现块被标记为坏块,其实这里知道就是把seq更改为FF了,下面我们修改回来就可以了
BBED> p kcbh
struct kcbh, 20 bytes @0
ub1 type_kcbh @0 0x06
ub1 frmt_kcbh @1 0xa2
ub1 spare1_kcbh @2 0x00
ub1 spare2_kcbh @3 0x00
ub4 rdba_kcbh @4 0x004000e1
ub4 bas_kcbh @8 0x0021beaa
ub2 wrp_kcbh @12 0x0000
ub1 seq_kcbh @14 0xff
ub1 flg_kcbh @15 0x04 (KCBHFCKV)
ub2 chkval_kcbh @16 0x4cba
ub2 spare3_kcbh @18 0x0000

BBED> set mode edit
MODE Edit

BBED> set count 16
COUNT 16

BBED> modify /x 00 offset 14
Warning: contents of previous BIFILE will be lost. Proceed (Y/N) y
File: /oracle/app/oracle/oradata/orcl1123/system01.dbf (0)
Block: 225 Offsets: 14 to 29 Dba:0x00000000
————————————————————————
0004ba4c 00000100 00000f00 0000aabe

<32 bytes per line>


BBED> set offset 8188
OFFSET 8188

BBED> dump
File: /oracle/app/oracle/oradata/orcl1123/system01.dbf (0)
Block: 225 Offsets: 8188 to 8191 Dba:0x00000000
————————————————————————
ff06aabe

<32 bytes per line>

BBED> modify /x 00 offset 8188
File: /oracle/app/oracle/oradata/orcl1123/system01.dbf (0)
Block: 225 Offsets: 8188 to 8191 Dba:0x00000000
————————————————————————
0006aabe

<32 bytes per line>

BBED> p tailchk
ub4 tailchk @8188 0xbeaa0600


BBED> sum apply
Check value for File 0, Block 225:
current = 0x4cba, required = 0x4cba

BBED> verify
DBVERIFY – Verification starting
FILE = /oracle/app/oracle/oradata/orcl1123/system01.dbf
BLOCK = 225

Block Checking: DBA = 4194529, Block Type = KTB-managed data block
data header at 0x2a98b8725c
kdbchk: row locked by non-existent transaction
table=0 slot=20
lockid=1 ktbbhitc=2
Block 225 failed with check code 6101

DBVERIFY – Verification comOracle о plete

Total Blocks Examined : 1
Total Blocks Processed (Data) : 1
Total Blocks Failing (Data) : 1
Total Blocks Processed (Index): 0
Total Blocks Failing (Index): 0
Total Blocks Empty : 0
Total Blocks Marked Corrupt : 0
Total Blocks Influx : 0
Message 531 not found; product=RDBMS; facility=BBED
这里看到报了ITL相当的一些东西,原因是由于原来做实验的时候,手动提交了数据。
报错代码的意思是,slot=20的行被锁住,占用了itl2.

下面是dump数据库看一下第21号的lb标记符
tl: 58 fb: –H-FL– lb: 0x1 cc: 17
col 0: [ 2] c1 15
col 1: [10] 5f 53 59 53 53 4d 55 32 30 24
col 2: [ 2] c1 02
col 3: [ 2] c1 06
col 4: [ 3] c2 03 49
col 5: [ 5] c4 02 62 0a 09
col 6: [ 1] 80
col 7: [ 3] c2 03 2a
col 8: [ 3] c2 02 3e
col 9: [ 1] 80
col 10: [ 2] c1 04
col 11: [ 2] c1 06
col 12: *NULL*
col 13: *NULL*
col 14: *NULL*
col 15: *NULL*
col 16: [ 2] c1 0

BBED> p *kdbr[20]
rowdata[634]
————
ub1 rowdata[634] @1823 0x2c

BBED> set offset 1823
OFFSET 1823

BBED> dump
File: /oracle/app/oracle/oradata/orcl1123/system01.dbf (0)
Block: 225 Offsets: 1823 to 1838 Dba:0x00000000
————————————————————————
2c011102 c1150a5f 53595353 4d553230
BBED> modify /x 2c00
File: /oracle/app/oracle/oradata/orcl1123/system01.dbf (0)
Block: 225 Offsets: 1823 to 1838 Dba:0x00000000
————————————————————————
2c001102 c1150a5f 53595353 4d553230

<32 bytes per line>



BBED> sum apply
Check value for File 0, Block 225:
current = 0x6ec1, required = 0x6ec1

BBED> verify
DBVERIFY – Verification starting
FILE = /oracle/app/oracle/oradata/orcl1123/system01.dbf
BLOCK = 225


DBVERIFY – Verification complete

Total Blocks Examined : 1
Total Blocks Processed (Data) : 1
Total Blocks Failing (Data) : 0
Total Blocks Processed (Index): 0
Total Blocks Failing (Index): 0
Total Blocks Empty : 0
Total Blocks Marked Corrupt : 0
Total Blocks Influx : 0
Message 531 not found; product=RDBMS; facility=BBED

块不在报错。验证通过

4,数据库正常打开

SQL> alter database open;

Database altered.

undo块能正常访问
SQL> select name from undo$;

NAME
——————————
SYSTEM
_SYSSMU1$
_SYSSMU10$
_SYSSMU11$
_SYSSMU12$
_SYSSMU13$
_SYSSMU14$
_SYSSMU15$
_SYSSMU16$
_SYSSMU17$
_SYSSMU18$

NAME
——————————
_SYSSMU19$
_SYSSMU2$
_SYSSMU20$
_SYSSMU3$
_SYSSMU4$
_SYSSMU5$
_SYSSMU6$
_SYSSMU7$
_SYSSMU8$
_SYSSMU9$

21 rows selected.
本文固定链接: http://www.htz.pw/2014/05/25/%e6%95%b0%e6%8d%ae%e5%ba%93%e5%90%af%e5%8a%a8%e6%97%b6%e9%81%87%e5%88%b0ora-01578%e9%94%99%e8%af%af.html | 认真就输

--------------------------------------ORACLE-DBA----------------------------------------

最权威、专业的Oracle案例资源汇总之【案例】Oracle报错ORA-01578的产生原因和解决办法

本文由大师惜分飞原创分享,网址:http://www.oracleplus.net/arch/1039.html

Oracle研究中心

关键词:

Oracle bbed解决坏块报错ORA-01578过程

Oracle坏块导致无法启动报错ORA-01578

Oracle报错ORA-01578的解决办法

Oracle数据库启动时遇到ORA-01578错误