Oracle
 sql >> база данни >  >> RDS >> Oracle

Преместването на таблица/дял в друго таблично пространство ще прекъсне ли заявките за достъп до споменатата таблица/дял?

Може да се провали с ORA-08103: object no longer exists .

В Oracle читателите и писателите не се блокират взаимно. Което означава, че DML и заявките няма да си пречат, с изключение на няколко странни случая като изчерпване на UNDO място. Но преместването на таблично пространство или какъвто и да е тип ALTER или друг DDL израз не е нормално писане. Моделът за контрол на паралелността с множество версии се разпада, когато стартирате DDL, поне за включените обекти, и започват да се случват странни неща.

Тестването на голям ход е трудно, но можете да възпроизведете тези грешки, като преминете през много малки промени и заявки. В случай, че смятате, че това е само теоретичен проблем, виждал съм тези грешки да се появяват в реалния живот, в производствена база данни.

Предупреждение:безкрайни цикли по-долу, тъй като не мога да предвидя колко време ще отнеме да възпроизведа тази грешка. Но обикновено ми отнема само десетки секунди.

--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;
/

Сесия 2 в крайна сметка ще умре с:

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

Сесия 3 няма да се провали, тя не прави заявка за променен дял. Всеки дял има свой собствен сегмент и е отделен обект, който потенциално може да „вече не съществува“.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Къде е базата данни за грешки на Oracle?

  2. проблем с функцията to_date със sysdate

  3. Lighty за Oracle

  4. php:зареждането на драйвера на oracle дава грешка Не може да се зареди динамична библиотека - Посочената процедура не може да бъде намерена.

  5. Дали xmlparserv2 от com.oracle.jdbc:ojdbc8 (v12.2.0.1) изведнъж е повреден?