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

Oracle 表空間遷移實戰:EXP/IMP 重組大表空間零資料遺失方案

     編輯:Oracle 資料庫基礎

前言

將大量資料用戶的所有表從表空間 A 遷移至表空間 B,傳統 DROP/CREATE 需備份資料、耗時極長。利用 Oracle Export/Import (EXP/IMP) 搭配 INDEXFILE、INDEXES=N、IGNORE=Y 參數,可在不導出資料檔的情況下,僅透過中繼資料腳本修改表空間子句,實現大表空間「原地重組」。本文以 db_zgxt 用戶為例,詳細記錄 5 步驟完整流程。

環境假設

  • Oracle 8.0.5 for NT
  • 來源用戶:db_zgxt
  • 來源表空間:A → 目標表空間:B
  • 匯出檔:Exp0326.dmp

步驟 1:導出用戶所有物件 (結構 + 資料)

C:\> EXP80 OWNER=db_zgxt FILE=Exp0326.dmp LOG=Exp0326.log
  • 系統提示輸入用戶名/密碼 (需 DBA 權限)
  • 產生完整匯出檔,含表、索引、約束、授權、觸發器等所有中繼資料與資料

步驟 2:刪除來源用戶所有表

-- SQL*Plus 中
SELECT 'DROP TABLE ' || table_name || ' CASCADE CONSTRAINTS;'
FROM user_tables;
  • 執行產生的 DROP 指令批次刪除
  • CASCADE CONSTRAINTS 自動刪除參考該表的外鍵約束
  • 索引、觸發器、授權隨表刪除

步驟 3:IMP INDEXFILE 產生建表腳本並修改表空間

C:\> IMP80 FULL=Y FILE=Exp0326.dmp INDEXFILE=db_zgxt.sql LOG=Imp0326_1.log
  • INDEXFILE=db_zgxt.sql:不實際導入,僅將 CREATE TABLE/INDEX 陳述式寫入腳本檔
  • 腳本特徵:
    - 所有 CREATE TABLE 以註解標記 (--)
    - 所有 CREATE INDEX 正常輸出

編輯 db_zgxt.sql

  1. 移除所有 CREATE TABLE 前的註解符號
  2. 將所有表空間名稱 A 替換為 B (含 TABLESPACE 子句、STORAGE 參數)
  3. 在所有 CREATE INDEX 前加上註解符號 (暫不建立索引)
  4. 儲存

執行修改後腳本

SQL> @db_zgxt.sql
  • 在目標表空間 B 建立所有表 (無索引、無資料)

步驟 4:導入資料 (忽略索引、忽略表已存在)

C:\> IMP80 FULL=Y FILE=Exp0326.dmp INDEXES=N IGNORE=Y LOG=Imp0326_2.log
  • INDEXES=N:不建立索引,大幅加速資料導入
  • IGNORE=Y:遇到 ORA-00955: table already exists 忽略繼續,將資料導入步驟 3 建立的表
  • 資料、NOT NULL 約束、預設值、觸發器 (若匯出含) 同步導入

步驟 5:建立索引

  1. 重新編輯 db_zgxt.sql:
    - 所有 CREATE TABLE 加註解
    - 所有 CREATE INDEX 移除註解
  2. 執行:SQL> @db_zgxt.sql
  • 索引建立可加 NOLOGGING PARALLEL 進一步加速
  • 建議建立索引前調大 SORT_AREA_SIZE

驗證清單

檢查項目指令/方法
表筆數一致SELECT COUNT(*) FROM source_table MINUS SELECT COUNT(*) FROM target_table
索引狀態 VALIDSELECT index_name, status FROM user_indexes WHERE table_name = '...'
約束啟用SELECT constraint_name, status FROM user_constraints WHERE table_name = '...'
授權完整SELECT * FROM user_tab_privs WHERE table_name = '...'
觸發器狀態SELECT trigger_name, status FROM user_triggers WHERE table_name = '...'

現代化替代方案 (10g+)

  • Data Pump (EXPDP/IMPDP):平行化、可過濾、可重映射表空間 REMAP_TABLESPACE=A:B 一指令完成
  • DBMS_REDEFINITION:線上重定義,零停機
  • ALTER TABLE MOVE TABLESPACE:單表移動,12c+ 支援 ONLINE
  • Transportable Tablespace:整表空間物理移動,極快

結語

EXP/IMP 重組表空間雖屬經典技法,但其核心思想——分離中繼資料與資料、中繼資料可編輯、資料直導目標表——至今仍是資料庫遷移的基因。理解 INDEXFILE 產生可編輯腳本、INDEXES=N 延後索引、IGNORE=Y 容忍表存在,這三個參數的組合拳,即掌握了邏輯遷移的精髓。現代環境請優先使用 Data Pump REMAP_TABLESPACE,但經典 EXP/IMP 流程仍是理解遷移本質、處理舊版本環境、應對特殊約束場景的必備基本功。

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