Oracle
 sql >> Database >  >> RDS >> Oracle

Lo spostamento di una tabella/partizione in un tablespace diverso interromperà le query che accedono a detta tabella/partizione?

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ù".