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

Oracle EXP/IMP 跨平台遷移實戰:按用戶導出導入、表空間預建、Session 殺除、Schema 重映射全流程

     編輯:Oracle 資料庫基礎

將 Windows Server A 上 TEST1 Schema 遷移至 Linux Server B 的 TEST2 Schema,涉及跨平台、跨 Schema、表空間映射、權限重建、Session 清理等多環節。本文提供經驗證的標準化操作手冊,從導出、表空間對照、目標端預建、導入參數、驗證,全鏈路無遺漏。

場景與前置條件

  • 源端:Windows、Oracle 10g、User TEST1 (密碼 TEST1PASSWD 或用 SYSTEM 導出)。
  • 目標端:Linux、Oracle 10g、User TEST2 (可能存在/不存在)。
  • 工具:傳統 exp/imp (非 Data Pump),適用 10g/11g 混合環境。

步驟 1:源端導出 (按 Owner 導出所有對象)

# Windows CMD
exp TEST1/TEST1PASSWD OWNER=TEST1 FILE=D:\files\TEST1.dmp LOG=D:\files\TEST1_exp.log

關鍵: OWNER=TEST1 包含表、索引、視圖、序列、同義詞、包、觸發器、授權等所有對象。COMPRESS=Y 可合併 Extent (導入時生效)。

步驟 2:源端收集表空間資訊 (目標端預建依據)

-- 1. 默認表空間
SELECT username, default_tablespace FROM dba_users WHERE username = 'TEST1';
-- RESULT: TEST1  CMIS

-- 2. 實際使用表空間
SELECT DISTINCT owner, tablespace_name FROM dba_extents WHERE owner = 'TEST1';
-- RESULT: TEST1  XSL
--         TEST1  CMIS

-- 3. 表空間對應資料檔與大小
SELECT file_name, bytes, tablespace_name FROM dba_data_files
WHERE tablespace_name IN ('CMIS','XSL');

記錄每個 Tablespace 總大小、檔案路徑、Autoextend 狀態,目標端按需創建 (可合併小檔、調整大小、啟用 ASSM)。

步驟 3:目標端預建表空間

CREATE TABLESPACE xsl LOGGING
  DATAFILE '/opt/oracle/oradata/xsl.dbf' SIZE 15000M EXTENT MANAGEMENT LOCAL;

CREATE TABLESPACE cmis LOGGING
  DATAFILE '/opt/oracle/oradata/cmis.dbf' SIZE 37000M EXTENT MANAGEMENT LOCAL;

建議: 啟用 AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED、SEGMENT SPACE MANAGEMENT AUTO (ASSM)。

步驟 4:目標端處理用戶 TEST2

情況 A:用戶不存在 → 直接建立

CREATE USER test2 IDENTIFIED BY test2passwd
  DEFAULT TABLESPACE cmis TEMPORARY TABLESPACE temp PROFILE DEFAULT;
GRANT CONNECT, RESOURCE TO test2;

情況 B:用戶已存在 → 級聯刪除重建

-- 1. 殺除殘留 Session
SELECT 'ALTER SYSTEM KILL SESSION ''' || sid || ',' || serial# || ''' IMMEDIATE;'
FROM v$session WHERE username = 'TEST2';
-- 複製輸出的 ALTER SYSTEM 語句在 SQL*Plus 執行

-- 2. 刪除用戶及所有對象
DROP USER test2 CASCADE;

-- 3. 重建
CREATE USER test2 IDENTIFIED BY test2passwd
  DEFAULT TABLESPACE cmis TEMPORARY TABLESPACE temp PROFILE DEFAULT;
GRANT CONNECT, RESOURCE TO test2;

步驟 5:傳輸 DMP 檔案

用 scp/sftp/WinSCP 將 TEST1.dmp 傳至 Linux /tmp/TEST1.dmp。二進制模式傳輸,校驗 MD5/SHA256 確保完整。

步驟 6:目標端導入 (Schema 重映射)

# Linux Shell (非 SQL*Plus)
imp TEST2/TEST2PASSWD FROMUSER=TEST1 TOUSER=TEST2 \
    FILE=/tmp/TEST1.dmp \
    LOG=/opt/oracle/admin/log/imp_TEST2.log \
    IGNORE=Y BUFFER=64000 COMMIT=Y

核心參數:

  • FROMUSER=TEST1 TOUSER=TEST2:Schema 重映射,自動處理對象擁有者、引用遷移。
  • IGNORE=Y:忽略建立錯誤 (如表已存在),繼續導入資料。
  • BUFFER=64000:提高陣列獲取效能。
  • COMMIT=Y:定期提交,避免大交易回滾段爆滿。

步驟 7:導入後驗證

-- 對象計數對比
SELECT object_type, COUNT(*) FROM dba_objects WHERE owner = 'TEST2' GROUP BY object_type;
-- 與源端 TEST1 對比

-- 資料筆數抽檢
SELECT COUNT(*) FROM test2.key_table;
-- 與源端對比

-- 無效對象檢查
SELECT object_name, object_type FROM dba_objects WHERE owner = 'TEST2' AND status = 'INVALID';
-- 重新編譯: EXEC UTL_RECOMP.RECOMP_SERIAL('TEST2');

常見坑與對策

問題原因對策
ORA-01917: user TEST2 does not exist導入前未建用戶步驟 4 預建用戶
ORA-01503: tablespace CMIS not found目標端缺表空間步驟 3 預建表空間
ORA-00001: unique constraint violatedIGNORE=Y 但資料重複確認目標表為空或 TRUNCATE 後導入
導入極慢BUFFER 小、無 COMMIT、索引維護BUFFER=64000+、COMMIT=Y、大表可 INDEXES=N 後重建
權限缺失GRANTS=N 或角色不存在導出含 GRANTS、目標端預建角色

進階:Data Pump (expdp/impdp) 更強選擇

10g+ 環境強烈建議改用 Data Pump:

  • 並行度 (PARALLEL=4) 導入導出提速 5-10 倍。
  • REMAP_SCHEMA=TEST1:TEST2、REMAP_TABLESPACE=CMIS:CMIS_NEW 靈活映射。
  • 網路模式 (NETWORK_LINK) 免 DMP 落地、跨版本遷移。
  • 細粒度過濾 (INCLUDE/EXCLUDE)。

結語

跨平台 Schema 遷移,核心在於表空間預建對齊、用戶重映射參數精準、Session 清理徹底、驗證全覆蓋。將上述步驟封裝為腳本 (Shell/Bat + SQL),納入變更管理流程,才能實現「可重複、可審計、可回滾」的專業級遷移交付。

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