Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Akankah memindahkan tabel/partisi ke tablespace yang berbeda akan mengganggu kueri yang mengakses tabel/partisi tersebut?

Mungkin gagal dengan ORA-08103: object no longer exists .

Di Oracle, pembaca dan penulis tidak saling memblokir. Yang berarti DML dan kueri tidak akan saling mengganggu, kecuali beberapa kasus aneh seperti kehabisan ruang UNDO. Tetapi memindahkan tablespace, atau jenis ALTER atau pernyataan DDL lainnya, bukanlah penulisan normal. Model kontrol konkurensi multiversi rusak saat Anda menjalankan DDL, setidaknya untuk objek yang terlibat, dan hal-hal aneh mulai terjadi.

Menguji langkah besar itu sulit, tetapi Anda dapat mereproduksi kesalahan ini dengan mengulang banyak perubahan dan kueri kecil. Jika Anda berpikir ini hanya masalah teoretis, saya telah melihat kesalahan ini terjadi dalam kehidupan nyata, pada basis data produksi.

Peringatan:loop tak terbatas di bawah ini karena saya tidak dapat memprediksi berapa lama waktu yang diperlukan untuk mereproduksi kesalahan ini. Tapi biasanya hanya membutuhkan waktu puluhan detik.

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

Sesi 2 akhirnya akan mati dengan:

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

Sesi 3 tidak akan gagal, itu tidak menanyakan partisi yang diubah. Setiap partisi memiliki segmennya sendiri, dan merupakan objek terpisah yang berpotensi "tidak ada lagi".



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Baris SQL menjadi Kolom

  2. Java tidak menjalankan pernyataan persiapan dengan parameter

  3. Kelompokkan dengan menyebabkan peningkatan besar dalam waktu eksekusi kueri

  4. Mengubah presisi kolom numerik di Oracle

  5. Bagaimana cara menjalankan prosedur pribadi dalam paket Oracle?