sql >> Database teknologi >  >> RDS >> Oracle

Vil flytning af en tabel/partition til et andet tablespace afbryde forespørgsler, der får adgang til nævnte tabel/partition?

Det kan mislykkes med ORA-08103: object no longer exists .

I Oracle blokerer læsere og forfattere ikke hinanden. Hvilket betyder, at DML og forespørgsler ikke vil forstyrre hinanden, med undtagelse af nogle få mærkelige tilfælde som at løbe tør for UNDO-plads. Men at flytte et tablespace eller enhver form for ALTER eller anden DDL-sætning er ikke en normal skrivning. Multiversions samtidighedskontrolmodellen går i stykker, når du kører DDL, i det mindste for de involverede objekter, og mærkelige ting begynder at ske.

Det er svært at teste et stort træk, men du kan genskabe disse fejl ved at gennemgå en masse små ændringer og forespørgsler. Hvis du tror, ​​at dette kun er et teoretisk problem, har jeg set disse fejl opstå i det virkelige liv i en produktionsdatabase.

Advarsel:uendelige loops nedenfor, da jeg ikke kan forudsige, hvor lang tid det vil tage at genskabe denne fejl. Men det tager mig normalt kun snesevis af sekunder.

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

Session 2 vil til sidst dø med:

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

Session 3 vil ikke mislykkes, den forespørger ikke på en ændret partition. Hver partition har sit eget segment, og er et separat objekt, der potentielt "ikke længere kan eksistere".



  1. Hvordan sender man GAMLE, NYE og identifikatorer til EXECUTE i en triggerfunktion?

  2. org.hibernate.MappingException:Ingen dialekttilknytning for JDBC-type:2002

  3. MySQL-lagret procedure forårsagede 'Kommandoer ude af synkronisering'

  4. Forårstransaktion og rollback på flere borde