国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

Oracle Database 10g:最佳新特性(第四周:高速的導出/導入)

2024-08-29 13:30:35
字體:
來源:轉載
供稿:網友

第 4 周
高速的導出/導入:oracle data pump

利用 oracle database 10g 實用工具數據移動得到了很大的提高。

迄今為止,導出/導入工具集仍是跨多個平臺轉移數據所需勞動強度最小的首選實用工具,盡管人們常常抱怨它速度太慢。導入只是將每條記錄從導出轉儲文件中讀出來,然后使用常見的 insert into 命令將其插入到目標表中,因此導入可能是個很慢的過程,這一點并不讓人感到吃驚。

進入 oracle data pump,oracle database 10g 中的導出/導入工具包的更新更快的同類工具,它被設計來成倍地加速這個過程。

data pump 反映了整個導出/導入過程的徹底革新。它不是使用常見的 sql 命令,而是應用專用 api 來以更快得多的速度加載和卸載數據。在我的測試中,我看到導出性能比在直接模式下提高了 10-15 倍,導入過程性能提高了 5 倍。此外,與使用導出實用工具不同,它還能夠只取出特定類型的對象(如過程)。

data pump 導出

這個新的實用工具稱為 expdp,以和原來的導出 exp 區分開。在本例中,我們將用 data pump 來導出一個大表 cases,大小約為 3gb。data pump 在服務器端使用文件處理來創建和讀取文件;因此,目錄作為位置使用。在這種情況下,我們將使用文件系統 /u02/dpdata1 來保存轉儲文件。


create directory dpdata1 as '/u02/dpdata1';grant read, write on directory dpdata1 to ananda;



接下來,我們將導出數據:




expdp ananda/abc123 tables=cases directory=dpdata1 dumpfile=expcases.dmp job_name=cases_export



讓我們來分析該命令的各個部分。用戶 id/口令組合、表和轉儲文件參數的意義是顯而易見的。與原來的導出不同,文件是在服務器(不是客戶端)上創建的。位置由目錄參數值 dpdata1 指定,它指向之前創建的 /u02/dpdata1。這個進程還在目錄參數指定的位置上創建一個日志文件(同樣在服務器上)。默認地,這個進程使用一個名稱為 dpump_dir 的目錄;因此可以創建它來代替 dpdata1。



注意上面的參數 job_name,這是個特殊的參數,在原來的導出中沒有。所有的 data pump 工作都通過作業來完成。data pump 作業 — 與 dbms 作業不同 — 只是服務器進程,它代表主進程處理數據。主進程(稱為主控制進程)通過高級隊列 (aq) 來協調這項工作;它通過在運行期內創建的一個特殊的表(稱為主表)來實現這個目的。在我們的例子中,如果您在 expdp 運行時檢查用戶 ananda 的模式 ,您將注意到一個表 cases_export 的存在(對應參數 job_name)。當 expdp 結束時,這個表被丟棄。

導出監控

當 data pump export (dpe) 運行時,按 control-c;它將阻止消息在屏幕上顯示,但不停止導出進程本身。相反,它將顯示 dpe 提示符(如下所示)。進程現在被認為處于“交互式”模式:


export>



這種方法允許在這個 dpe 作業上輸入幾條命令。要查看概要,在提示符下使用 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



記住,這只是狀態顯示。導出在后臺工作。要繼續在屏幕上查看消息,從 export> 提示符下使用命令 continue_client。

并行操作

您可以通過 parallel 參數為導出使用一個以上的線程來顯著地加速作業。每個線程創建一個單獨的轉儲文件,因此參數 dumpfile 應當擁有和并行度一樣多的項目。您可以指定通配符作為文件名,而不是顯式地輸入各個文件名,例如:


expdp ananda/abc123 tables=cases directory=dpdata1 dumpfile=expcases_%u.dmp parallel=4 job_name=cases_export



注意 dumpfile 參數擁有一個通配符 %u,它指示文件將按需要創建,格式將為 expcases_nn.dmp,其中 nn 從 01 開始,然后按需要向上增加。



在并行模式下,狀態屏幕將顯示四個工作進程。(在默認模式下,只有一個進程是可見的。)所有的工作進程同步取出數據,并在狀態屏幕上顯示它們的進度。



分離訪問數據文件和轉儲目錄文件系統的輸入/輸出通道是很重要的。否則,與維護 data pump 作業相關的開銷可能超過并行線程的效益,并因此而降低性能。并行方式只有在表的數量多于并行值并且表很大時才是有效的。



數據庫監控



您還可以從數據庫視圖獲得關于運行的 data pump 作業的更多信息。監控作業的主視圖是 dba_datapump_jobs,它將告訴您在作業上有多少個工作進程(列 degree)在工作。另一個重要的視圖是 dba_datapump_sessions,當它與上述視圖和 v$session 結合時將給出主前臺進程的會話 sid。



