首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PL/SQL 遠端備份與還原 Oracle 資料庫實戰:Data Pump 完整指南

     編輯:Oracle 資料庫相關知識

重要觀念

Data Pump 匯出/匯入檔案(.dmp、.log)永遠產生在資料庫伺服器端的目錄物件路徑,而非客戶端電腦。 遠端操作僅觸發伺服器端作業,完成後需至伺服器取檔或透過其他方式傳輸。

一、環境準備

  • 伺服器:Linux 或 Windows 均可
  • 客戶端:安裝 PL/SQL Developer
  • 權限:需具備 DATAPUMP_EXP_FULL_DATABASE / DATAPUMP_IMP_FULL_DATABASE 或 DBA 權限
  • 目錄物件:預設 DATA_PUMP_DIR 指向 $ORACLE_HOME/rdbms/log 或自訂路徑

二、匯出(備份)操作步驟

1. 連線並執行匯出 PL/SQL 區塊

使用待備份的結構擁有者登入 PL/SQL,執行:

declare
  h1 number;
  l1 varchar2(20);
begin
  h1 := dbms_datapump.open(
    operation => 'EXPORT',
    job_mode  => 'SCHEMA',
    job_name  => 'JOB_EXP1',
    version   => 'COMPATIBLE'
  );
  dbms_datapump.set_parallel(handle => h1, degree => 1);
  dbms_datapump.add_file(handle => h1, filename => 'EXPDAT.LOG', directory => 'DATA_PUMP_DIR', filetype => 3); -- log
  dbms_datapump.set_parameter(handle => h1, name => 'KEEP_MASTER', value => 0);
  dbms_datapump.metadata_filter(handle => h1, name => 'SCHEMA_EXPR', value => 'IN(''CHY'')'); -- 結構名大寫
  dbms_datapump.add_file(handle => h1, filename => 'CHYDB.DMP', directory => 'DATA_PUMP_DIR', filetype => 1); -- dump
  dbms_datapump.set_parameter(handle => h1, name => 'INCLUDE_METADATA', value => 1);
  dbms_datapump.set_parameter(handle => h1, name => 'DATA_ACCESS_METHOD', value => 'AUTOMATIC');
  dbms_datapump.set_parameter(handle => h1, name => 'ESTIMATE', value => 'BLOCKS');
  dbms_datapump.start_job(handle => h1, skip_current => 0, abort_step => 0);
  dbms_datapump.wait_for_job(handle => h1, job_state => l1);
  dbms_datapump.detach(handle => h1);
end;
/

2. 關鍵參數說明

  • SCHEMA_EXPR:IN('CHY') 中的 CHY 為結構名稱,必須大寫
  • filename => 'CHYDB.DMP':匯出檔名,大寫

3. 取得檔案路徑並下載

select directory_path from dba_directories where directory_name = 'DATA_PUMP_DIR';

登入伺服器將 .dmp、.log 複製至本地或備份儲存。

三、匯入(還原)操作步驟

1. 準備目標環境

  • 將 .dmp 檔放入目標伺服器的 DATA_PUMP_DIR 路徑
  • 使用 Enterprise Manager (EM) 或 SQL 建立目標使用者(如 SA),指定預設表空間 USERS、暫存表空間 TEMP
  • 授予 DBA 角色與所有系統權限

2. 以目標使用者登入執行匯入

declare
  h1 number;
  l1 varchar2(20);
begin
  h1 := dbms_datapump.open(
    operation => 'IMPORT',
    job_mode  => 'SCHEMA',
    job_name  => 'JOB_IMP1',
    version   => 'COMPATIBLE'
  );
  dbms_datapump.set_parallel(handle => h1, degree => 1);
  dbms_datapump.add_file(handle => h1, filename => 'IMPORT.LOG', directory => 'DATA_PUMP_DIR', filetype => 3);
  dbms_datapump.set_parameter(handle => h1, name => 'KEEP_MASTER', value => 0);
  dbms_datapump.add_file(handle => h1, filename => 'CHYDB.DMP', directory => 'DATA_PUMP_DIR', filetype => 1);
  dbms_datapump.metadata_filter(handle => h1, name => 'SCHEMA_EXPR', value => 'IN(''CHY'')');
  dbms_datapump.set_parameter(handle => h1, name => 'INCLUDE_METADATA', value => 1);
  dbms_datapump.set_parameter(handle => h1, name => 'DATA_ACCESS_METHOD', value => 'AUTOMATIC');
  dbms_datapump.set_parameter(handle => h1, name => 'SKIP_UNUSABLE_INDEXES', value => 0);
  -- 重新對應結構與表空間
  dbms_datapump.metadata_remap(handle => h1, name => 'REMAP_SCHEMA', old_value => 'CHY', value => 'SA');
  dbms_datapump.metadata_remap(handle => h1, name => 'REMAP_TABLESPACE', old_value => 'USERS', value => 'USERS');
  dbms_datapump.metadata_transform(handle => h1, name => 'OID', value => 0);
  dbms_datapump.start_job(handle => h1, skip_current => 0, abort_step => 0);
  dbms_datapump.wait_for_job(handle => h1, job_state => l1);
  dbms_datapump.detach(handle => h1);
end;
/

3. 關鍵對應參數(全部大寫)

4. 驗證匯入結果

查看 IMPORT.LOG 確認無嚴重錯誤,並以目標使用者查詢物件數量。

四、常見問題與技巧

  • 重跑匯出:先刪除 $ORACLE_HOME 與 /u01/app/oraInventory 下的殘留檔案
  • 跨版本匯入:version => 'COMPATIBLE' 可支援向上相容
  • 網路匯出:加入 network_link 參數可直接透過 DB Link 遠端抽取,無需中間 .dmp 檔
  • 平行處理:degree => N 可加速大型資料庫作業
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
參數來源值目標值說明
REMAP_SCHEMACHYSA來源結構→目標結構
REMAP_TABLESPACEUSERSUSERS來源表空間→目標表空間