ALTER TABLE schema.table_name MOVE TABLESPACE new_tablespace_name;
-- 確認目標表空間存在且有足夠空間
SELECT tablespace_name, SUM(bytes)/1024/1024 AS free_mb
FROM dba_free_space
WHERE tablespace_name = 'NEW_TBS'
GROUP BY tablespace_name;
-- 確認表狀態
SELECT table_name, tablespace_name, status, partitioned
FROM dba_tables
WHERE owner = 'SCHEMA' AND table_name = 'TABLE_NAME';
ALTER TABLE schema.table_name MOVE TABLESPACE new_tbs
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED)
NOCOMPRESS
NOLOGGING; -- 減少重做日誌,加快速度,事後需備份
MOVE 會導致所有索引變為 UNUSABLE,必須重建:
-- 查詢失效索引
SELECT index_name, status
FROM dba_indexes
WHERE table_owner = 'SCHEMA' AND table_name = 'TABLE_NAME';
-- 逐一重建(可並行)
ALTER INDEX schema.index_name REBUILD TABLESPACE index_tbs
ONLINE -- 企業版支援,不鎖表
PARALLEL 4
NOLOGGING;
-- 移動單一分區
ALTER TABLE schema.part_table MOVE PARTITION p_2024_01 TABLESPACE new_tbs
UPDATE INDEXES; -- 12c+ 自動維護全域索引,舊版需手動重建
-- 移動整張分區表(逐分區執行)
BEGIN
FOR p IN (SELECT partition_name FROM dba_tab_partitions
WHERE table_owner='SCHEMA' AND table_name='PART_TABLE')
LOOP
EXECUTE IMMEDIATE 'ALTER TABLE schema.part_table MOVE PARTITION '||
p.partition_name||' TABLESPACE new_tbs UPDATE INDEXES';
END LOOP;
END;
/
ALTER TABLE schema.lob_table MOVE TABLESPACE new_tbs
LOB (lob_col) STORE AS (TABLESPACE lob_tbs);
SELECT table_name, tablespace_name, status
FROM dba_tables
WHERE owner = 'SCHEMA' AND table_name = 'TABLE_NAME';
SELECT index_name, tablespace_name, status
FROM dba_indexes
WHERE table_owner = 'SCHEMA' AND table_name = 'TABLE_NAME';
若表極大、不可停機,使用線上重定義:
-- 1. 建立中間表(目標表空間)
CREATE TABLE schema.table_int TABLESPACE new_tbs AS
SELECT * FROM schema.table_name WHERE 1=0;
-- 2. 複製相依物件(索引、約束、授權等)
EXEC DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('SCHEMA','TABLE_NAME','TABLE_INT',
DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, errors);
-- 3. 啟動重定義
EXEC DBMS_REDEFINITION.START_REDEF_TABLE('SCHEMA','TABLE_NAME','TABLE_INT');
-- 4. 同步增量(可重複執行)
EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE('SCHEMA','TABLE_NAME','TABLE_INT');
-- 5. 完成切換(極短鎖定)
EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('SCHEMA','TABLE_NAME','TABLE_INT');
| 問題 | 原因 | 對策 |
|---|---|---|
| ORA-01502: index in unusable state | MOVE 後索引失效 | 立即 REBUILD INDEX |
| ORA-00054: resource busy | 表被鎖定 | 離峰執行 / 使用 ONLINE REBUILD / DBMS_REDEFINITION |
| 表空間不足 | 目標 TBS 餘裕不夠 | 擴充表空間 / 添加資料檔 |
| LOB 未移動 | 未指定 LOB 子句 | 加上 LOB (col) STORE AS (TABLESPACE ...) |
ALTER TABLE MOVE TABLESPACE 是離線遷移的標準指令,**必搭配索引重建**。生產環境大表請評估停機窗口,若不可停機請採用 DBMS_REDEFINITION 線上重定義。操作前務必完整備份,操作後驗證表/索引狀態與段大小。