Het kan mislukken met ORA-08103: object no longer exists
.
In Oracle blokkeren lezers en schrijvers elkaar niet. Dat betekent dat DML en query's elkaar niet zullen hinderen, met uitzondering van een paar rare gevallen, zoals onvoldoende UNDO-ruimte. Maar het verplaatsen van een tablespace, of elk type ALTER of ander DDL-statement, is geen normaal schrijven. Het gelijktijdigheidscontrolemodel voor meerdere versies valt uit elkaar wanneer u DDL uitvoert, in ieder geval voor de betrokken objecten, en er gebeuren rare dingen.
Het testen van een grote zet is moeilijk, maar u kunt deze fouten reproduceren door een groot aantal kleine wijzigingen en query's te doorlopen. Voor het geval je denkt dat dit slechts een theoretisch probleem is, ik heb deze fouten in het echt zien voorkomen, in een productiedatabase.
Waarschuwing:oneindige lussen hieronder, omdat ik niet kan voorspellen hoe lang het duurt om deze fout te reproduceren. Maar het kost me meestal maar tientallen seconden.
--Create sample table.
drop table test1 purge;
create table test1(a number, b number)
partition by list(a) (partition p1 values(1), partition p2 values(2))
nologging tablespace users;
--Session 1
begin
loop
execute immediate '
insert /*+ append */ into test1 select mod(level,2)+1, level
from dual connect by level <= 100000';
commit;
execute immediate 'alter table test1 move partition p1 tablespace users';
end loop;
end;
/
--Session 2: Read from moved partition
declare
v_count number;
begin
loop
select count(*) into v_count from test1 where a = 1;
end loop;
end;
/
--Session 3: Read from unmoved partition
declare
v_count number;
begin
loop
select count(*) into v_count from test1 where a = 2;
end loop;
end;
/
Sessie 2 zal uiteindelijk sterven met:
ORA-08103: object no longer exists
ORA-06512: at line 6
Sessie 3 zal niet mislukken, het vraagt niet om een gewijzigde partitie. Elke partitie heeft zijn eigen segment en is een afzonderlijk object dat mogelijk "niet meer bestaat".