12c在线移动表

在12.2当中,ALTER TABLE...MOVE [PARTITION|SUBPARTITION]语法可以移动表、分区、子分区用于改变任何的物理存储属性,比如是否压缩、更改表空间等等。

ALTER TABLE...MOVE语句可以支持ONLINE关键字,这样就能让在move的过程中也能支持DML的操作,基本语法如下:

  • ALTER TABLE … MOVE … ONLINE
  • ALTER TABLE … MOVE PARTITION … ONLINE
  • ALTER TABLE … MOVE SUBPARTITION … ONLINE

移动表会改变表的rowid,如果使用了ONLINEUPDATE INDEXES,那么索引在移动过程中都是可用状态。如果使用了UPDATE INDEXES但是没有ONLINE,则会在move操作完成时索引立刻生效。UPDATE INDEXES改变表的全局索引的存储属性或者表全局分区索引的索引分区存储属性。如果没有使用UPDATE INDEXES,则索引会失效,必须drop掉或者rebuild,否则语句在用到这个索引时就会报错。

同时move操作会导致统计信息失效,所以做完move操作以后,需要对表和索引重新收集统计信息。

举几个例子来说明如何在线move表、分区等

move表

xb@PDB12C> create tablespace tbs1 datafile size 10m autoextend on maxsize 100m;

Tablespace created.

xb@PDB12C> create tablespace tbs2 datafile size 10m autoextend on maxsize 100m;

Tablespace created.

drop table t1 purge;

create table t1 (id number,name varchar2(20)) tablespace tbs1;

insert into t1 
select level,'name:'||level from dual
connect by level<=1000;

commit;

create index idx_t1 on t1(id);

xb@PDB12C> exec dbms_stats.gather_table_stats(user,'t1');

PL/SQL procedure successfully completed.

在线移动表至新表空间

xb@PDB12C> alter table t1 move online tablespace tbs2;

Table altered.

在线移动表并更新索引

alter table t1 move online compress tablespace tbs1 
    update indexes (idx_t1 tablespace tbs2);

Table altered.

更改表空间的时候这些表空间必须提前存在。

move分区

移动单个分区

alter table t1 modify 
partition by range(id) interval (200)
(partition p1 values less than (200),
partition p2 values less than (400));

xb@PDB12C> alter table t1 move partition p1 row store compress advanced update indexes online;

Table altered.

限制条件

在线移动表有一些限制条件如下:

  • 不能将move语句与其他语句合并使用
  • 不能用于分区索引组织表
  • 不能用于含有域索引的表
  • 并发DML语句或直接路径INSERT操作会对表上排他锁,因此这次操作无法与在线表移动同时进行
  • 不适用于包含任何LOB、数组、oracle提供的type或自定义type的索引组织表

发表评论