sql >> Base de Datos >  >> RDS >> Oracle

¿Mover una tabla/partición a un tablespace diferente interrumpirá las consultas que acceden a dicha tabla/partición?

Podría fallar con ORA-08103: object no longer exists .

En Oracle, los lectores y escritores no se bloquean entre sí. Lo que significa que DML y las consultas no interferirán entre sí, excepto algunos casos extraños como quedarse sin espacio para DESHACER. Pero mover un tablespace, o cualquier tipo de ALTER u otra instrucción DDL, no es una escritura normal. El modelo de control de concurrencia de múltiples versiones falla cuando ejecuta DDL, al menos para los objetos involucrados, y comienzan a suceder cosas extrañas.

Probar un movimiento grande es difícil, pero puede reproducir estos errores recorriendo una gran cantidad de pequeños cambios y consultas. En caso de que piense que esto es solo un problema teórico, he visto que estos errores ocurren en la vida real, en una base de datos de producción.

Advertencia:bucles infinitos a continuación, ya que no puedo predecir cuánto tiempo llevará reproducir este error. Pero por lo general solo me toma decenas de segundos.

--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 sesión 2 eventualmente morirá con:

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

La sesión 3 no fallará, no está consultando una partición alterada. Cada partición tiene su propio segmento y es un objeto separado que potencialmente "ya no existe".