ORA-01555 (snapshot too old) при простом INSERT

DimaAl
Дата: 07.03.2011 15:59:08
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production


База данных разработчиков, работaет один сервис (java приложение), который достает коннекты из пула, чего-то делает и
коммитит это. Последней командой перед отдачей коннекта в пулл гарантированно выполняется rollback. Никого боллее на базе данных кроме сервиса нет. Первой командой после получения коннекта из пула являтся вызов процедуры из пакета, которая проверяет установлен ли security context (пакетные переменные) для сервиса, и если он не установлен создает его следующим кодом:

    SELECT SECURITY.SEQ_SEC_CONTEXT.NEXTVAL
      INTO M_CONTEXT.ID FROM DUAL;
    M_CONTEXT.DB_ID := MY_DB_ID;
    M_CONTEXT.CONN_TYPE := P_CONN_TYPE;
    M_CONTEXT.KILL_FLAG := 'N';
    M_CONTEXT.PING_DATE := SYSDATE;
    M_CONTEXT.ORA_AUDSID := SYS_CONTEXT('USERENV','SESSIONID');
    M_CONTEXT.OS_USER := SYS_CONTEXT('USERENV','OS_USER');
    M_CONTEXT.MACHINE := SYS_CONTEXT('USERENV','HOST');
    M_CONTEXT.VERSION := 1;
    M_CONTEXT.INSERT_DATE := SYSDATE;
    INSERT INTO SECURITY.TSEC_CONTEXT VALUES M_CONTEXT;
    COMMIT;

M_CONTEXT это обычный record:

M_CONTEXT SECURITY.TSEC_CONTEXT%ROWTYPE;

При INSERT и возникает "snapshot too old". Воспроизвести ошибку удается с большим трудом - сервис может часами работать без ошибок, а может и через 15-мин выбросить ошибку. В сообщении об ошибке имя роллбак-сегмента - пустая строка.

ORA-01555: Snapshot zu alt: Rollback-Segmentnummer namens "" ist zu klein.



У таблицы четыре CLOB-поля и один BLOB, но в момент INSERT все они установлены в NULL. Все blob-ы имеют аттрибут "Enable storage in row"

В трейс-файле стоит это:

=====================
PARSING IN CURSOR #5 len=49 dep=1 uid=124 oct=3 lid=124 tim=25880185001 hv=2637333543 ad='7ff109ec7e0' sqlid='85dgpnqfm5117'
SELECT SECURITY.SEQ_SEC_CONTEXT.NEXTVAL FROM DUAL
END OF STMT
EXEC #5:c=0,e=12,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=1,plh=1804810192,tim=25880185000
FETCH #5:c=0,e=23,p=0,cr=0,cu=0,mis=0,r=1,dep=1,og=1,plh=1804810192,tim=25880185097
CLOSE #5:c=0,e=1,dep=1,type=3,tim=25880185120
=====================
PARSING IN CURSOR #2 len=190 dep=1 uid=124 oct=2 lid=124 tim=25880185520 hv=1956798015 ad='7ff109ec560' sqlid='7h95xp5ua4rjz'
INSERT INTO SECURITY.TSEC_CONTEXT VALUES (:B1 ,:B2 ,:B3 ,:B4 ,:B5 ,:B6 ,:B7 ,:B8 ,:B9 ,:B10 ,:B11 ,:B12 ,:B13 ,:B14 ,:B15 ,:B16 ,:B17 ,:B18 ,:B19 ,:B20 ,:B21 ,:B22 ,:B23 ,:B24 ,:B25 ,:B26 )
END OF STMT
PARSE #2:c=0,e=311,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=1,plh=0,tim=25880185520
EXEC #2:c=0,e=1851,p=2,cr=9,cu=25,mis=1,r=0,dep=1,og=1,plh=0,tim=25880187419
ERROR #2:err=1555 tim=25880187460
STAT #2 id=1 cnt=0 pid=0 pos=1 obj=0 op='LOAD TABLE CONVENTIONAL (cr=0 pr=0 pw=0 time=0 us)'
CLOSE #2:c=0,e=12,dep=1,type=0,tim=25880187647
XCTEND rlbk=1, rd_only=1, tim=25880187732
=====================

Подскажите куда смотреть/копать?
the_moon
Дата: 07.03.2011 16:31:42
DimaAl,

Как то я нарывался на подобный баг (833635.1) в 10-ке. Сделали alter table shrink space cascade, что бы ужать лоб сегмент. После этого одиночные лобы попортились и при ЧТЕНИИ этих лобов выдвало тоже

Re: ORA-01555 (snapshot too old)

Может похожее что то, поискать в металинке надо.
_Nikotin
Дата: 07.03.2011 16:39:58
похоже на 8499600.8
orawish
Дата: 07.03.2011 16:55:07
DimaAl,

в инсерт-селект перепишите
DimaAl
Дата: 07.03.2011 17:08:44
orawish
DimaAl,

в инсерт-селект перепишите


Извини, не понял что(как) переписать...
DimaAl
Дата: 07.03.2011 17:13:26
the_moon
DimaAl,

Как то я нарывался на подобный баг (833635.1) в 10-ке. Сделали alter table shrink space cascade, что бы ужать лоб сегмент. После этого одиночные лобы попортились и при ЧТЕНИИ этих лобов выдвало тоже

Re: ORA-01555 (snapshot too old)

Может похожее что то, поискать в металинке надо.


Нет, тут гарантированно ниче не попорчено. Ошибка не только на одной базе.
the_moon
Дата: 07.03.2011 17:45:54
DimaAl,

ну я не говорю, что попорчено, имею ввиду, что как то с лобами связанно. Из-за них наверное Оракл выдает ORA-1555 без указания имени сегмента. Может баг какой то.
orawish
Дата: 07.03.2011 17:51:57
DimaAl
orawish
DimaAl,

в инсерт-селект перепишите


Извини, не понял что(как) переписать...


INSERT INTO SECURITY.TSEC_CONTEXT(...) select ляля.nextval,... from dual
returning если_надо;
DimaAl
Дата: 07.03.2011 18:05:21
orawish,

спасибо за пояснение.

Это
1. просто попробовать,
2. улучшить перфоманс
или
3. подозреваешь что тут причина "snapshot too old" может быть?
DimaAl
Дата: 07.03.2011 18:09:40
the_moon,

в 11g вроде теперь всегда имени роллбак-сегмента не выдается (?);
мы уже заменили lob-ы на varchar на тестовой версии, чтоб хотя-бы выяснить в чем тут дело (в lob-ах или логике приложения). Тестируем, жаль что ошибку так просто не воспроизвести...