按計劃瞭解資料泵expdp/impdp

louloueva發表於2009-01-09

昨天接觸了exp/imp,今天再來練練Oracle10g之後的新工具,資料泵
資料泵同原來的匯入匯出工具最大的不同,資料泵是伺服器端的工具
而原來的匯入匯出工具是客戶端的
另外,按照Oracle文件的說法
新的資料泵工具,支援許多Oracle10g新特性
(不支援XML schema或以XML schema為基礎的表)
而且,在傳輸效能和易用性上比原匯入匯出工具改進不少
像並行傳輸,中斷/繼續傳輸,跨網傳輸,過濾物件,空間消耗測算等……
資料泵工具有三個組成部分
命令列形式的客戶端,就是expdp和impdp
名為DBMS_DATAPUMP的PL/SQL包,作為資料泵的API
名為DBMS_METADA他的PL/SQL包,作為後設資料API
今天個人是練習命令列客戶端的使用
命令列的匯入匯出是通過DBMS_DATAPUMP包中的儲存過程來實現的
在資料泵任務中,Oracle會建立一個主程式(master process)
用來控制包括與客戶端通訊,建立並控制工作程式,跟蹤日誌等功能
還要建立主表,為匯出任務記錄資料庫物件和其位置,並最終寫到轉儲檔案
為匯入任務從轉儲檔案中讀取需要的資料庫物件,並控制操作順序
其它步驟就要看使用者如何來呼叫資料泵(是否轉換物件,監視任務)

因為資料泵是伺服器端的工具,在使用前可能還需要建立一個目錄物件
並賦予相應使用者對此目錄的Oracle可讀寫許可權(不能直接讀寫)
以便整個執行過程使用
使用資料泵前,將此目錄物件設定為DATA_PUMP_DIR引數值
(未指定,Oracle將會使用自動設定值)
可通過下面語句檢視當前資料庫該值情況
SELECT directory_name, directory_path FROM dba_directories
WHERE directory_name='DATA_PUMP_DIR';

練習開始,先建立一個directory物件,並給hr使用者賦讀寫許可權
create directory dumptest as '/home/oracle/dumptest';
grant read,write on directory dumptest to hr;
另外,因為用的是Oracle的hr示例schema
資料庫中已經自動建立好了一些必要的資料庫物件

來看看匯出,expdp
下面的命令是先測試匯出hr的所有物件所需空間
expdp hr/hr ESTIMATE_ONLY=y NOLOGFILE=y

在呼叫expdp時,下面命令預設匯出hr全部物件和資料
expdp hr/hr directory=dumptest

再做一個僅僅匯出後設資料(描述資料格式用,可以理解為物件的定義)的例子
操作目錄就是剛才建立的dumptest,檔名為hr.dmp
CONTENT引數為METADATA_ONLY就是指僅匯出後設資料
expdp hr/hr DIRECTORY=dumptest DUMPFILE=hr.dmp CONTENT=METADATA_ONLY

再來利用引數檔案,匯出某個表的部分資料
expdp hr/hr parfile='/home/oracle/pump.par'
引數檔案內容:
DUMPFILE=exp.dmp
TABLES=empb
QUERY=empb:"WHERE department_id > 10 AND salary > 10000"  #匯出資料的條件
DIRECTORY=dumptest
LOGFILE=exp.log

接下來練習一下資料泵與原先的exp工具最大不同(個人認為)
因為資料庫是服務端的工具,它可以停止/繼續某個任務
這裡可以新增一個JOB_NAME引數來指定任務名稱,也可使用Oracle自動生成的
要進行停止任務操作,需要在資料泵出現starting提示後,按ctrl+c組合鍵
expdp hr/hr parfile='/home/oracle/pump.par'
引數檔案內容:
DUMPFILE=exp.dmp
TABLES=t_test
DIRECTORY=dumptest
LOGFILE=exp.log
看到starting後迅速中斷,進入Export>提示符
輸入status檢視當前任務狀態:
Job: SYS_EXPORT_TABLE_01
  Operation: EXPORT
  Mode: TABLE
  State: EXECUTING
  Bytes Processed: 0
  Current Parallelism: 1
  Job Error Count: 0
  Dump File: /home/oracle/dumptest/exp.dmp
  bytes written: 4,096

Worker 1 Status:
  State: EXECUTING
