Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Unterbricht das Verschieben einer Tabelle/Partition in einen anderen Tablespace Abfragen, die auf diese Tabelle/Partition zugreifen?

Es kann mit ORA-08103: object no longer exists fehlschlagen .

In Oracle blockieren sich Leser und Schreiber nicht gegenseitig. Das bedeutet, dass sich DML und Abfragen nicht gegenseitig stören, abgesehen von einigen seltsamen Fällen wie dem Auslaufen des UNDO-Speicherplatzes. Aber das Verschieben eines Tablespace oder jede Art von ALTER- oder anderen DDL-Anweisungen ist kein normaler Schreibvorgang. Das Multiversion-Concurrency-Control-Modell bricht zusammen, wenn Sie DDL ausführen, zumindest für die beteiligten Objekte, und seltsame Dinge beginnen zu passieren.

Das Testen einer großen Bewegung ist schwierig, aber Sie können diese Fehler reproduzieren, indem Sie viele kleine Änderungen und Abfragen durchlaufen. Falls Sie denken, dass dies nur ein theoretisches Problem ist, ich habe gesehen, dass diese Fehler in der Praxis in einer Produktionsdatenbank aufgetreten sind.

Warnung:Endlosschleifen unten, da ich nicht vorhersagen kann, wie lange es dauern wird, diesen Fehler zu reproduzieren. Aber normalerweise dauert es nur ein paar Sekunden.

--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;
/

Sitzung 2 wird schließlich sterben mit:

ORA-08103: object no longer exists
ORA-06512: at line 6

Sitzung 3 wird nicht fehlschlagen, es wird keine geänderte Partition abgefragt. Jede Partition hat ihr eigenes Segment und ist ein separates Objekt, das potentiell "nicht mehr existieren" kann.