select sid, serial#from v$session s, dba_datapump_sessions dwhere s.saddr = d.saddr;



這條指令顯示前臺進程的會話。更多有用的信息可以從警報日志中獲得。當進程啟動時,mcp 和工作進程在警報日志中顯示如下:



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');




它顯示為數據泵操作啟動的會話的 pid。您可以用以下查詢找到實際的 sid:



select sid, program from v$session where paddr in (select addr from v$process where pid in (23,24,25));



program 列將對應警報日志文件中的名稱顯示進程 dm (為主進程)或 dw (為工作進程)。如果一個工作進程使用了并行查詢,比如說 sid 23,您可以在視圖 v$px_session 中看到它,并把它找出來。它將為您顯示從 sid 23 代表的工作進程中運行的所有并行查詢會話:



select sid from v$px_session where qcsid = 23;



從視圖 v$session_longops 中可以獲得其它的有用信息來預測完成作業將花費的時間。



select sid, serial#, sofar, totalworkfrom v$session_longopswhere opname = 'cases_export'and sofar != totalwork;



列 totalwork 顯示總工作量,該列的 sofar 數量被加和到當前的時刻 — 因而您可以用它來估計還要花多長時間。



data pump 導入



不過,數據導入性能是 data pump 真正出色的地方。要導入先前導出的數據,我們將使用



impdp ananda/abc123 directory=dpdata1 dumpfile=expcases.dmp job_name=cases_import



導入進程的默認行為是創建表和所有相關的對象,然后在表已存在時產生一個錯誤。如果您想把數據添加到一個現有的表中,您可以在上述命令行中使用 table_exists_action=append。



和使用 data pump 導入一樣,在進程中按 control-c 將進入 date pump import (dpi) 的交互模式;同樣,提示符是 import>。



處理特定對象



您是否有過只需要從一個用戶導出特定的過程,以在一個不同的數據庫或用戶中重新創建這些過程的情況?與傳統的導出實用工具不同,data pump 允許您只導出特定類型的對象。例如,以下命令讓您只導出過程,而不導出其它任何東西 — 不導出表、視圖、甚至函數:



expdp ananda/iclaim directory=dpdata1 dumpfile=expprocs.dmp include=procedure



要只導出一些特定的對象 — 比如說,函數 func1 和過程 proc1 — 您可以使用



expdp ananda/iclaim directory=dpdata1 dumpfile=expprocs.dmp include=procedure:/"=/'proc1/'/",function:/"=/'func1/'/"



這個轉儲文件充當了源對象的一個備份。您甚至可以用它來創建 ddl 腳本,以供之后使用。一個稱為 sqlfile 的特殊參數允許創建 ddl 腳本文件。



impdp ananda/iclaim directory=dpdata1 dumpfile=expprocs.dmp sqlfile=procs.sql



該指令在 dpdata1 指定的目錄中創建一個名稱為 procs.sql 的文件,并將對象的腳本包含在導出轉儲文件中。這種方法幫助您快速地在另一個模式中創建源對象。



利用參數 include 允許您從轉儲文件中定義要包含或排除的對象。您可以使用子句 include=table:"like 'tab%'" 來僅導出那些名稱以 tab 開頭的表。類似地,您可以使用結構 include=table:"not like 'tab%'" 來排除所有名稱以 tab 開頭的表。作為另一種選擇,您可以使用 exclude 參數來排除特定的對象。



通過外部表,data pump 還可以用來傳輸表空間;它非常強大,能夠即時地重定義并行方式,將更多的表添加到一個現有的進程中等等(這超出了本文的范圍;關于更多詳細信息,請參考 oracle database utilities 10g release 1 10.1)。以下命令顯示data pump 導出實用工具提供的所有參數的列表:



expdp help=y



類似地,impdp help=y 將顯示 dpi 中的所有參數。



當 data pump 作業在運行時,您可以通過在 dpe 或 dpi 提示符下發出 stop_job 來暫停它們,然后用 start_job 來重起它們。這個功能在您空間不足和想在繼續執行之前進行修改時非常方便。



關于更多信息,請閱讀 oracle database utilities 10g release 1 10.1 指南的第 1 部分。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南城县| 屯门区| 徐闻县| 霍林郭勒市| 南安市| 云梦县| 涟源市| 峡江县| 轮台县| 琼海市| 华坪县| 望城县| 兴山县| 惠州市| 博罗县| 本溪| 望奎县| 铜鼓县| 台北市| 鱼台县| 乐业县| 光泽县| 宕昌县| 清流县| 永仁县| 故城县| 乌兰浩特市| 信宜市| 徐汇区| 运城市| 伽师县| 清涧县| 新龙县| 大渡口区| 白银市| 永春县| 内黄县| 凤城市| 阳泉市| 卢湾区| 商都县|