sql >> Databáze >  >> RDS >> Oracle

Přeruší přesun tabulky/oddílu do jiného tabulkového prostoru dotazy přistupující k uvedené tabulce/oddílu?

Může selhat s ORA-08103: object no longer exists .

V Oracle se čtenáři a autoři navzájem neblokují. Což znamená, že DML a dotazy se nebudou vzájemně ovlivňovat, s výjimkou několika podivných případů, jako je nedostatek místa UNDO. Ale přesun tabulkového prostoru nebo jakéhokoli typu ALTER nebo jiného příkazu DDL není normální zápis. Multiverzní model řízení souběžnosti se při spuštění DDL rozpadne, alespoň pro zúčastněné objekty, a začnou se dít divné věci.

Testování velkého přesunu je obtížné, ale tyto chyby můžete reprodukovat procházením mnoha malých změn a dotazů. V případě, že si myslíte, že se jedná pouze o teoretický problém, viděl jsem, jak se tyto chyby vyskytovaly v reálném životě v produkční databázi.

Upozornění:nekonečné smyčky níže, protože nemohu předpovědět, jak dlouho bude trvat reprodukce této chyby. Ale obvykle mi to trvá jen desítky 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;
/

Relace 2 nakonec zemře s:

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

Relace 3 se nezdaří, nedotazuje se na změněný oddíl. Každý oddíl má svůj vlastní segment a je samostatným objektem, který může potenciálně „již existovat“.



  1. mysql TIME_WAIT; příliš mnoho problémů s připojením

  2. Oracle:Načíst pomocí TZNAME Je to možné?

  3. MySql:jak vytvořit poddotaz a spočítat všechny řádky, kde je id stejné, ve dvou tabulkách

  4. Jak nakonfigurovat vlastní MySQL NHibernate Batcher?