我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。 本博客所有内容均为原创,如有转载请注明作者和出处

ORA-26500错误

上一篇 / 下一篇  2008-04-18 14:13:16 / 个人分类:Bug

在测试环境中发现了这个错误,根据错误信息初步判断,和高级复制环境有关。

 

 

alert日志中,错误信息为:

Errors in file /data/admin/testdata/udump/testdata_ora_29441.trc:ITPUB个人空间um w#CK#X`l
ORA-26500: error on caching "NDMAIN"."CAT_AUTH_BAD_DRUG"

检查trace文件中的详细信息:

*** SESSION ID:(46.31281) 2008-04-04 13:31:03.942ITPUB个人空间"[ u/j-Dx
kniacfcb: ORA-26500 (line 3015) column "PROCLAMATION_NUMBER" doesn not exist
)qyVG+TZ7P3Q&Q0*** 2008-04-04 13:31:03.979
"@RXf [n"d0kniacfcb-1: ORA-26500 for NDMAIN.CAT_AUTH_BAD_DRUGITPUB个人空间.XWDx|5Bb4c@
kntklc: encountered error 26500 leading to ora-23474
a;V9X4DU`b6Bm0ORA-26500: error on caching "NDMAIN"."CAT_AUTH_BAD_DRUG"

从这里的错误信息看,似乎是由于缺少一个列造成的,但是这个列在表中是存在的:

SQL> SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS 
4P%r DL"X.S1H0  2  WHERE WNER = 'NDMAIN'
~y5V j'CY.Xs0  3  AND TABLE_NAME = 'CAT_AUTH_BAD_DRUG'ITPUB个人空间3c"`S+Z%f1^
  4  AND COLUMN_NAME = 'PROCLAMATION_NUMBER';

COLUMN_NAME
!S.bN$vf"_Y)R O0------------------------------
2F2DP#MO0PROCLAMATION_NUMBER

查询了一下metalink,基本将问题锁定在一个bug上:Bug No. 3447035。根据文档的描述,高级复制环境中,主库的表添加一个字段后,生成复制支持,随后删除一个函数索引并重建一个新的函数索引,就可能在随后的DML中得到这个错误信息。

由于当前环境部署了高级复制环境,下面仿照这个步骤,看看能否重现问题:

SQL> CREATE TABLE NDMAIN.T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));

Table created.

