首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 表空間遷移實戰:利用 EXP/IMP 重組表大小與存儲結構

     編輯:Oracle 資料庫基礎

前言

業務增長導致表空間不足或性能下降時,需將表遷移至新表空間。本文以 Oracle 8.0.5 為例,演示利用 EXP/IMP 導出導入工具,結合 INDEXFILE 參數修改 DDL,實現用戶 db_zgxt 下所有表從表空間 A 遷移至 B 的完整流程。

遷移全流程 5 步法

步驟 1:導出所有表數據與結構

-- DOS 控制台
EXP80 OWNER=db_zgxt FILE=Exp0326.DMP LOG=Exp0326.LOG

系統提示輸入用戶名/口令後,生成完整導出文件。

步驟 2:刪除原有表 (釋放空間)

-- SQL*Plus 批量生成 DROP 語句
SELECT 'DROP TABLE ' || table_name || ';' FROM user_tables;

將輸出腳本保存並執行,清空原表空間對象。

步驟 3:生成並修改建表腳本 (關鍵步驟)

-- 僅生成 DDL 至文件,不導入數據
IMP80 FULL=Y FILE=Exp0326.DMP INDEXFILE=db_zgxt.SQL LOG=Imp0326_1.LOG

編輯 db_zgxt.sql:

  1. 去除所有 CREATE TABLE 註釋符 (--);
  2. 將所有表空間名 A 替換為 B;
  3. 給所有 CREATE INDEX 語句加上註釋 (--) 暫緩建索引。

在 SQL*Plus 執行修改後腳本,表在表空間 B 中創建完成。

步驟 4:導入數據 (跳過索引、忽略表已存在)

IMP80 FULL=Y FILE=Exp0326.DMP INDEXES=N IGNORE=Y LOG=Imp0326_2.LOG
  • INDEXES=N:不創建索引,加速數據導入
  • IGNORE=Y:忽略 "table already exists" 錯誤,直接裝載數據

步驟 5:重建索引

再次編輯 db_zgxt.sql:

  1. 註釋所有 CREATE TABLE;
  2. 取消 CREATE INDEX 註釋;

執行腳本,索引在表空間 B 中構建完成。

關鍵參數速查表

參數作用本案例值
OWNER導出指定用戶對象db_zgxt
INDEXFILE導出 DDL 至文件,不執行db_zgxt.sql
INDEXES=N導入時跳過索引創建N
IGNORE=Y忽略對象已存在錯誤Y

現代替代方案提示 (10g+)

  • Data Pump (EXPDP/IMPDP):並行度高、支持網絡導入、可 REMAP_TABLESPACE 直接重映射,無需手工改腳本。
  • ALTER TABLE MOVE TABLESPACE:單表遷移首選,ONLINE 移動 (12.2+) 業務零中斷。
  • DBMS_REDEFINITION:大表重定義,支持分區、索引、約束同步遷移。

總結

經典 EXP/IMP + INDEXFILE 修改法雖繁瑣,但邏輯清晰、版本兼容性強,適合無法停機使用 Data Pump 的舊版本環境。核心思想:導出結構→修改表空間→建表→導數據→建索引,五步走穩健遷移。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved