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

跨版本遷移難題:Oracle 10g 導出資料能否導入 9i?BUG 2261722 解決方案

     編輯:Oracle 資料庫基礎

版本相容性鐵律:低版本導入高版本易,高版本導入低版本難

Oracle 官方原則:IMP 版本必須 ≥ EXP 版本。10g 導出檔導入 9i 屬於「高版本導入低版本」,官方不支援。

傳統解法(9i 前有效)為何失效

  1. 在高版本執行低版本 catexp.sql
  2. 用低版本 EXP 導出高版本資料
  3. 用低版本 IMP 導入低版本資料庫
  4. 在高版本重新執行高版本 catexp.sql

9i 起此法失效,直接用 9i EXP 導出 10g 資料會報錯:

EXP-00008: Oracle error %lu encountered
ORA-00904: invalid column name

根因:已確認 BUG 2261722

Metalink 文檔記載:9i EXP 讀取 10g 資料字典視圖 EXU81RLS 時欄位不匹配。此 BUG 計劃在 10.0 修復,9i 不會回溯修補。

實戰繞過方案:重建 EXU81RLS 視圖

在 9i 目標資料庫以 SYS 身分執行以下 SQL 重建視圖,修正欄位定義:

CREATE OR REPLACE VIEW EXU81RLS AS
SELECT 
  u.name OWNER, o.name TABLE_NAME, 
  DECODE(BITAND(p.flags, 1), 1, 'Y', 'N') POLICY_EXISTS,
  DECODE(BITAND(p.flags, 2), 2, 'Y', 'N') POLICY_ENABLED
FROM sys.user$ u, sys.obj$ o, sys.rls$ p
WHERE u.user# = o.owner#
  AND o.obj# = p.obj#(+);

操作流程總結

  1. 在 10g 來源庫用 10g EXP 導出(含 CONSISTENT=Y 確保一致性)
  2. 在 9i 目標庫執行上述視圖重建腳本
  3. 用 9i IMP 導入 DMP 檔
  4. 導入後驗證資料完整性、重新編譯無效物件

替代方案建議

  • Data Pump (10g+):EXPDP/IMPDP 支援 VERSION=9.2 參數直接產生相容導出檔
  • 資料庫連結 + CTAS:9i 建立 DB Link 連 10g,直接 CREATE TABLE AS SELECT 拉取資料
  • GoldenGate/複寫:異構遷移首選,零停機
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved