2016-10-04 102 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