sql >> Database >  >> RDS >> Oracle

Zal het verplaatsen van een tabel/partitie naar een andere tablespace query's onderbreken die toegang hebben tot die tabel/partitie?

Het kan mislukken met ORA-08103: object no longer exists .

In Oracle blokkeren lezers en schrijvers elkaar niet. Dat betekent dat DML en query's elkaar niet zullen hinderen, met uitzondering van een paar rare gevallen, zoals onvoldoende UNDO-ruimte. Maar het verplaatsen van een tablespace, of elk type ALTER of ander DDL-statement, is geen normaal schrijven. Het gelijktijdigheidscontrolemodel voor meerdere versies valt uit elkaar wanneer u DDL uitvoert, in ieder geval voor de betrokken objecten, en er gebeuren rare dingen.

Het testen van een grote zet is moeilijk, maar u kunt deze fouten reproduceren door een groot aantal kleine wijzigingen en query's te doorlopen. Voor het geval je denkt dat dit slechts een theoretisch probleem is, ik heb deze fouten in het echt zien voorkomen, in een productiedatabase.

Waarschuwing:oneindige lussen hieronder, omdat ik niet kan voorspellen hoe lang het duurt om deze fout te reproduceren. Maar het kost me meestal maar tientallen seconden.

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

Sessie 2 zal uiteindelijk sterven met:

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

Sessie 3 zal niet mislukken, het vraagt ​​niet om een ​​gewijzigde partitie. Elke partitie heeft zijn eigen segment en is een afzonderlijk object dat mogelijk "niet meer bestaat".



  1. Wijzig de mysql-tijdzone van phpMyAdmin

  2. Query voor element van array in JSON-kolom

  3. MySQL JOIN met SUM en 3 tabellen

  4. SQL-verzoek om te zien of een periode volledig is gedekt