2016-10-04 41 views
1

我想使用EXCHANGE PARTITION對錶a1_crm_query進行備份。此表格包含具有不同狀態的行,如'錯誤','新'或'完成',如果將有另一個表(a1_crm_query_LOG),狀態爲'錯誤'和'完成',但我的第一個表(a1_crm_query )將只用'新'。所有的SQL使用EXCHANGE PARTITION創建備份表

首先創建我的表:

CREATE TABLE ma_user.a1_crm_query (
     ID NUMBER PRIMARY KEY, 
     DATA VARCHAR2(200) 

    ); 

然後,我創建第二個表分區。

CREATE TABLE ma_user.a1_crm_query_LOG (
     ID NUMBER PRIMARY KEY, 
     DATA VARCHAR2(200) 
    ) 
    PARTITION BY LIST (DATA) (
     PARTITION DONE_STATUS VALUES ('DONE'),  
     PARTITION ERROR_STATUS VALUES ('ERROR') 
     ) ; 

然後將值插入a1_crm_query

INSERT INTO ma_user.a1_crm_query SELECT 1 , CAST('NEW' AS VARCHAR2(200)) FROM dual; 
INSERT INTO ma_user.a1_crm_query SELECT 2 , CAST('DONE' AS VARCHAR2(200)) FROM dual; 
INSERT INTO ma_user.a1_crm_query SELECT 3, CAST('ERROR' AS VARCHAR2(200)) FROM dual; 

現在我想建立日常的過程,應當與「完成」和「錯誤」將所有行插入表a1_crm_query_LOGa1_crm_query應該只有以'新'。

我嘗試使用exchange partition

ALTER TABLE ma_user.a1_crm_query_LOG EXCHANGE PARTITION ERROR_STATUS WITH TABLE ma_user.a1_crm_query WITHOUT VALIDATION; 
ALTER TABLE ma_user.a1_crm_query_LOG EXCHANGE PARTITION DONE_STATUS WITH TABLE ma_user.a1_crm_query WITHOUT VALIDATION; 

但這ERROR_STATUS分區後,包含所有狀態的所有行。

回答

1

您可能希望創建兩個臨時表(temp_error,temp_done),其中包含從a1_crm_query表複製的ERROR和DONE數據,然後與表temp_error和temp_done交換分區。

您面臨的問題是由於WITHOUT VALIDATION。本質上,你告訴Oracle我已經驗證了所交換的數據,所以Oracle不會爲你驗證它。

this link

更新:方法1所以這是我會做什麼。

CREATE TABLE TEMP_ERROR 
(  ID NUMBER PRIMARY KEY, 
     DATA VARCHAR2(200)); 

CREATE TABLE TEMP_DONE 
(
    ID NUMBER PRIMARY KEY, 
    DATA VARCHAR2(200)); 

insert into TEMP_ERROR 
select * from a1_crm_query 
where data = 'ERROR'; 

insert into TEMP_DONE 
select * from a1_crm_query 
where data = 'DONE'; 

ALTER TABLE a1_crm_query_LOG EXCHANGE PARTITION ERROR_STATUS WITH TABLE TEMP_ERROR WITHOUT VALIDATION; 

ALTER TABLE a1_crm_query_LOG EXCHANGE PARTITION DONE_STATUS WITH TABLE TEMP_DONE WITHOUT VALIDATION; 

truncate table temp_error; 
truncate table temp_done 

更新2:方法2如果你能a1_crm_query劃分爲好,那麼這種方法可能最適合您。你需要一張臨時表。此方法不需要刪除或截斷。

CREATE TABLE a1_crm_query (
    ID NUMBER PRIMARY KEY, 
    DATA VARCHAR2(200) 

) 
    PARTITION BY LIST (DATA) (
    PARTITION DONE_STATUS VALUES ('DONE'),  
    PARTITION ERROR_STATUS VALUES ('ERROR'), 
    PARTITION OTHER_STATUS VALUES (DEFAULT) 
    ) ; 

CREATE TABLE a1_crm_query_LOG (
    ID NUMBER PRIMARY KEY, 
    DATA VARCHAR2(200) 
) 
PARTITION BY LIST (DATA) (
    PARTITION DONE_STATUS VALUES ('DONE'),  
    PARTITION ERROR_STATUS VALUES ('ERROR') 
    ) ; 


INSERT INTO a1_crm_query SELECT 1 , 'NEW' FROM dual; 
INSERT INTO a1_crm_query SELECT 2 , 'DONE' FROM dual; 
INSERT INTO a1_crm_query SELECT 3, 'ERROR' FROM dual; 
commit;  

CREATE TABLE interim 
(  ID NUMBER PRIMARY KEY, 
     DATA VARCHAR2(200)); 



ALTER TABLE a1_crm_query EXCHANGE PARTITION ERROR_STATUS WITH TABLE INTERIM WITHOUT VALIDATION; 
ALTER TABLE a1_crm_query_LOG EXCHANGE PARTITION ERROR_STATUS WITH TABLE INTERIM WITHOUT VALIDATION; 

ALTER TABLE a1_crm_query EXCHANGE PARTITION DONE_STATUS WITH TABLE INTERIM WITHOUT VALIDATION; 
ALTER TABLE a1_crm_query_LOG EXCHANGE PARTITION DONE_STATUS WITH TABLE INTERIM WITHOUT VALIDATION; 

然後,必須重建對a1_crm_query

ALTER INDEX <index name> REBUILD; 

select * from a1_crm_query; 
select * from interim; 
select * from a1_crm_query_LOG partition(ERROR_STATUS); 
select * from a1_crm_query_LOG partition(done_STATUS) 

索引另請參見this link

+0

嗨,秋生!我應該只使用一個應該包含這兩種狀態的_log表。我無法趕上爲什麼移動所有行包括'新' – Jdzel

+0

@Jedzel結帳我的更新。 –

+0

Akio,謝謝,它工作,但表a1_crm_query仍然有'錯誤'和'完成'的行。坦率地說,我沒有看到這種方法的優點。我認爲EXCHANGE PARTITION應該替換INSERT-DELETE操作 – Jdzel