它可能會因爲ORA-08103: object no longer exists
而失敗。
在Oracle中,讀者和作者不會互相阻塞。這意味着DML和查詢不會互相干擾,不包括一些奇怪的情況,如耗盡UNDO空間。但移動表空間或任何類型的ALTER或其他DDL語句不是正常的寫操作。在運行DDL時,多版本併發控制模型崩潰了,至少對於涉及的對象而言,奇怪的事情開始發生。
測試大動作很困難,但您可以通過循環很多小的改動和查詢來重現這些錯誤。如果您認爲這只是一個理論問題,我已經看到這些錯誤在現實生活中發生在生產數據庫中。
警告:以下無限循環,因爲我無法預測重現此錯誤需要多長時間。但它通常只需要我幾十秒。
--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;
/
會話2將最終與死:
ORA-08103: object no longer exists
ORA-06512: at line 6
會話3也不會失敗,不查詢的改變的分區。每個分區都有其自己的段,並且是一個單獨的對象,可能「不再存在」。
在一個側面說明,將其後果是用於移動單個分區VS移動整個不同(未分區)表? – 2013-03-20 18:31:41
http://docs.oracle.com/cd/E11882_01/server.112/e25494/tables006.htm#i1106606 - 「在執行語句時,ALTER TABLE ... MOVE語句不允許DML針對表。」我相信如果桌面上有活動,這種舉動甚至不會在正常情況下開始。直接路徑操作可能會減少有趣的東西。 (物聯網可以在線移動,可能有一些限制) – Mat 2013-03-20 19:57:34