在提示符下輸入stop_job,然後會詢問是否停止
[yes]/no:#這裡直接按回車就可以,expdp自動退出
要繼續之前的任務,執行expdp hr/hr attach=SYS_EXPORT_TABLE_01
得到提示
Job: SYS_EXPORT_TABLE_01
  Owner: HR
  Operation: EXPORT
  Creator Privs: FALSE
  GUID: 600900F7324CC476E040007F010033B4
  Start Time: Friday, 09 January, 2009 15:54:18
  Mode: TABLE
  Instance: test
  Max Parallelism: 1
  EXPORT Job Parameters:
  Parameter Name      Parameter Value:
     CLIENT_COMMAND        hr/******** parfile=/home/oracle/pump.par
  State: IDLING
  Bytes Processed: 0
  Current Parallelism: 1
  Job Error Count: 0
  Dump File: /home/oracle/dumptest/exp.dmp
    bytes written: 4,096

Worker 1 Status:
  State: UNDEFINED
然後在Export>提示符下,start_job
輸入status檢視任務狀態,State: EXECUTING,任務又開始了
過一會兒,再次檢視狀態,State: WORK WAITING,任務已結束並進入等待狀態
如果匯出過程中出現異常中斷,可能任務還殘留在資料庫中
可以通過DBA_DATAPUMP_JOBS或USER_DATAPUMP_JOBS檢視查詢
根據得到的表名刪除任務
drop table hr.SYS_EXPORT_SCHEMA_01 purge;
這裡的purge子句,是不將表放入Oracle回收站,徹底刪除
Oracle回收站還可以用PURGE recyclebin來清空
也可PURGE TABLE tablename來指定清空之前刪除並放入回收站的表

匯入impdp的練習,先刪除t_test表內全部資料,再用dmp檔案匯入
impdp hr/hr parfile=/home/oracle/pump.par
引數檔案內容:
DUMPFILE=exp.dmp
TABLES=t_test
DIRECTORY=dumptest
JOB_NAME=impdp01
TABLE_EXISTS_ACTION=APPEND
LOGFILE=exp2.log
開始後,中斷,進入Import>提示符
status檢視狀態
Job: IMPDP01
  Operation: IMPORT
  Mode: TABLE
  State: EXECUTING
  Bytes Processed: 0
  Current Parallelism: 1
  Job Error Count: 0
  Dump File: /home/oracle/dumptest/exp.dmp

Worker 1 Status:
  State: EXECUTING
  Object Schema: HR
  Object Name: T_TEST
  Object Type: TABLE_EXPORT/TABLE/TABLE_DATA
  Completed Objects: 1
  Completed Bytes: 138,009,296
  Percent Done: 100
  Worker Parallelism: 1

Import> stop_job
Are you sure you wish to stop this job ([yes]/no):
中斷後,執行impdp hr/hr attach=impdp01
Job: IMPDP01
  Owner: HR
  Operation: IMPORT
  Creator Privs: FALSE
  GUID: 60095FC1D1FD9DB0E040007F010036E6
  Start Time: Friday, 09 January, 2009 16:19:28
  Mode: TABLE
  Instance: test
  Max Parallelism: 1
  EXPORT Job Parameters:
     CLIENT_COMMAND        hr/******** parfile=/home/oracle/pump.par
  IMPORT Job Parameters:
  Parameter Name      Parameter Value:
     CLIENT_COMMAND        hr/******** parfile=/home/oracle/pump.par
     TABLE_EXISTS_ACTION   APPEND
  State: IDLING
  Bytes Processed: 0
  Current Parallelism: 1
  Job Error Count: 0
  Dump File: /home/oracle/dumptest/exp.dmp

Worker 1 Status:
  State: UNDEFINED
  Object Schema: HR
  Object Name: T_TEST
  Object Type: TABLE_EXPORT/TABLE/TABLE_DATA
  Completed Objects: 1
  Completed Bytes: 138,009,296
  Percent Done: 100
  Worker Parallelism: 1
執行start_job(continue_client也可以),任務繼續執行直至完畢
因為開始只刪除了資料,保留了t_test表,所以匯入過程有錯誤
ORA-39152: Table "HR"."T_TEST" exists.
Data will be appended to existing table
but all dependent metadata will be skipped
due to table_exists_action of append
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
但資料已經匯入完畢

簡單練習就到此為止
還有許多高階應用等需要的時候再做練習

昨天和今天,簡單接觸了Oracle的邏輯備份恢復
從明天開始,計劃開始更多的接觸RMAN ^_^

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/556359/viewspace-534837/,如需轉載,請註明出處,否則將追究法律責任。

相關文章