Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Czy przeniesienie tabeli/partycji do innego obszaru tabel przerwania zapytań uzyskujących dostęp do tej tabeli/partycji?

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ć”.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL:Uzyskaj rekordy utworzone w przedziale czasowym dla określonych dat

  2. Pobierz dane za 31 grudnia z ostatnich 5 lat i dzisiejszą datę

  3. Używasz sqlalchemy dburi z Oracle przy użyciu zewnętrznego magazynu haseł?

  4. Wpływ zdefiniowania kolumny VARCHAR2 o większej długości

  5. Oracle — ORA-01489:wynik konkatenacji ciągów jest za długi