Może się nie powieść z ORA-08103: object no longer exists
.
W Oracle czytelnicy i pisarze nie blokują się nawzajem. Oznacza to, że DML i zapytania nie będą ze sobą kolidować, z wyjątkiem kilku dziwnych przypadków, takich jak brak miejsca na UNDO. Ale przenoszenie obszaru tabel lub dowolnego typu instrukcji ALTER lub innej instrukcji DDL nie jest normalnym zapisem. Model kontroli współbieżności wielu wersji załamuje się po uruchomieniu DDL, przynajmniej dla zaangażowanych obiektów, i zaczynają się dziać dziwne rzeczy.
Testowanie dużego ruchu jest trudne, ale możesz odtworzyć te błędy, przechodząc przez wiele małych zmian i zapytań. Jeśli uważasz, że to tylko teoretyczny problem, widziałem, jak te błędy występują w rzeczywistości, w produkcyjnej bazie danych.
Ostrzeżenie:nieskończone pętle poniżej, ponieważ nie mogę przewidzieć, ile czasu zajmie odtworzenie tego błędu. Ale zwykle zajmuje mi to tylko kilkadziesiąt sekund.
--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;
/
Sesja 2 w końcu umrze z:
ORA-08103: object no longer exists
ORA-06512: at line 6
Sesja 3 nie zawiedzie, nie wysyła zapytania do zmienionej partycji. Każda partycja ma swój własny segment i jest oddzielnym obiektem, który potencjalnie może „już nie istnieć”.