国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁技術(shù)文章
文章詳情頁

Oracle10g:數(shù)據(jù)的導(dǎo)入導(dǎo)出

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