查询要迁移的表空间的大的表

SET LINESIZE 720; 
SET PAGESIZE 300; 
COL OWNER FOR A16; 
COL SEGMENT_TYPE FOR A20; 
COL SEGMENT_NAME FOR A38; 
COL TABLESPACE_NAME FOR A20; 

SELECT *  
FROM   (SELECT OWNER, 
               SEGMENT_TYPE, 
               SEGMENT_NAME, 
               ROUND(SUM(BYTES) / 1024 / 1024/1024,2) TOTAL_SIZE_GB,  
               TABLESPACE_NAME 
        FROM   DBA_SEGMENTS 
        WHERE  TABLESPACE_NAME =UPPER('&TABLESPACE_NAME') 
        GROUP  BY OWNER, 
                  SEGMENT_TYPE, 
                  SEGMENT_NAME, 
                  TABLESPACE_NAME 
        ORDER  BY TOTAL_SIZE_GB DESC)  
WHERE  ROWNUM <= 200;

查询表是否为分区索引:

set linesize 250
col TABLE_OWNER for a30
col TABLE_NAME for a30
col PARTITION_NAME for a50SELECT TABLE_OWNER,TABLE_NAME,PARTITION_NAME FROM DBA_TAB_PARTITIONS WHERE TABLE_NAME = 'XXXXXX';

查询是否有lob字段

col OWNER for a15
col SEGMENT_NAME for a30
col TABLE_NAME for a20
col COLUMN_NAME for a20
col TABLESPACE_NAME for a30
SELECT OWNER,TABLE_NAME,COLUMN_NAME,SEGMENT_NAME,TABLESPACE_NAME from dba_lobs WHERE OWNER='TEST2024_1' and TABLE_NAME='T';

没有lob字段,如果有的话,需要单独进行迁移

select 'alter table '||t1.TABLE_OWNER||'.'||t1.TABLE_NAME||' move partition ' || t1.PARTITION_NAME || ' lob(' || t2.COLUMN_NAME ||') store as (tablespace test);' from DBA_TAB_PARTITIONS t1,dba_lobs t2 where  t1.TABLE_OWNER=t2.OWNER and t1.TABLE_NAME=t2.TABLE_NAME and  t1.TABLE_OWNER='TEST2024_1' and t1.TABLE_NAME='T';

移动表

select 'alter table '||TABLE_OWNER||'.'||TABLE_NAME||' move partition ' || PARTITION_NAME || ' tablespace test PARALLEL 4;'from DBA_TAB_PARTITIONS where  TABLE_OWNER='TEST2024_1' and TABLE_NAME='T';

12c后可以在线迁移表并重建索引,不影响业务,但是会造成大量的redo和资源消耗(根据迁移数据的大小)

select 'alter table '||t1.TABLE_OWNER||'.'||t1.TABLE_NAME||' move subpartition ' || t1.SUBPARTITION_NAME || ' tablespace XXXX  ONLINE UPDATE INDEXES parallel 30;' from dba_tab_subpartitions t1 where t1.TABLE_OWNER='XXXX' and t1.TABLE_NAME='XXXX';

关于Online 和 UPDATE INDEXES 的作用:

移动表格会更改表格中行的rowids。 如果移动一个表并包含ONLINE关键字和UPDATE INDEXES子句,则索引在移动操作期间仍然可用。 如果包含UPDATE INDEXES子句,但不包含ONLINE关键字,则索引在移动操作后立即可用。 UPDATE INDEXES子句只能更改该表上全局索引的存储属性,或者该表上任何全局分区索引的索引分区的存储属性。 如果不包含UPDATE INDEXES子句,则对rowids的更改会导致表上的索引被标记为不可用,并且使用这些索引访问表的DML会收到ORA-01502错误。 在这种情况下,必须删除或重建表上的索引。

移动后索引会失效,需要rebuilt

移动索引

select 'alter index '||OWNER||'.'||index_NAME||' rebuild tablespace test parallel 4;' from dba_indexes where  OWNER='TEST2024_1' and TABLE_NAME='T';

索引rebuilt后需要取消索引并行

取消并行

select 'alter index '||OWNER||'.'||index_NAME||' noparallel;' from dba_indexes where  OWNER='TEST2024_1' and TABLE_NAME='T';
alter index TEST2024_1.IDX_ID noparallel;

查询索引状态和并行度

col OWNER for a15
col index_NAME for a30
SELECT OWNER,index_NAME,status,degree FROM dba_indexes WHERE OWNER='TEST2024_1' and TABLE_NAME='T';

需要注意的是,迁移过程中会产生大量的归档,需要提前和备份的确认好,做好增量备份,然后进行手动的删除归档,避免影响业务或者产生gap