SQL> BEGIN
{b k!LX#{ud0  2  DBMS_REPCAT.CREATE_MASTER_REPOBJECT(GNAME => 'REP_GROUP', TYPE => 'TABLE',
9Q;?dHK'b0  3  NAME => 'T', SNAME => 'NDMAIN', USE_EXISTING_OBJECT => TRUE, COPY_ROWS => FALSE);ITPUB个人空间w$T-J&OO'v
  4  END;ITPUB个人空间G#F l8a)[R'B5N
  5  /

PL/SQL procedure successfully completed.

SQL> CREATE INDEX NDMAIN.IND_F_T_NAME ON NDMAIN.T(SUBSTR(NAME, 1, 5));

Index created.

SQL> INSERT INTO NDMAIN.T VALUES (1, 'A');

1 row created.

SQL> COMMIT;

Commit complete.

SQL> BEGIN
%?,\L.t*K sc8P0  2  DBMS_REPCAT.SUSPEND_MASTER_ACTIVITY(GNAME => 'REP_GROUP');
*ap7[^"LQ0  3  DBMS_REPCAT.ALTER_MASTER_REPOBJECT (SNAME => 'NDMAIN', NAME => 'T', TYPE => 'TABLE',
4i_c(Jv4{*y#],hn0  4     DDL_TEXT => 'ALTER TABLE NDMAIN.T ADD (AGE NUMBER(3))');
XSS+o'p(c5C0  5  DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT(SNAME => 'NDMAIN', NAME => 'T', TYPE => 'TABLE',
VZ }"|r`X.Y%OAU0  6     MIN_COMMUNICATION => TRUE);
T$w$Slw3@]0  7  DBMS_REPCAT.RESUME_MASTER_ACTIVITY(GNAME => 'REP_GROUP');ITPUB个人空间 X'ATY&ag
  8  COMMIT;ITPUB个人空间V[8td Gk
  9  END;ITPUB个人空间3b@f)I#SWUs
 10  /

PL/SQL procedure successfully completed.

SQL> CREATE OR REPLACE FUNCTION NDMAIN.F_RETURN (P_NAME VARCHAR2) RETURN VARCHAR2ITPUB个人空间 kvK_If9A]6sc
  2     DETERMINISTIC AS
5[n6Q7fp-OO5t0  3  BEGINITPUB个人空间!_ v*H7I.Zr9@E Y
  4     RETURN P_NAME || ':';
6d2[Uf)H{;TM/P0  5  END;ITPUB个人空间7V@ DM3p2p J"H7@-Jpe
  6  /

Function created.

SQL> DROP INDEX NDMAIN.IND_F_T_NAME;

Index dropped.

SQL> CREATE INDEX NDMAIN.IND_F_T_NAME1 ON NDMAIN.T(F_RETURN(NAME));

Index created.

SQL> INSERT INTO NDMAIN.T VALUES (2, 'B', 1);ITPUB个人空间{!ak`#fmw4h
INSERT INTO NDMAIN.T VALUES (2, 'B', 1)ITPUB个人空间 uVJ#rK Sgp
                   *ITPUB个人空间%G8pz7h W,j+a2P*S&g.H
ERROR at line 1:
\GV USw#l#N0ORA-23474: definition of "NDMAIN"."T" has changed since generation of
8b7A)GP4S2DD\0replication support
9@ Lz~7Sq u+P5y0ORA-26500: error on caching "NDMAIN"."T"

现在问题重现了,检查一下alert文件:

Errors in file /data/oracle/admin/predata/udump/predata_ora_3114.trc:
/Y4DH4ecBw_:dt*J0ORA-26500: error on caching "NDMAIN"."T"

详细信息:

*** SESSION ID:(19.47839) 2008-04-18 13:42:02.684ITPUB个人空间Cy9v`I:Cj
kniacfcb: ORA-26500 (line 3015) column "AGE" doesn not existITPUB个人空间9b/{*~(}Y4c!v"A4i9g!k&L
*** 2008-04-18 13:42:02.686
*k~,gPmDyZ0kniacfcb-1: ORA-26500 for NDMAIN.TITPUB个人空间OWQ-~ a nL4x
kntklc: encountered error 26500 leading to ora-23474ITPUB个人空间#i-q5f/s+\k
ORA-26500: error on caching "NDMAIN"."T"

和上面环境中碰到的现象完全一样,现在已经可以确认就是这个bug导致的问题。

由于函数索引会导致OracleSYS.COL$中添加一个列,很可能是Oracle在处理这个添加列的时候出现了错误。

SQL> SELECTCOL#, NAME, DEFAULT$ FROM SYS.COL$ITPUB个人空间/D2u z+AK$b3Bbs0L
  2  WHERE OBJ# =ITPUB个人空间;D(d(S,SJ3v
  3  (SELECT OBJECT_ID FROM DBA_OBJECTS           
1X5Z1[z*M[:x0  4  WHERE OBJECT_NAME = 'T'ITPUB个人空间r0L6Yg(zo {B]c)X
  5  AND WNER = 'NDMAIN');

     COL# NAME                           DEFAULT$
f!o{h"g$fm _0---------- ------------------------------ ------------------------------
r/\T.s:jCw0         1 ID
]t+qw;C{E"Z0         2 NAMEITPUB个人空间Q!Q8o&E#L$l
         0 SYS_NC00004$                   "NDMAIN"."F_RETURN"("NAME")
,w;M8_GA R6a+^n6z0         3 AGE

Oracle给出的解决方法是再次生成复制支持:

SQL> BEGINITPUB个人空间H8F#fb.Z,C3Jo
  2  DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT(SNAME => 'NDMAIN', NAME => 'T', TYPE => 'TABLE',
.D]lh6i0  3     MIN_COMMUNICATION => TRUE);
b$K8bc[4l/S!y0ta0  4  END;
'H K})pE9A(f-Lt0  5  /

PL/SQL procedure successfully completed.

SQL> INSERT INTO NDMAIN.T VALUES (2, 'B', 2);

1 row created.

Oracle将这个bug的状态设置为NOT A BUG,不过个人认为即使这个问题真的不是bugOracle也应该在文档中明确的指出,建立、删除函数索引等操作执行后应该重新对表生成复制支持。

 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar