2013-03-20 25 views
1

正如標題所說:在訪問它時正在移動(不重命名)表/分區會對訪問它的任何查詢產生負面影響?將表/分區移動到不同的表空間中斷是否查詢訪問所述表/分區?

例如,說有一個長期運行SELECT COUNT(*) FROM some_table
如果我是ALTER TABLE some_table MOVE TABLESPACE some_other_tablespaceSELECT會失敗嗎?
它會完成,但有不正確的結果嗎?也許完全是另一回事?

我能找到的唯一信息是將表移動到不同的表空間需要在某些情況下重建索引,但是沒有提到任何活動查詢會發生什麼。

+0

在一個側面說明,將其後果是用於移動單個分區VS移動整個不同(未分區)表? – 2013-03-20 18:31:41

+0

http://docs.oracle.com/cd/E11882_01/server.112/e25494/tables006.htm#i1106606 - 「在執行語句時,ALTER TABLE ... MOVE語句不允許DML針對表。」我相信如果桌面上有活動,這種舉動甚至不會在正常情況下開始。直接路徑操作可能會減少有趣的東西。 (物聯網可以在線移動,可能有一些限制) – Mat 2013-03-20 19:57:34

回答

2

它可能會因爲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也不會失敗,不查詢的改變的分區。每個分區都有其自己的段,並且是一個單獨的對象,可能「不再存在」。

+0

非常感謝您的回覆。這不是我所希望的答案,但這是一個很好的答案。在網站上注意:如果我要移動一個表的分區,可能會發生類似的錯誤嗎? – 2013-03-20 20:02:13

+0

@GigaWatt我相信如此,但是當我使用分區時,我還無法重現這個錯誤。我的簡單示例不會引發錯誤 - 可能是因爲分區緩存數據的方式不同?我會盡力重現錯誤,稍後再回復。 – 2013-03-21 05:41:30

+1

@GigaWatt我用更具體的分區示例更新了我的答案。分區和非分區都可能失敗。出於某種原因,我不明白,分區版本往往需要更長的時間才能失敗。但我不會依賴這種行爲,在我的環境中可能只是運氣不好。 – 2013-03-21 18:37:10

0

分區移動將導致DML失敗,如果它正在訪問parition。

我剛剛證明了這一點: - /。

我正在做一個大的刪除,並試圖移動一個分區(改變表移動分區)。
我收到的錯誤是: ORA-12801:並行地查詢服務器P004ORA-08103信號通知錯誤:對象不再存在