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'
~y5Vj'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)RO0------------------------------
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
{bk!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*Ksc8P0 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[8tdGk
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@DM3p2pJ"H7@-Jp e
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-~anL4x
kntklc: encountered error 26500 leading to ora-23474ITPUB个人空间#i-q5f/s+\k
ORA-26500: error on caching "NDMAIN"."T"
和上面环境中碰到的现象完全一样,现在已经可以确认就是这个bug导致的问题。
由于函数索引会导致Oracle在SYS.COL$中添加一个列,很可能是Oracle在处理这个添加列的时候出现了错误。
SQL> SELECT
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');
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,C3J o
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,不过个人认为即使这个问题真的不是bug,Oracle也应该在文档中明确的指出,建立、删除函数索引等操作执行后应该重新对表生成复制支持。
导入论坛 引用链接 收藏 分享给好友 推荐到圈子 管理 举报
TAG: