ALTER TABLE p95169.order_info add PARTITION pmax VALUES LESS THAN ( MAXVALUE ) tablespace bigdata;
分区交换是Oracle提供的一种用于分区表和非分区表间迁移数据的方法,它只操作数据字典,不移动数据的物理存储,因此效率非常高。
它的语法如下:
alter table partition_tbl exchange partition with table nonpartition_tbl;注意:分区表和非分区表之间无法直接交换,必须借助一个中间表(非分区),下面看一个例子:
现在有两张表:error_order_info和error_order_info_his,这两张表是表结构一模一样的分区表,现要求把一个分区p2012从error_order_info迁移到error_order_info_his。
首先,我们需要创建一个非分区的中间表,如下所示:
SYS@PROD> create table error_order_info_temp tablespace bigdata as select * from error_order_info where rownum<1; Table created.
接着,进行两次分区交换即可。
SYS@PROD> alter table error_order_info exchange partition p2012 with table error_order_info_temp UPDATE GLOBAL INDEXES; Table altered. SYS@PROD> alter table error_order_info_his exchange partition p2012 with table error_order_info_temp UPDATE GLOBAL INDEXES; Table altered.最后,记得把中间表删除:
SYS@PROD> drop table error_order_info_temp; Table dropped.
注意:分区交换之后,分区表上的全局索引将处于UNUSABLE的状态,需要重建。
如果出现以下错误,通常是因为临时表上没有唯一索引(包含主键),需要在临时表上创建和分区表一模一样的唯一索引和主键索引。
ERROR at line 1: ORA-14130: UNIQUE constraints mismatch in ALTER TABLE EXCHANGE PARTITION
PARTITION BY RANGE (ORDERCREATEDTIME) ( ....... PARTITION P201312 VALUES LESS THAN ('20140101'), PARTITION PMAX VALUES LESS THAN (MAXVALUE) )上面是分区表error_order_info当前的分区定义,由于2014年快到了,我们需要增加2014年的分区,做如下操作:
ALTER TABLE p95169.error_order_info SPLIT PARTITION pmax at ('20140201') INTO ( PARTITION p201401, PARTITION pmax);这样操作成功后,将把原有的pmax分区分裂成新的p201401和pmax,如下所示:
PARTITION BY RANGE (ORDERCREATEDTIME) ( ....... PARTITION P201312 VALUES LESS THAN ('20140101'), PARTITION P201401 VALUES LESS THAN ('20140201'), PARTITION PMAX VALUES LESS THAN (MAXVALUE) )
alter table his.error_order_info merge partitions p201301,p2013 into partition p2013 update indexes;有两点需要注意: