文章詳情頁
Oracle10g:數據的導入導出
瀏覽:6日期:2023-11-12 18:41:54
Oracle10g:數據的導入導出 給數據泵加壓Oracle 數據庫 10g 中的新的實用程序使其性能和多功能性達到了新的水平。 Oracle 數據庫 10g 中增加的叫做 Oracle Data Pump (數據泵)的新的導入和導出特性,徹底改變了數據庫用戶已經習慣的過去幾代 Oracle 數據庫的客戶 / 服務器工作方式?,F在服務器可以運行導出和導入任務。你可以通過并行方式快速裝入或卸載大量數據,而且你可以在運行過程中調整并行的程度。導出和導入任務現在可以重新啟動,所以發生故障不一定意味著要從頭開始。 API 是公諸于眾的,并且易于使用;用 PL/SQL 建立一個導入和導出任務非常簡單。一旦啟動,這些任務就在后臺運行,但你可以通過客戶端實用程序從任何地方檢查任務的狀態和進行修改。 體系結構 在 Oracle 數據庫 10g 之前(從 Oracle7 到 Oracle9I ),導入和導出實用程序都作為客戶端程序運行,并且完成大量工作。導出的數據由數據庫實例讀出,通過連接傳輸到導出客戶程序,然后寫到磁盤上。所有數據在整個導出進程下通過單線程操作。今天的數據量比這個體系結構最初采用的時候要大得多,使得單一導出進程成了一個瓶頸,因為導出任務的性能受限于導出實用程序所能支持的吞吐量。 在 Oracle 數據庫 10g 和全新的數據泵( Data Pump )體系結構下,如今所有的工作都由數據庫實例來完成。數據庫實例可以用兩種方法來并行處理這些工作:通過建立多個數據泵工作進程來讀 / 寫正在被導出 / 導入的數據,以及建立并行 I/O 服務器進程以更快地選取( SELECT )或插入( INSERT )這些數據。這樣,單進程瓶頸再也就不存在了。 數據泵任務用新的 DBMS_DATAPUMP PL/SQL API 來建立、監測和調整。新的導入和導出實用程序(分別為 impdp 和 eXPdp )對于這個 API 來說只是命令行接口。你可以使用數據泵導出實用程序初始化一個任務,例如一個導出任務。然后你就可以關閉你的客戶端,回家過夜和享用晚餐,而你的任務會一直運行。到了深夜,你可以重新連接到那個任務,檢查其狀態,甚至可以提高并行程度,以便在深夜系統沒有用戶在用的情況下多完成一些工作。第二天早上,你可以降低并行度甚至掛起該任務,為白天在線的用戶釋放資源。 重新啟動任務的功能是數據泵體系結構的一個重要特性。你可以隨時停止和重啟動一個數據泵任務,比如為在線用戶釋放資源。你還可以從文件系統的空間問題中輕松地恢復。假如一個 12 小時的導出任務在進行了 11 小時后因磁盤空間不夠而失敗,那么你再也不用從頭開始重新啟動該任務,重復前面 11 小時的工作。而是你可以連接到這個失敗的任務,增加一個或多個新的轉儲( dump )文件,從失敗的地方重新啟動,這樣只需一個小時你就可以完成任務了。這在你處理很大數據量時非常有用。 對文件系統的訪問 由服務器處理所有的文件 I/O 對于遠程執行導出和導入任務的數據庫治理員來說非常有利。如今,用戶可以很輕松地在類似 UNIX 的系統 ( 如 Linux) 上 telnet 或 ssh 到一個服務器,在命令行方式下初始化一個運行在服務器上的導出或導入任務。然而,在其他操作系統上就不那么輕易, Windows 是最明顯的例子。在推出數據泵之前,要從一個 Windows 系統下的 Oracle 數據庫中導出大量數據,你很可能必須坐在服務器控制臺前發出命令。通過 TCP/IP 連接導出數據只對小數據量是可行的。數據泵改變了這一切,因為即使你通過在你的客戶端上運行該導出和導入實用程序來初始化一個導出或導入任務,該任務其實也運行在服務器上,所有的 I/O 也都發生在該服務器上。 出于安全性考慮,數據泵要求你通過 Oracle 的目錄對象來指定其中存放著你要建立或讀取的轉儲文件的目標目錄。例如: CREATE DirectorY export_dumps AS 'c:a'; ; GRANT read, write ON DIRECTORY export_dumps TO gennick; 我以 SYSTEM 身份登錄到我的實驗室數據庫上,并執行以上語句來建立一個目錄對象,這個目錄對象指向了我磁盤上的一個臨時目錄,以用來存放導出的轉儲文件。 GRANT 語句為用戶 gennick- 就是我 - 分配了訪問該目錄的權限。我給自己分配讀 / 寫權限,因為我將導出和導入數據。你可以為一個用戶分配讀權限,限制他只能導入數據。 啟動一個導出任務 你可以使用新的 expdp 實用程序來啟動一個導出任務。因為參數與老的 exp 實用程序不同,所以你得熟悉這些新的參數。你可以在命令行中指定參數,但在本文中我使用了參數文件。我想導出我的整個模式( schema ),使用了以下參數: DUMPFILE=gnis%U.dmp DIRECTORY=export_dumps LOGFILE=gnis_export.log JOB_NAME=gnis_export DUMPFILE 指定我將向其中寫入被導出數據的文件。 %U 語法給出了一個增量計數器,得到文件名 gnis01.dmp 、 gnis02.dmp 等。 DIRECTORY 指定了我的目標目錄。 我的 LOGFILE 參數指定了日志文件的名字,這個文件是為每個導出任務默認創建的。 JOB_NAME 給任務指定了一個名字。我選擇了一個易于記憶(和輸入)的名字,因為我可能需要在后面才連接這個任務。要注重在指定任務名稱時不要與你登錄模式( schema )中的模式對象名稱沖突。數據泵在你的登錄模式中建立一個被稱為任務主表的數據表,該表的名字與任務的名字相匹配。這個數據表跟蹤該任務的狀態,并最終被寫入轉儲文件中,作為該文件所含內容的一個記錄。 清單 1 顯示了一個導出任務已被啟動。該任務所做的第一件事是估計所需的磁盤空間大小。當估計值顯示出來后,我按 ctrl-C 進入一個交互式的導出提示窗口,然后使用 EXIT_CLIENT 命令回到我操作系統的命令窗口。該導出任務仍然運行在服務器上。 注重,假如我要做并行導出并且將我的 I/O 分布在兩個磁盤上,那么我可以對 DUMPFILE 參數值做出修改,并如下添加 PARALLEL 參數和值,如下所示: DUMPFILE=export_dumps01:gnis%U.dmp, export_dumps02:gnis%U.dmp PARALLEL=2 注重,在這個并行導出任務中,目錄名作為文件名的一部分來被指定。 檢查狀態 你可以隨時連接到一個運行中的任務來檢查其狀態。要連接到一個導出任務,必須執行一條 expdp 命令,使用 ATTACH 參數來指定任務名稱。 清單 2 顯示了到 GNIS_EXPORT 任務的連接。當你連接到一個任務, expdp 顯示該任務的相關信息和當前狀態,并為你提供一個 EXPORT> 提示符。 當你連接到了一個任務后,你可以隨時執行 STATUS 命令查看當前狀態,如 清單 3 所示。你還可以執行 CONTINUE_CLIENT 命令返回到顯示任務進度的日志輸出狀態,該命令可以被縮寫成如 清單 4 所示的 CONTINUE 。 你可以通過查詢 DBA_DATAPUMP_JOBS 視圖快速查看所有數據泵任務的狀態。你不能獲得 STATUS 命令所給出的具體信息,但你可以快速查看到哪些任務在執行、哪些處于空閑狀態等。另一個需要了解的視圖是 DBA_DATAPUMP_SESSIONS ,它列出了所有活躍的數據泵工作進程。 從故障中恢復 重啟動任務的能力使你可以從某些類型的故障中恢復過來。例如, 清單 5 顯示了一個用完了轉儲文件空間的導出任務的日志文件的結尾部分。然而,什么也沒有丟失。該任務只是進入了一個空閑狀態,當你連接到該任務并查看狀態輸出時就可以看到這一點。這個狀態不顯示任務空閑的原因。要確定這是因為轉儲文件的空間不夠了,則你需要查看日志文件。 連接到因轉儲文件空間不夠用了而停止的任務后,你可以在兩個操作中選擇其一:你可以使用 KILL_JOB 命令來中止該任務,或者增加一個和多個轉儲文件來繼續該任務的運行。假如空間不夠的問題是因為磁盤空間不足,則當然你要確保你增加的文件是在另一個有可用空間的磁盤上。你也許需要創建一個新的 Oracle 目錄對象來指向這一新位置。 清單 6 使用 ADD_FILES 命令為我的空閑任務增加兩個文件。這兩個文件位于不同的目錄中,它們都不同于為該任務的第一個轉儲文件所指定的目錄。我使用 START_JOB 命令來重新啟動該任務,然后使用 CONTINUE 查看屏幕上滾動的其余日志輸出。 導入任務不會受到卸載( dump )文件空間不足的影響。但是,它們可能會受到數據表空間不足或無法擴展表空間的影響。導入的恢復過程和導出任務的基本上相同。首先,通過向表空間增加一個數據文件、擴展一個數據文件或其他方法來提供可用空間。然后連接到該任務,執行 START_JOB 命令。導入任務將從它中斷的地方繼續執行。 導入選定的數據 本文中的例子到目前為止顯示的是對用戶 GENNICK 擁有的所有對象進行模式( schema )數據庫級別的導出。為了展示數據泵的一些新的功能,我要導入那些數據,而且為了使問題更有意思,我列出了以下要求: 僅導入 GNIS 數據表 將該數據表導入到 MICHIGAN 模式中 僅導入那些與密歇根州相關的數據行 不導入原始的存儲參數 一開始,我可以在我的導入參數文件中寫出以下四行: DUMPFILE=gnis%U.dmp DIRECTORY=export_dumps LOGFILE=gnis_import.log JOB_NAME=gnis_import 這四行沒有什么新意。他們指定了轉儲文件、目錄、日志文件和該任務的名稱。根據我們的四個要求,我可以使用 INCLUDE 參數將導入操作限制在我們感愛好的一個數據表上: INCLUDE=TABLE:'= 'GNIS'' INCLUDE 是個很有意思的參數。當你需要導入一個轉儲文件的部分內容時,你可以有兩個方法: 你可以使用一個或多個 INCLUDE 參數列出你要導入的那些對象。 你可以使用 EXCLUDE 參數列出那些你不需要的內容,然后導入其余的內容。 因為我只需要一個對象,明確包含該對象比起明確不包括其它對象要輕易得多。我的 INCLUDE 參數值的第一部分是要害字 TABLE ,表明我要導入的對象是一個數據表(其它的可能是一個函數或一個過程)。 接下來是一個冒號,然后是一個 WHERE 子句的謂詞。我明確希望數據表名為 GNIS ,所以這個謂詞是 '= 'GNIS'' 。假如必要,則你可以寫出多個具體的謂詞。通過 INCLUDE 和 EXCLUDE 參數,你可以確切地指出以什么樣的粒度導入或導出。我建議你仔細地閱讀關于這兩個參數的文檔。它們的功能之強大和多功能性是我在本文中所無法描述的。 我可以很輕松地完成該模式的改變,將來自 GNIS 模式的數據表重新映射到 MICHIGAN 模式: REMAP_SCHEMA=gennick: michigan 我只需要關于密歇根州的數據行。為此,我可以使用 QUERY 參數來指定一個 WHERE 子句: QUERY='WHERE gnis_state_abbr='MI'' QUERY 在老的實用程序中也有,但只能用于導出操作。數據泵使 QUERY 也能用于導入操作,因為數據泵利用了 Oracle 較新的外部數據表功能。只要可能,數據泵會選擇直接路徑來導出或導入數據,包括從數據庫數據文件中讀取數據然后直接寫到一個導出轉儲文件中,或讀取轉儲文件然后直接寫入數據庫數據文件中。但是,當你指定了 QUERY 參數時,數據泵將使用一個外部數據表。對于一個導入任務,數據泵將使用 ORACLE_DATAPUMP 存取驅動程序建立一個外部數據表,并執行一條 INSERT...SELECT...FROM 語句。 我的最后一個要求是避免導入與已被導出的數據表相關的存儲參數。我希望 MICHIGAN 模式中的新 GNIS 表沿用該模式的默認表空間的默認存儲參數。原因是 MICHIGAN 的默認表空間不足以容納該數據表的本來大小,但是是以僅僅容納與密歇根有關的數據行。通過 TRANSFORM 參數,我可以告訴導入任務不要包含與原始表相關的任何數據段屬性: TRANSFORM=SEGMENT_ATTRIBUTES:N 這看起來是件小事,但以前有很多次我都希望老的導入實用程序的 TRANSFORM 參數有這樣的功能。我在試圖將少量生產數據導入到測試系統中時經常失敗,因為即使存儲生產數據的各個區段當中許多是空的,其數據量也比我測試系統所能支持的大得多。對于只導入一張數據表的情況,預先建立數據表是解決這個問題的一個辦法。然而,隨著數據表的增多,預先建表會很麻煩。而 TRANSFORM 這樣的簡單開關可以輕松地將轉儲文件中所有數據段的屬性全體忽略掉。 將我上面描述的所有選項放到一個參數文件中后,我可以調用導入實用程序,如下所示: impdp michigan/passWord parfile=gnis_import.par 當作為一個沒被授權的用戶進行導入時,你需要連接到目標模式。假如你擁有 IMP_FULL_DATABASE 角色,那么你可以用自己的身份登錄,然后導入到任何目標模式。 性能和多功能性 Oracle 數據泵比起以前的導出和導入實用程序在性能上有很大的提高。這種性能提高大部分來自于讀寫轉儲文件的并行操作。你可以指定并行程度來達到你所要求的速度與資源消耗的折中。下一步 下載本文所使用的示例數據 數據泵還很好地利用了 Oracle 數據庫其他最新開發的創新特性。 Flashback (回閃)用于確保導出數據的一致性,而 FLASHBACK_SCN 和 FLASHBACK_TIME 參數使你能夠完全控制這一功能。直接路徑( direct-path ) API 用于在任何可能的時候提高性能,當直接路徑 API 不能使用時,用外部數據表和新的 ORACLE_DATAPUMP 外部數據表存取驅動程序來傳輸數據。 數據泵除了提供全新的性能外還為你提供靈活性。這表現在 INCLUDE 和 EXCLUDE 參數、 QUERY 參數、 TRANSFORM 參數和其他參數的實現中,這些參數使你能夠精細地控制被加載和卸載的數據和對象。 人們一直在不斷地對 ' 大數據 ?quot; 的含意進行重新定義,這種數據庫容量之大在十年前還只能是夢想。在這樣的世界里,數據泵對于你的數據庫治理員所用的工具庫是個不錯的補充,使你能夠以前所未有的速度對數據庫進行數據導入和導出。 Jonathan Gennick ( Jonathan@Gennick.com ) 是一名經驗豐富的 Oracle 數據庫治理員和 Oracle 認證的專家,居住在密歇根州的上部半島。他在治理著 Oracle 文章電子郵件列表,你可以訪問 gennick.com 來了解其中的有關內容。 Gennick 最近參與編寫了《 Oracle Regular Expressions Pocket Reference , Oracle 正則表達式袖珍手冊》 (O'Reilly & Associates, 2003 出版 ) 一書。
排行榜
