利用 oracle database 10g 實(shí)用工具數(shù)據(jù)移動(dòng)得到了很大的提高。 迄今為止,導(dǎo)出/導(dǎo)入工具集仍是跨多個(gè)平臺(tái)轉(zhuǎn)移數(shù)據(jù)所需勞動(dòng)強(qiáng)度最小的首選實(shí)用工具,盡管人們常常抱怨它速度太慢。導(dǎo)入只是將每條記錄從導(dǎo)出轉(zhuǎn)儲(chǔ)文件中讀出來,然后使用常見的 insert into 命令將其插入到目標(biāo)表中,因此導(dǎo)入可能是個(gè)很慢的過程,這一點(diǎn)并不讓人感到吃驚。 進(jìn)入 oracle data pump,oracle database 10g 中的導(dǎo)出/導(dǎo)入工具包的更新更快的同類工具,它被設(shè)計(jì)來成倍地加速這個(gè)過程。 data pump 反映了整個(gè)導(dǎo)出/導(dǎo)入過程的徹底革新。它不是使用常見的 sql 命令,而是應(yīng)用專用 api 來以更快得多的速度加載和卸載數(shù)據(jù)。在我的測(cè)試中,我看到導(dǎo)出性能比在直接模式下提高了 10-15 倍,導(dǎo)入過程性能提高了 5 倍。此外,與使用導(dǎo)出實(shí)用工具不同,它還能夠只取出特定類型的對(duì)象(如過程)。 data pump 導(dǎo)出 這個(gè)新的實(shí)用工具稱為 expdp,以和原來的導(dǎo)出 exp 區(qū)分開。在本例中,我們將用 data pump 來導(dǎo)出一個(gè)大表 cases,大小約為 3gb。data pump 在服務(wù)器端使用文件處理來創(chuàng)建和讀取文件;因此,目錄作為位置使用。在這種情況下,我們將使用文件系統(tǒng) /u02/dpdata1 來保存轉(zhuǎn)儲(chǔ)文件。 create directory dpdata1 as /u02/dpdata1;grant read, write on directory dpdata1 to ananda; 接下來,我們將導(dǎo)出數(shù)據(jù): expdp ananda/abc123 tables=cases directory=dpdata1 dumpfile=expcases.dmp job_name=cases_export 讓我們來分析該命令的各個(gè)部分。用戶 id/口令組合、表和轉(zhuǎn)儲(chǔ)文件參數(shù)的意義是顯而易見的。與原來的導(dǎo)出不同,文件是在服務(wù)器(不是客戶端)上創(chuàng)建的。位置由目錄參數(shù)值 dpdata1 指定,它指向之前創(chuàng)建的 /u02/dpdata1。這個(gè)進(jìn)程還在目錄參數(shù)指定的位置上創(chuàng)建一個(gè)日志文件(同樣在服務(wù)器上)。默認(rèn)地,這個(gè)進(jìn)程使用一個(gè)名稱為 dpump_dir 的目錄;因此可以創(chuàng)建它來代替 dpdata1。 注意上面的參數(shù) job_name,這是個(gè)特殊的參數(shù),在原來的導(dǎo)出中沒有。所有的 data pump 工作都通過作業(yè)來完成。data pump 作業(yè) — 與 dbms 作業(yè)不同 — 只是服務(wù)器進(jìn)程,它代表主進(jìn)程處理數(shù)據(jù)。主進(jìn)程(稱為主控制進(jìn)程)通過高級(jí)隊(duì)列 (aq) 來協(xié)調(diào)這項(xiàng)工作;它通過在運(yùn)行期內(nèi)創(chuàng)建的一個(gè)特殊的表(稱為主表)來實(shí)現(xiàn)這個(gè)目的。在我們的例子中,如果您在 expdp 運(yùn)行時(shí)檢查用戶 ananda 的模式 ,您將注意到一個(gè)表 cases_export 的存在(對(duì)應(yīng)參數(shù) job_name)。當(dāng) expdp 結(jié)束時(shí),這個(gè)表被丟棄。 導(dǎo)出監(jiān)控 當(dāng) data pump export (dpe) 運(yùn)行時(shí),按 control-c;它將阻止消息在屏幕上顯示,但不停止導(dǎo)出進(jìn)程本身。相反,它將顯示 dpe 提示符(如下所示)。進(jìn)程現(xiàn)在被認(rèn)為處于“交互式”模式: export> 這種方法允許在這個(gè) dpe 作業(yè)上輸入幾條命令。要查看概要,在提示符下使用 status 命令: export> statusjob:cases_exportoperation:export mode:table state:executing degree: 1job error count: 0dump file:/u02/dpdata1/expcases.dmp bytes written = 2048worker 1 status:state:executing object schema:dwownerobject name:casesobject type:table_export/tbl_table_data/table/table_datacompleted objects: 1total objects: 1completed rows: 4687818 記住,這只是狀態(tài)顯示。導(dǎo)出在后臺(tái)工作。要繼續(xù)在屏幕上查看消息,從 export> 提示符下使用命令 continue_client。 并行操作 您可以通過 parallel 參數(shù)為導(dǎo)出使用一個(gè)以上的線程來顯著地加速作業(yè)。每個(gè)線程創(chuàng)建一個(gè)單獨(dú)的轉(zhuǎn)儲(chǔ)文件,因此參數(shù) dumpfile 應(yīng)當(dāng)擁有和并行度一樣多的項(xiàng)目。您可以指定通配符作為文件名,而不是顯式地輸入各個(gè)文件名,例如: expdp ananda/abc123 tables=cases directory=dpdata1 dumpfile=expcases_%u.dmp parallel=4 job_name=cases_export 注意 dumpfile 參數(shù)擁有一個(gè)通配符 %u,它指示文件將按需要?jiǎng)?chuàng)建,格式將為 expcases_nn.dmp,其中 nn 從 01 開始,然后按需要向上增加。 在并行模式下,狀態(tài)屏幕將顯示四個(gè)工作進(jìn)程。(在默認(rèn)模式下,只有一個(gè)進(jìn)程是可見的。)所有的工作進(jìn)程同步取出數(shù)據(jù),并在狀態(tài)屏幕上顯示它們的進(jìn)度。 分離訪問數(shù)據(jù)文件和轉(zhuǎn)儲(chǔ)目錄文件系統(tǒng)的輸入/輸出通道是很重要的。否則,與維護(hù) data pump 作業(yè)相關(guān)的開銷可能超過并行線程的效益,并因此而降低性能。并行方式只有在表的數(shù)量多于并行值并且表很大時(shí)才是有效的。 數(shù)據(jù)庫(kù)監(jiān)控 您還可以從數(shù)據(jù)庫(kù)視圖獲得關(guān)于運(yùn)行的 data pump 作業(yè)的更多信息。監(jiān)控作業(yè)的主視圖是 dba_datapump_jobs,它將告訴您在作業(yè)上有多少個(gè)工作進(jìn)程(列 degree)在工作。另一個(gè)重要的視圖是 dba_datapump_sessions,當(dāng)它與上述視圖和 v$session 結(jié)合時(shí)將給出主前臺(tái)進(jìn)程的會(huì)話 sid。 select sid, serial#from v$session s, dba_datapump_sessions dwhere s.saddr = d.saddr; 這條指令顯示前臺(tái)進(jìn)程的會(huì)話。更多有用的信息可以從警報(bào)日志中獲得。當(dāng)進(jìn)程啟動(dòng)時(shí),mcp 和工作進(jìn)程在警報(bào)日志中顯示如下: kupprdp:master process dm00 started with pid=23, os id=20530 to execute - sys.kupm$mcp.main(cases_export, ananda); kupprdp:worker process dw01 started with worker id=1, pid=24, os id=20532 to execute - sys.kupw$worker.main(cases_export, ananda); kupprdp:worker process dw03 started with worker id=2, pid=25, os id=20534 to execute - sys.kupw$worker.main(cases_export, ananda); 它顯示為數(shù)據(jù)泵操作啟動(dòng)的會(huì)話的 pid。您可以用以下查詢找到實(shí)際的 sid: select sid, program from v$session where paddr in (select addr from v$process where pid in (23,24,25)); program 列將對(duì)應(yīng)警報(bào)日志文件中的名稱顯示進(jìn)程 dm (為主進(jìn)程)或 dw (為工作進(jìn)程)。如果一個(gè)工作進(jìn)程使用了并行查詢,比如說 sid 23,您可以在視圖 v$px_session 中看到它,并把它找出來。它將為您顯示從 sid 23 代表的工作進(jìn)程中運(yùn)行的所有并行查詢會(huì)話: select sid from v$px_session where qcsid = 23; 從視圖 v$session_longops 中可以獲得其它的有用信息來預(yù)測(cè)完成作業(yè)將花費(fèi)的時(shí)間。 select sid, serial#, sofar, totalworkfrom v$session_longopswhere opname = cases_exportand sofar != totalwork; 列 totalwork 顯示總工作量,該列的 sofar 數(shù)量被加和到當(dāng)前的時(shí)刻 — 因而您可以用它來估計(jì)還要花多長(zhǎng)時(shí)間。 data pump 導(dǎo)入 不過,數(shù)據(jù)導(dǎo)入性能是 data pump 真正出色的地方。要導(dǎo)入先前導(dǎo)出的數(shù)據(jù),我們將使用 impdp ananda/abc123 directory=dpdata1 dumpfile=expcases.dmp job_name=cases_import 導(dǎo)入進(jìn)程的默認(rèn)行為是創(chuàng)建表和所有相關(guān)的對(duì)象,然后在表已存在時(shí)產(chǎn)生一個(gè)錯(cuò)誤。如果您想把數(shù)據(jù)添加到一個(gè)現(xiàn)有的表中,您可以在上述命令行中使用 table_exists_action=append。 和使用 data pump 導(dǎo)入一樣,在進(jìn)程中按 control-c 將進(jìn)入 date pump import (dpi) 的交互模式;同樣,提示符是 import>。 處理特定對(duì)象 您是否有過只需要從一個(gè)用戶導(dǎo)出特定的過程,以在一個(gè)不同的數(shù)據(jù)庫(kù)或用戶中重新創(chuàng)建這些過程的情況?與傳統(tǒng)的導(dǎo)出實(shí)用工具不同,data pump 允許您只導(dǎo)出特定類型的對(duì)象。例如,以下命令讓您只導(dǎo)出過程,而不導(dǎo)出其它任何東西 — 不導(dǎo)出表、視圖、甚至函數(shù): expdp ananda/iclaim directory=dpdata1 dumpfile=expprocs.dmp include=procedure 要只導(dǎo)出一些特定的對(duì)象 — 比如說,函數(shù) func1 和過程 proc1 — 您可以使用 expdp ananda/iclaim directory=dpdata1 dumpfile=expprocs.dmp include=procedure:\"=\proc1\\",function:\"=\func1\\" 這個(gè)轉(zhuǎn)儲(chǔ)文件充當(dāng)了源對(duì)象的一個(gè)備份。您甚至可以用它來創(chuàng)建 ddl 腳本,以供之后使用。一個(gè)稱為 sqlfile 的特殊參數(shù)允許創(chuàng)建 ddl 腳本文件。 impdp ananda/iclaim directory=dpdata1 dumpfile=expprocs.dmp sqlfile=procs.sql 該指令在 dpdata1 指定的目錄中創(chuàng)建一個(gè)名稱為 procs.sql 的文件,并將對(duì)象的腳本包含在導(dǎo)出轉(zhuǎn)儲(chǔ)文件中。這種方法幫助您快速地在另一個(gè)模式中創(chuàng)建源對(duì)象。 利用參數(shù) include 允許您從轉(zhuǎn)儲(chǔ)文件中定義要包含或排除的對(duì)象。您可以使用子句 include=table:"like tab%" 來僅導(dǎo)出那些名稱以 tab 開頭的表。類似地,您可以使用結(jié)構(gòu) include=table:"not like tab%" 來排除所有名稱以 tab 開頭的表。作為另一種選擇,您可以使用 exclude 參數(shù)來排除特定的對(duì)象。 通過外部表,data pump 還可以用來傳輸表空間;它非常強(qiáng)大,能夠即時(shí)地重定義并行方式,將更多的表添加到一個(gè)現(xiàn)有的進(jìn)程中等等(這超出了本文的范圍;關(guān)于更多詳細(xì)信息,請(qǐng)參考 oracle database utilities 10g release 1 10.1)。以下命令顯示data pump 導(dǎo)出實(shí)用工具提供的所有參數(shù)的列表: expdp help=y 類似地,impdp help=y 將顯示 dpi 中的所有參數(shù)。 當(dāng) data pump 作業(yè)在運(yùn)行時(shí),您可以通過在 dpe 或 dpi 提示符下發(fā)出 stop_job 來暫停它們,然后用 start_job 來重起它們。這個(gè)功能在您空間不足和想在繼續(xù)執(zhí)行之前進(jìn)行修改時(shí)非常方便。 |
|