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,如果使用了ONLINE
和UPDATE INDEXES
,那么索引在移动过程中都是可用状态。如果使用了UPDATE INDEXES
但是没有ONLINE
,则会在move操作完成时索引立刻生效。UPDATE INDEXES
改变表的全局索引的存储属性或者表全局分区索引的索引分区存储属性。如果没有使用UPDATE INDEXES
,则索引会失效,必须drop掉或者rebuild,否则语句在用到这个索引时就会报错。
同时move操作会导致统计信息失效,所以做完move操作以后,需要对表和索引重新收集统计信息。
举几个例子来说明如何在线move表、分区等
move表
1 | xb@PDB12C> create tablespace tbs1 datafile size 10m autoextend on maxsize 100m; |
在线移动表至新表空间
1 | xb@PDB12C> alter table t1 move online tablespace tbs2; |
在线移动表并更新索引
1 | alter table t1 move online compress tablespace tbs1 |
更改表空间的时候这些表空间必须提前存在。
move分区
移动单个分区
1 | alter table t1 modify |
限制条件
在线移动表有一些限制条件如下:
- 不能将move语句与其他语句合并使用
- 不能用于分区索引组织表
- 不能用于含有域索引的表
- 并发DML语句或直接路径INSERT操作会对表上排他锁,因此这次操作无法与在线表移动同时进行
- 不适用于包含任何LOB、数组、oracle提供的type或自定义type的索引组织表
12c在线移动表
https://www.xbdba.com/2019/03/13/12c-move-table-online/