Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Việc di chuyển một bảng / phân vùng sang một vùng bảng khác có làm gián đoạn các truy vấn truy cập vào bảng / phân vùng đó không?

Nó có thể không thành công với ORA-08103: object no longer exists .

Trong Oracle, người đọc và người viết không chặn lẫn nhau. Có nghĩa là DML và các truy vấn sẽ không can thiệp vào nhau, loại trừ một số trường hợp kỳ lạ như hết dung lượng UNDO. Nhưng việc di chuyển một vùng bảng, hoặc bất kỳ loại ALTER hoặc câu lệnh DDL nào khác, không phải là một hành động ghi bình thường. Mô hình điều khiển đồng thời đa vũ trụ bị phá vỡ khi bạn chạy DDL, ít nhất là đối với các đối tượng liên quan và những điều kỳ lạ bắt đầu xảy ra.

Việc kiểm tra một bước di chuyển lớn là rất khó, nhưng bạn có thể tái tạo những lỗi này bằng cách lặp lại nhiều thay đổi và truy vấn nhỏ. Trong trường hợp bạn nghĩ đây chỉ là vấn đề lý thuyết, tôi đã thấy những lỗi này xảy ra trong thực tế, trên cơ sở dữ liệu sản xuất.

Cảnh báo:vòng lặp vô hạn bên dưới vì tôi không thể dự đoán được sẽ mất bao lâu để tạo lại lỗi này. Nhưng tôi thường chỉ mất vài chục giây.

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

Phiên 2 cuối cùng sẽ kết thúc với:

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

Phiên 3 sẽ không thất bại, nó không truy vấn một phân vùng đã thay đổi. Mỗi phân vùng có phân đoạn riêng và là một đối tượng riêng biệt có thể "không còn tồn tại".



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách hiệu quả nhất để kiểm tra xem một bản ghi có tồn tại trong Oracle không?

  2. Làm thế nào để gọi một proc được lưu trữ từ bao phấn và sửa đổi con trỏ được trả về?

  3. Xóa các số được tìm thấy trong cột chuỗi

  4. Đánh dấu cú pháp trong trình duyệt Oracle giống như SQL Server Management Studio

  5. Kiểm tra xem hàng có tồn tại không