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

Oracle DMP 匯入進階:Schema 重映射、權限授予、遷移驗收全流程

     編輯:Oracle 資料庫基礎

前言:從「能匯入」到「匯得對、匯得快、可驗收」

單表匯入 imp ... TABLES=(T1) 只是起點。實務遷移常面臨:Schema 重命名、跨用戶遷移、大量物件驗收、權限最小化等挑戰。本文提供參數檔驅動的 Schema 重映射方案、標準權限模型、遷移後驗收腳本,構建可交付的遷移交付件。

一、Schema 重映射:參數檔驅動 FROMUSER/TOUSER

建立 import_remap.par:

# import_remap.par
USERID=system/xxx
FILE=/backup/source_schema.dmp
LOG=/backup/import_remap_20240115.log
FROMUSER=OLD_SCHEMA
TOUSER=NEW_SCHEMA
IGNORE=Y
COMMIT=Y
BUFFER=32000000
GRANTS=Y
INDEXES=Y
CONSTRAINTS=Y
ROWS=Y
STATISTICS=NONE
FEEDBACK=50000

執行:imp parfile=import_remap.par

  • FROMUSER/TOUSER 可多對多:FROMUSER=(A,B) TOUSER=(A_NEW,B_NEW)。
  • 若目標用戶不存在,Imp 會嘗試建立(需 CREATE USER 權限),建議預先建立用戶與表空間配額。

二、標準權限授予模型(最小權限原則)

-- 1. 建立目標用戶
CREATE USER new_schema IDENTIFIED BY xxx
  DEFAULT TABLESPACE app_data
  TEMPORARY TABLESPACE app_temp
  QUOTA UNLIMITED ON app_data;

-- 2. 核心角色(避免授予 DBA)
GRANT CREATE SESSION TO new_schema;
GRANT RESOURCE TO new_schema;  -- CREATE TABLE, SEQUENCE, PROCEDURE, TRIGGER, TYPE 等

-- 3. 匯入所需額外權限
GRANT IMP_FULL_DATABASE TO new_schema;  -- 若由 new_schema 自行匯入
-- 或由 system 執行 imp,則 new_schema 僅需 RESOURCE + QUOTA

-- 4. 針對性系統權限(視應用需求)
GRANT CREATE VIEW, CREATE MATERIALIZED VIEW TO new_schema;
GRANT CREATE PROCEDURE, CREATE SEQUENCE, CREATE TRIGGER TO new_schema;
GRANT CREATE SYNONYM, CREATE DATABASE LINK TO new_schema;
GRANT UNLIMITED TABLESPACE TO new_schema;  -- 簡化配額管理

三、遷移前準備:目標庫環境對齊

項目檢查/動作
字符集目標庫字符集為來源超集(如 AL32UTF8 包含 ZHS16GBK),客戶端 NLS_LANG 一致
版本相容目標版本 ≥ 來源版本;使用目標端 Imp 工具
表空間預先建立業務表空間(APP_DATA, APP_INDEX),設定 AUTOEXTEND/MAXSIZE
參數OPEN_CURSORS、PROCESSES、PGA_AGGREGATE_TARGET 滿足匯入併發
禁用物件目標庫同名表/索引/約束/觸發器預先 DROP 或 TRUNCATE

四、大表匯入加速策略

  1. 前置:ALTER INDEX ... UNUSABLE、ALTER TABLE ... DISABLE CONSTRAINT、ALTER TABLE ... DISABLE ALL TRIGGERS。
  2. 匯入:COMMIT=Y BUFFER=64000000 SKIP_UNUSABLE_INDEXES=Y。
  3. 後置並行重建:
    -- 索引並行重建
    ALTER INDEX idx_name REBUILD PARALLEL 8;
    -- 約束啟用 (NOVALIDATE 快速跳過驗證)
    ALTER TABLE t ENABLE NOVALIDATE CONSTRAINT fk_xxx;
    -- 觸發器啟用
    ALTER TABLE t ENABLE ALL TRIGGERS;
  4. 統計資訊:EXEC DBMS_STATS.GATHER_SCHEMA_STATS('NEW_SCHEMA', DEGREE=>8);。

五、遷移驗收腳本(可交付附件)

-- 1. 表行數核對
SELECT 'SOURCE' src, owner, table_name, num_rows
FROM dba_tables@src_link WHERE owner='OLD_SCHEMA'
UNION ALL
SELECT 'TARGET', owner, table_name, num_rows
FROM dba_tables WHERE owner='NEW_SCHEMA'
ORDER BY table_name, src;

-- 2. 關鍵欄位 MIN/MAX/COUNT(DISTINCT) 抽樣核對
SELECT 'SRC', MIN(id), MAX(id), COUNT(DISTINCT id) FROM old_schema.orders@src_link
UNION ALL
SELECT 'TGT', MIN(id), MAX(id), COUNT(DISTINCT id) FROM new_schema.orders;

-- 3. 物件數量核對
SELECT object_type, COUNT(*) FROM dba_objects WHERE owner='OLD_SCHEMA' GROUP BY object_type
UNION ALL
SELECT object_type, COUNT(*) FROM dba_objects WHERE owner='NEW_SCHEMA' GROUP BY object_type;

-- 4. 失效物件檢查
SELECT object_name, object_type FROM dba_objects WHERE owner='NEW_SCHEMA' AND status='INVALID';

-- 5. 約束狀態檢查
SELECT constraint_name, status FROM dba_constraints WHERE owner='NEW_SCHEMA' AND status='DISABLED';

六、常見遷移陷阱與預防

陷阱預防措施
序列值未同步,新增資料 PK 衝突遷移後執行 SELECT 'SELECT '''||sequence_name||'''.NEXTVAL FROM DUAL;' FROM dba_sequences WHERE sequence_owner='NEW_SCHEMA'; 取得最大值,手動調整序列
DB Link 密碼遺失,Package 編譯失效遷移前導出 DB Link 定義(SELECT * FROM dba_db_links),遷移後重建
字符集轉換導致中文截斷/亂碼來源 ZHS16GBK → 目標 AL32UTF8 安全;反向則需截斷檢查 LENGTHB(col) > 4000
統計資訊遺失導致執行計劃退化匯入指定 STATISTICS=NONE,遷移後必跑 DBMS_STATS.GATHER_SCHEMA_STATS

結語

專業的 DMP 遷移交付件包含:參數檔、權限腳本、環境對齊清單、加速策略、驗收腳本、陷阱預防表。將上述內容模組化、參數化,納入團隊遷移方法論,即可將「匯入」從經驗主觀操作轉為標準化、可審計、可交付的工程任務。

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