Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Mover uma tabela/partição para um tablespace diferente interromperá as consultas que acessam a referida tabela/partição?


Pode falhar com ORA-08103: object no longer exists .

Na Oracle, leitores e escritores não se bloqueiam. O que significa que DML e consultas não interferirão entre si, excluindo alguns casos estranhos, como ficar sem espaço UNDO. Mas mover um tablespace, ou qualquer tipo de ALTER ou outra instrução DDL, não é uma gravação normal. O modelo de controle de simultaneidade multiversão é interrompido quando você executa o DDL, pelo menos para os objetos envolvidos, e coisas estranhas começam a acontecer.

Testar uma grande movimentação é difícil, mas você pode reproduzir esses erros fazendo um loop através de várias pequenas alterações e consultas. Caso você ache que isso é apenas uma questão teórica, já vi esses erros ocorrerem na vida real, em um banco de dados de produção.

Aviso:loops infinitos abaixo, pois não posso prever quanto tempo levará para reproduzir esse erro. Mas geralmente leva apenas dezenas 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;
/

A Sessão 2 acabará por morrer com:
ORA-08103: object no longer exists
ORA-06512: at line 6

A sessão 3 não falhará, não está consultando uma partição alterada. Cada partição tem seu próprio segmento e é um objeto separado que pode potencialmente "não existir mais".