1.查看表空間里面的對象
SELECT OWNER AS OWNER, SEGMENT_NAME AS SEGMENT_NAME, SEGMENT_TYPE AS SEGMENT_TYPE, SUM (BYTES) / 1024 / 1024 AS SEGMENT_SIZE FROM DBA_SEGMENTS WHERE TABLESPACE_NAME = 'TBS' GROUP BY OWNER, SEGMENT_NAME, SEGMENT_TYPE;
2.里面的普通表按照如下move到新表空間中
move后索引會應為rowid的改變而失效,因此需要重建
alter table owner.tablename move tablespace ntbs; alter index owner.ix_tablename_id rebuild tablespace ntbs online;
3.里面如果是分區表,按如下move分區到新分區
SELECT 'ALTER TABLE ' || table_owner || '.' || TABLE_NAME || ' MOVE PARTITION ' || PARTITION_NAME || ' TABLESPACE NTBS;' FROM DBA_TAB_PARTITIONS WHERE TABLE_OWNER = 'OWNER' AND TABLE_NAME = 'TABLE_NAMES';
如果這個表是自動分區的,修改新增分區默認表空間
SELECT 'alter table ' || owner || '.' || table_name || ' modify default attributes tablespace NTBLS;' FROM DBA_TABLES WHERE OWNER = 'OWNER' AND TABLE_NAME = 'TABLE_NAME';
4.里面如果是普通索引,按如下重建索引
alter index owner.tablename REBUILD TABLESPACE NTBS ONLINE;
如果online遇到如下錯誤
-
第 1 行出現錯誤:
-
ORA -00604: 遞歸 SQL 級別 1 出現錯誤
-
ORA -01450: 超出最大的關鍵字長度 (3215)
那么不加online即可(oracle規定一個數據塊中至少存放一個索引節點,詳細可參考https://blog.csdn.net/yidian815/article/details/16336911)
5.例如如果是分區索引,按如下重建索引
SELECT 'ALTER INDEX ' || index_owner || '.' || index_name || ' REBUILD PARTITION ' || PARTITION_NAME || ' TABLESPACE NTBS ONLINE;' FROM DBA_ind_PARTITIONS WHERE index_owner = 'index_owner' AND INDEX_NAME = 'index_name';
如果分區為自增分區,修改分區索引的默認表空間
SELECT 'ALTER INDEX ' || owner || '.' || index_name || ' modify default attributes tablespace ntbs;' FROM dba_indexes WHERE OWNER = 'index_owner' AND INDEX_NAME = 'index_name';
