利用Oracle數(shù)據(jù)泵完成數(shù)據(jù)導入和導出
2024-08-29 13:38:23
供稿:網(wǎng)友
在Oracle 10g中, eXP 和 imp 被重新設計為Oracle Data Pump(雖然Oracle 仍然裝載了exp 和imp,并完全地支持它們)。假如你以前使用過exp 和 imp,那么Data Pump 的命令行程序的語法對你來說就不生疏了。
Data Pump 是運行在數(shù)據(jù)庫內(nèi)部的, 而不是像一個獨立的客戶端應用程序一樣存在。這就意味著這部分的工作在一定程度上獨立于發(fā)起執(zhí)行導入或者導出任務的進程 。 在一臺機器上 (例如一個定期任務) 可以開始執(zhí)行導出的任務,而另一臺機器上 (例如 DBA 的 手提電腦) 可以對任務的運行狀態(tài)進行監(jiān)控。 也正因為任務是運行在數(shù)據(jù)庫內(nèi)部的,所以假如你要將數(shù)據(jù)導出到一個文件中,那么你首先要做的事情就是為輸出路徑建立一個數(shù)據(jù)庫的DirectorY 對象,然后給將要進行數(shù)據(jù)導入和導出的用戶授權(quán)訪問,命令如下:
create or replace directory dumpdir as 'c:/';
grant read,write on directory dumpdir to scott;
一旦該路經(jīng)被授權(quán)后,就可以通過以下的命令參數(shù)導出用戶的對象,這些命令與 exp 和 imp 中的命令非常相似:
expdp scott/tiger directory=dumpdir dumpfile=scott.dmp
當導出工作開始執(zhí)行以后,可以通過按下[Ctrl]C (或者是客戶端中具有相同功能的按鍵) 來“中止”導出任務。這樣就不會再有數(shù)據(jù)發(fā)送到你的客戶端了,但是該任務在數(shù)據(jù)庫中仍然還在運行。你的客戶端會進入交互模式(出現(xiàn)Export>提示符)。 在提示符后輸入status就可以查看到當前有哪些任務正在運行。假如在客戶端輸入expdp attach=<任務名>,你就可以連接到一個正在運行的任務上。
Data Pump 并不是一定要寫入到文件中。現(xiàn)在可以通過選項設置就可以將數(shù)據(jù)庫對象通過SQL*Net直接導到一個遠程數(shù)據(jù)庫中。你所要做的就僅僅是指定remote 選項,然后加上與遠程數(shù)據(jù)庫連接的連接字符串。 這就有點類似于對數(shù)據(jù)庫的一次性復制過程。
Data Pump 執(zhí)行起來要比原來的exp 和 imp 客戶端命令快得多。Data Pump 運行得更快是因為它有一個新特性——“parallel”選項。選定這個選項后,Data Pump 將會以四個不同的線程同時壓送數(shù)據(jù)。下面舉個例子,我先執(zhí)行下面的任務,然后按 [Ctrl]C,接著察看后臺任務的狀態(tài):
expdp scott/tiger directory=dumpdir dumpfile=scott2.dmp parallel=4
job_name=scott2
Export: Release 10.1.0.2.0 - PRodUCtion on Friday, 31 December, 2004 14:54
Copyright (c) 2003, Oracle. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 -
Production
With the Partitioning, OLAP and Data Mining options
FlashBACK automatically enabled to preserve database integrity.
Starting "SCOTT"."SCOTT2": scott/******** directory=dumpdir
dumpfile=scott2.dmp parallel=4 job_name=scott2
Estimate in progress using BLOCKS method...
Export> status
Job: SCOTT2
Operation: EXPORT
Mode: SCHEMA
State: EXECUTING
Bytes Processed: 0
Current Parallelism: 4
Job Error Count: 0
Dump File: C:/SCOTT2.DMP
bytes written: 4,096
Worker 1 Status:
State: EXECUTING
Worker 2 Status:
State: WORK WAITING
Worker 3 Status:
State: WORK WAITING
Worker 4 Status:
State: WORK WAITING
其實不僅僅只有Data Pump 是在數(shù)據(jù)庫內(nèi)部運行的,事實上大部分的命令行性質(zhì)的命令都是在數(shù)據(jù)庫內(nèi)部運行的,只不過是通過一個PL/SQL API—— DBMS_DATAPUMP顯示出來。
例如,可以通過以下的PL/SQL代碼來實現(xiàn)通過PL/SQL 包啟動導出任務:
declare
handle number;
begin
handle := dbms_datapump.open('EXPORT','SCHEMA');
dbms_datapump.add_file(handle,'SCOTT3.DMP','DUMPDIR');
dbms_datapump.metadata_filter(handle,'SCHEMA_EXPR','= ''SCOTT''');
dbms_datapump.set_parallel(handle,4);
dbms_datapump.start_job(handle);
dbms_datapump.detach(handle);
end; /
仔細研究 Data Pump ,你可以了解到 Data Pump 其他更多的新特性。例如,Data Pump 可以對數(shù)據(jù)文件重命名,可以將對象移動到不同的表空間中,還可以通過使用通配符結(jié)構(gòu)或者是語句來查找圖表對象或是圖表。Data Pump 還可以用作外部表的接口 (例如,可以將一個表與存儲在一個數(shù)據(jù)泵導出文件中的數(shù)據(jù)關聯(lián)起來,這就像Oracle 9i 以及更高版本中的Oracle Loader 接口一樣)。