Potrebbe non riuscire con ORA-08103: object no longer exists
.
In Oracle, lettori e scrittori non si bloccano a vicenda. Ciò significa che DML e query non interferiranno tra loro, esclusi alcuni casi strani come l'esaurimento dello spazio UNDO. Ma spostare un tablespace, o qualsiasi tipo di ALTER o altra istruzione DDL, non è una normale scrittura. Il modello di controllo della concorrenza multiversione si interrompe quando esegui DDL, almeno per gli oggetti coinvolti, e iniziano a succedere cose strane.
Testare una mossa di grandi dimensioni è difficile, ma puoi riprodurre questi errori eseguendo un ciclo di molte piccole modifiche e query. Nel caso in cui pensi che questo sia solo un problema teorico, ho visto questi errori verificarsi nella vita reale, su un database di produzione.
Avviso:loop infiniti di seguito poiché non posso prevedere quanto tempo ci vorrà per riprodurre questo errore. Ma di solito mi ci vogliono solo decine di secondi.
--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;
/
La sessione 2 alla fine morirà con:
ORA-08103: object no longer exists
ORA-06512: at line 6
La sessione 3 non fallirà, non sta interrogando una partizione alterata. Ogni partizione ha il proprio segmento ed è un oggetto separato che potenzialmente può "non esistere più".