查询要迁移的表空间的大的表
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