Oracle
 sql >> Base de données >  >> RDS >> Oracle

Le déplacement d'une table/partition vers un espace de table différent interrompra-t-il les requêtes accédant à ladite table/partition ?

Il peut échouer avec ORA-08103: object no longer exists .

Dans Oracle, les lecteurs et les rédacteurs ne se bloquent pas. Ce qui signifie que DML et les requêtes n'interféreront pas les unes avec les autres, à l'exception de quelques cas étranges comme le manque d'espace UNDO. Mais déplacer un tablespace, ou tout type d'instruction ALTER ou autre instruction DDL, n'est pas une écriture normale. Le modèle de contrôle de la simultanéité multiversion tombe en panne lorsque vous exécutez DDL, au moins pour les objets concernés, et des choses étranges commencent à se produire.

Tester un mouvement important est difficile, mais vous pouvez reproduire ces erreurs en parcourant un grand nombre de petites modifications et requêtes. Au cas où vous pensez qu'il ne s'agit que d'un problème théorique, j'ai vu ces erreurs se produire dans la vie réelle, sur une base de données de production.

Attention:boucles infinies ci-dessous car je ne peux pas prédire combien de temps il faudra pour reproduire cette erreur. Mais cela ne me prend généralement que quelques dizaines de secondes.

--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 session 2 finira par mourir avec :

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

La session 3 n'échouera pas, elle n'interroge pas une partition modifiée. Chaque partition a son propre segment et est un objet distinct qui peut potentiellement "n'exister plus".