Oracle10g 數據的導入導出 給數據泵加壓
2024-08-29 13:38:20
供稿:網友
 
             
  Oracle 數據庫 10g 中的新的實用程序使其性能和多功能性達到了新的水平。 
  
                                                                                              Oracle 數據庫 10g 中增加的叫做 Oracle Data Pump (數據泵)的新的導入和導出特性,徹底改變了數據庫用戶已經習慣的過去幾代 Oracle 數據庫的客戶 / 服務器工作方式。現在服務器可以運行導出和導入任務。你可以通過并行方式快速裝入或卸載大量數據,而且你可以在運行過程中調整并行的程度。導出和導入任務現在可以重新啟動,所以發生故障不一定意味著要從頭開始。 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 是個很有意思的參數。當你需