業務增長導致表空間不足或性能下降時,需將表遷移至新表空間。本文以 Oracle 8.0.5 為例,演示利用 EXP/IMP 導出導入工具,結合 INDEXFILE 參數修改 DDL,實現用戶 db_zgxt 下所有表從表空間 A 遷移至 B 的完整流程。
-- DOS 控制台
EXP80 OWNER=db_zgxt FILE=Exp0326.DMP LOG=Exp0326.LOG
系統提示輸入用戶名/口令後,生成完整導出文件。
-- SQL*Plus 批量生成 DROP 語句
SELECT 'DROP TABLE ' || table_name || ';' FROM user_tables;
將輸出腳本保存並執行,清空原表空間對象。
-- 僅生成 DDL 至文件,不導入數據
IMP80 FULL=Y FILE=Exp0326.DMP INDEXFILE=db_zgxt.SQL LOG=Imp0326_1.LOG
編輯 db_zgxt.sql:
CREATE TABLE 註釋符 (--);A 替換為 B;CREATE INDEX 語句加上註釋 (--) 暫緩建索引。在 SQL*Plus 執行修改後腳本,表在表空間 B 中創建完成。
IMP80 FULL=Y FILE=Exp0326.DMP INDEXES=N IGNORE=Y LOG=Imp0326_2.LOG
INDEXES=N:不創建索引,加速數據導入IGNORE=Y:忽略 "table already exists" 錯誤,直接裝載數據再次編輯 db_zgxt.sql:
CREATE TABLE;CREATE INDEX 註釋;執行腳本,索引在表空間 B 中構建完成。
| 參數 | 作用 | 本案例值 |
|---|---|---|
| OWNER | 導出指定用戶對象 | db_zgxt |
| INDEXFILE | 導出 DDL 至文件,不執行 | db_zgxt.sql |
| INDEXES=N | 導入時跳過索引創建 | N |
| IGNORE=Y | 忽略對象已存在錯誤 | Y |
REMAP_TABLESPACE 直接重映射,無需手工改腳本。經典 EXP/IMP + INDEXFILE 修改法雖繁瑣,但邏輯清晰、版本兼容性強,適合無法停機使用 Data Pump 的舊版本環境。核心思想:導出結構→修改表空間→建表→導數據→建索引,五步走穩健遷移。