Alert报错信息如下:
ARC0: Completed archiving log 5 thread 1 sequence 8094
Thu Jul 22 09:16:08 2010
Errors in file /oracle/app/oracle/admin/xxx/udump/sdh_ora_22264.trc:
ORA-00600: internal error code, arguments: [4511], [], [], [], [], [], [], []
Thu Jul 22 10:03:59 2010
Errors in file /oracle/app/oracle/admin/xxx/udump/xxx_ora_3041.trc:
ORA-00600: internal error code, arguments: [4511], [], [], [], [], [], [], []
Thu Jul 22 10:04:21 2010
Errors in file /oracle/app/oracle/admin/xxx/udump/xxx_ora_3147.trc:
ORA-00600: internal error code, arguments: [4511], [], [], [], [], [], [], []
Thu Jul 22 10:04:27 2010
Errors in file /oracle/app/oracle/admin/xxx/udump/xxx_ora_3151.trc:
ORA-00600: internal error code, arguments: [25012], [3], [60], [], [], [], [], []
Thu Jul 22 10:04:35 2010
Errors in file /oracle/app/oracle/admin/xxx/udump/xxx_ora_3151.trc:
ORA-00600: internal error code, arguments: [25012], [3], [60], [], [], [], [], []
Thu Jul 22 10:04:42 2010
Errors in file /oracle/app/oracle/admin/xxx/udump/xxx_ora_3151.trc:
ORA-00600: internal error code, arguments: [25012], [3], [60], [], [], [], [], []
Thu Jul 22 10:04:51 2010
Errors in file /oracle/app/oracle/admin/xxxudump/xxx_ora_3151.trc:
ORA-00600: internal error code, arguments: [25012], [3], [987], [], [], [], [], []
xxx_ora_22264.trc显示如下
*** SESSION ID:(129.44845) 2010-07-22 09:16:08.743
*** 2010-07-22 09:16:08.743
ksedmp: internal or fatal error
ORA-00600: internal error code, arguments: [4511], [], [], [], [], [], [], []
Current SQL statement for this session:
DELETE FROM xx_VALUE_TMP
----- PL/SQL Call Stack -----
object line object
handle number name
c00000036f5f7900
636 package body xx.PG_xxx_RULE
c00000039318bbc0 1 anonymous block
分析:由上面的日志显示,每次报告ORA-00600[4511]错误都和一个语句有关DELETE FROM xx_VALUE_TMP,而这个语句是属于xx.PG_xx_RULE这个包的。
多次和应用厂商确认后,他们确认该应用程序段是新上的一个业务。从语句表面来看整个程序段中没有COMMIT操作,同时使用了嵌套循环,语句中DELETE FROM xx_VALUE_TMP操作没有WHERE条件。
产生问题后,从oracle内部我们拿到了与此故障对应的文档
ORA-600 [kcbzpb_1] (Doc ID 139011.1)
其中讲到了,反复以离散写方式更新buff cache header,在某些情况下会造成坏块。
实际上出错的程序在业务并发时,此问题程序进行了反复全表delete(也就是离散写),这就是触发坏块的原因。
从以上分析来看,应用开发者在设计这个程序时,未考虑对应的表对象的并发操作。导致表的buff cache header被并发操作,因此在某些情况下,造成了数据库坏块。实际上,从该应用实现功能上来看,需要用临时表来实现,而在这里却把数据库的永久表当成了临时表来使用,所以建议对应用进行修改,使用global temp table来避免反复离散写。
由于ORACLE在反复以离散写方式更新buff cache header的时候,会对数据库造成不利的影响,这是程序开发人员应具备的常识。所以程序开发的时候应该避免此情况的发生,这里的相应处理方法就是使用global temp table。
ORA-600 [kcbzpb_1] (Doc ID 139011.1) | |
Modified03-JUN-2010TypeREFERENCE | |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11088128/viewspace-687257/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/11088128/viewspace-687257/