• 描述移動資料的方式 • 建立和使用目錄對象 • 使用SQL*Loader 加載非Oracle DB(或使用者檔案) 中的資料 • 使用外部表并通過與平台無關的檔案移動資料 • 說明Oracle 資料泵的一般體系結構 • 使用資料泵的導出和導入實用程式在Oracle DB 之間 移動資料
- 移動資料:一般體系結構

移動資料:一般體系結構 主要功能元件: • DBMS_DATAPUMP:包括高速導出與導入實用程式的API,可用于成批地移動資料和 中繼資料。 • 直接路徑API (DPAPI):Oracle Database 11g支援直接路徑API 接口,可在解除安裝和 加載時将資料轉換與文法分析工作量降至最低。 • DBMS_METADATA:Worker 程序使用該元件解除安裝或加載所有中繼資料。資料庫對象定 義是使用XML 存儲的,而不是SQL。 • 外部表API:使用ORACLE_DATAPUMP和ORACLE_LOADER通路驅動程式,可将 資料存儲在外部表中(即與平台無關的檔案中)。使用SELECT語句可讀取外部表, 就像外部表存儲在Oracle DB 中一樣。 • SQL*Loader:與外部表內建在一起,是以可為外部表通路參數提供自動移植加載 程式控制檔案的功能。 • expdp和impdp:瘦客戶機層,可通過調用DBMS_DATAPUMP程式包啟動和監視 資料泵操作。 • 其它客戶機:得益于此基礎結構的應用程式(如Database Control、複制應用程式、 可傳輸表空間應用程式和使用者應用程式)。SQL*Plus 也可用作DBMS_DATAPUMP的 一個客戶機,但隻提供實時操作的簡單狀态查詢。
- Oracle 資料泵:概覽
作為一個基于伺服器的用于高速移動資料與中繼資料的工具, Oracle 資料泵具有以下特點: • 可通過DBMS_DATAPUMP調用 • 可提供以下工具: – expdp – impdp – 基于Web 的界面 • 提供四種資料移動方法: – 資料檔案複制 – 直接路徑 – 外部表 – 網絡連結支援 • 可與長時間運作的作業分離後再重新挂接 • 可重新啟動資料泵作業
使用Oracle 資料泵可快速加載或解除安裝Oracle DB 的資料與中繼資料。資料泵基礎結構是通過 DBMS_DATAPUMP PL/SQL 程式包調用的。是以,通過使用資料泵可建構定制的資料移動 實用程式。 Oracle Database 11g提供以下工具: • 指令行導出與導入客戶機,分别稱為expdp和impdp • 基于Web 的導出與導入界面,可通過Database Control 通路 資料泵會自動确定要使用的資料通路方法;通路方法可能是直接路徑或外部表。如果表結 構允許使用直接路徑加載和解除安裝,而且希望單個流性能達到最大時,資料泵會使用直接路 徑加載和解除安裝。但是,如果存在聚簇表、引用完整性限制條件、加密列或一些其它項,數 據泵會使用外部表(而不是直接路徑)來移動資料。 因為資料泵能夠在與長時間運作的作業分離後重新挂接而不影響作業本身,是以你可以監 視多個位置正在運作的作業。隻要元資訊未受幹擾,就可重新啟動所有停止的資料泵作業 而不會丢失資料。無論作業是自發停止的,還是由于崩潰而非自發停止的,都無關緊要。
- Oracle 資料泵:優點
與早期的資料移動工具相比,資料泵具有許多優點并提供了 一些新的功能,如: • 細粒度級的對象和資料選擇 • 顯式指定資料庫版本 • 并行執行 • 估計導出作業占用的空間 • 在分布式環境中支援網絡模式 • 重新映射功能 • 資料取樣率和中繼資料壓縮 • 在資料泵導出期間壓縮資料 • 通過加密增強安全性 • 能夠将XMLType 資料作為CLOB 導出 • 在舊模式下支援舊的導入和導出檔案 Oracle 資料泵:優點 EXCLUDE、INCLUDE和CONTENT參數 用于細粒度級的對象和資料選擇。 可以通過指定要移動對象的資料庫版本(使用VERSION參數)來建立與支援資料泵的 低版本Oracle DB 相容的轉儲檔案集。 可以使用PARALLEL參數 指定代表導出作業而運作的活動執行伺服器的最大線程數。 使用ESTIMATE_ONLY 參數可估計導出作業占用的空間量(但實際上并不執行導出)。 使用網絡模式可從遠端資料庫直接導出到轉儲檔案集。使用指向源系統的資料庫連結可 完成此操作。 在導入過程中,可以更改目标資料檔案名、方案和表空間。 此外,還可指定執行資料泵導出時,要從源資料庫取樣和解除安裝的資料的百分比。指定 SAMPLE參數可完成此操作。 使用COMPRESSION參數 可訓示是否在導出轉儲檔案中壓縮中繼資料,以便占用更少的磁盤 空間。如果壓縮了中繼資料,導入過程中會自動執行解壓縮。 在Oracle Database 11g中新增了一些功能,使你可以: • 在導出期間同時壓縮資料和中繼資料,僅壓縮資料,僅壓縮中繼資料或者不壓縮資料。 • 指定以下幾個方面的附加加密選項: - 可選擇在導出期間同時加密資料和中繼資料,僅加密資料,僅加密中繼資料,不加 密資料或僅加密列。 - 可指定要在導出期間使用的特定加密算法。 - 可指定在導出期間要用于執行加密和解密的安全類型。例如,轉儲檔案集可能 會導入到其它資料庫或遠端資料庫,而在傳輸過程中必須保障其安全性。另外, 轉儲檔案集可能會使用Oracle Encryption Wallet 進行本地導入,但也可能需要在 無法使用Oracle Encryption Wallet 的情況下進行異地導入。 • 使用可移動方法執行表模式導出和導入;指定在執行導入操作期間應如何處理分區表。 • 在導出操作期間覆寫現有轉儲檔案。 • 在執行導入操作期間重命名表。 • 指定即使遇到違反非延遲限制條件的情況,也應繼續執行資料加載(這僅适用于使用 外部表通路方法的導入操作)。 • 指定無論為XMLType 列定義了何種XMLType 存儲格式,都要以未壓縮的CLOB 格 式導出這些列。 • 在導出期間指定重新映射功能,将指定列的原始值視為源,然後傳回一個重新映射值, 此值将替換轉儲檔案中的原始值。 • 在将資料導入到新資料庫時重新映射資料。 • 在舊模式下支援使用原有的導出(exp) 和導入(imp) 腳本。
- 資料泵的目錄對象
目錄對象是一些代表伺服器檔案系統上的實體目錄的邏輯結構。這些對象包含了特定操作 系統目錄的位置。可以在Enterprise Manager 中使用此目錄對象名,這樣就不必對目錄路 徑規範進行寫死,進而獲得更大的檔案管理靈活性。目錄對象由SYS使用者擁有。目錄 名在資料庫中是唯一的,因為所有目錄都位于一個名稱空間(即SYS)中。 為資料泵指定檔案位置時,需要用到目錄對象。這是因為資料泵通路的檔案在伺服器上, 而不是在客戶機上。 在Enterprise Manager 中,選擇“Schema > Database Objects > Directory Objects(方案> 資料庫對象> 目錄對象)”。 要編輯或删除一個目錄對象,請選擇該對象,然後單擊相應的按鈕。
- 建立目錄對象
1. 在“Directory Objects(目錄對象)”頁中,單擊“Create(建立)”按鈕。 2. 輸入目錄對象的名稱及目錄對象映射到的作業系統路徑。應先建立作業系統目錄, 之後才能使用這些目錄。你可以單擊“Test File System(測試檔案系統)”按鈕對此 進行測試。為了進行測試,請提供主機登入身份證明(即有權限對此作業系統目錄 進行操作的作業系統使用者)。
CREATE DIRECTORY "EXT_TAB_LOGDIR" AS '/home/oracle/extab1'
3. 目錄對象的權限不同于伺服器檔案系統實體目錄的作業系統權限。你可以管理各個 目錄對象的使用者權限。這樣做提高了安全級别,同時還允許你對這些對象進行粒度 級控制。在“Privileges(權限)”頁中,單擊“Add(添加)”,選擇要向其授予 讀權限、寫權限或讀寫權限的使用者。
GRANT READ ON DIRECTORY "EXT_TAB_LOGDIR" TO "HR","SCOTT"
GRANT WRITE ON DIRECTORY "EXT_TAB_LOGDIR" TO "HR","SCOTT"
4. 單擊“Show SQL(顯示SQL)”檢視基礎語句。完成後單擊“Return(傳回)”。 5. 單擊“OK(确定)”建立對象。
- 資料泵導出與導入客戶機:概覽
資料泵導出與導入客戶機:概覽 資料泵導出實用程式是這樣一種實用程式,它可以将資料和中繼資料解除安裝到名為“轉儲檔案 集”的作業系統檔案集中。資料泵導入實用程式則用于将導出轉儲檔案集中存儲的中繼資料 和資料加載到目标系統。 資料泵API 通路位于伺服器上的相應檔案,而非客戶機上的檔案。 上述這兩種實用程式還可以用于從遠端資料庫直接導出到轉儲檔案集,或者從源資料庫直 接加載目标資料庫,而無需使用任何幹預檔案。這被稱為“網絡模式”。從隻讀源資料庫 導出資料時,此模式尤其有用。 每個資料泵操作的核心為主表(MT),這是在運作資料泵作業的使用者方案中建立的表。MT 中儲存着作業的各個方面。MT 是在執行基于檔案的導出作業期間建構的,在導出操作的 最後一步會寫入轉儲檔案集。與之相反,将MT 加載到目前使用者的方案中是基于檔案的導 入操作的第一步,用于确定所有導入對象的建立順序。 注:如果作業出現計劃内或計劃外停止的情況,MT 是資料泵重新啟動作業功能的關鍵。 資料泵作業正常完成後,MT 即會删除。
- 資料泵實用程式:界面與模式
• 資料泵導出與導入界面: – 指令行 – 參數檔案 – 互動式指令行 – Enterprise Manager • 資料泵導出與導入模式: – 全部 – 方案 – 表 – 表空間 – 可移動表空間 資料泵實用程式:界面與模式 你可以使用下列界面之一與資料泵導出和導入實用程式進行互動: • 指令行界面:使你可以直接在指令行上指定大多數導出參數。 • 參數檔案界面:使你可以在參數檔案中指定所有指令行參數。唯一例外是PARFILE 參數。 • 互動式指令界面:停止登入到終端并顯示導出或導入提示符,在這些提示符下可輸 入各種指令。在使用指令行接口或參數檔案接口啟動導出操作過程中,按[Ctrl] + [C] 可啟用這種模式。另外,挂接到正在執行的作業或已停止的作業時,也能啟用互動 式指令模式。 • Web 界面:在Database Control 首頁上,單擊“Data Movement(資料移動)”選項 卡,然後從“Move Row Data(移動行資料)”區域選擇下列連結之一:“Export to Export Files(導出到導出檔案)”、“Import from Export Files(從導出檔案導入)” 或“Import from Database(從資料庫導入)”。
資料泵導出與導入針對解除安裝或加載資料庫的不同部分提供了不同的模式。在指令行上使用 相應參數可指定提供的模式。可用的模式已在上圖中列出,它們與原有導出和導入實用 程式中的模式相同。
- 使用Database Control 進行資料泵導出
Enterprise Manager Database Control 提供了一個向導程式來指導您完成執行資料泵導出與 導入的整個流程。以上示例顯示的是資料泵導出。 在“Database Instance(資料庫執行個體)”首頁中,單擊“Data Movement(資料移動)”選 項卡,定位到Web 頁的“Move Row Data(移動行資料)”部分的資料泵導出與導入選項。 單擊“Export to Export Files(導出到導出檔案)”開始資料泵導出會話。
接下來将顯示選擇導出類型視窗。如果一個已授權使用者連接配接到資料庫執行個體,則導出類型包 括以下内容: • 資料庫 • 方案 • 表 • 表空間 如果使用的是非管理帳戶,則導出類型清單僅限以下類型: • 方案 • 表 單擊“Continue(繼續)”繼續執行導出操作。 這裡需要注意,使用system賬号普通身份登陸,導出資料檔案。注意填寫主機身份證明。
- 資料泵導出示例:基本選項
上圖點選繼續後,點選添加需要導出的。
“Options(選項)”頁顯示資料泵導出作業的可配置選項。
“Maximum Number of Threads in Export Job(導出作業中的最大線程數)”條目對應于指令行中的PARALLEL 參數。指定的值應小于或等于轉儲檔案集中的檔案數。此選項決定了所使用的并行I/O 伺服器程序的數目,但在并行查詢操作中充當查詢協調程式的主要制程序和Worker 程序 不計入該總數。 導出作業要占用的磁盤空間的估計值(位元組)将輸出至标準輸出和日志檔案。估計值可 根據塊計數乘以塊大小得出,也可基于最近的統計資訊分析。此選項對應于ESTIMATE 指令行參數。
可以為導出作業指定一個可選的日志檔案,用于記錄與正在進行的工作、已完成的工作和 遇到的錯誤有關的消息。執行導出的使用者需要對為日志檔案指定的目錄對象享有寫權限。 如果要指定的日志檔案已存在,則會覆寫該檔案。此選項對應于指令行的LOGFILE參數。
- 資料泵導出示例:進階選項
單擊“Show Advanced Options(顯示進階選項)”連結即可顯示進階選項。
頁面的“Content(内容)”部分允許你過濾導出所解除安裝的内容:僅資料、僅中繼資料或者 這兩者。此選項對應于 CONTENT 指令行參數。“Content(内容)”部分還允許指定 INCLUDE 和 EXCLUDE 指令行參數。 使用 EXCLUDE參數可從導出或導入操作中排除任何資料庫對象類型。使用可選的名稱 限定符,你可以在指定的每個對象類型中進行更細的選擇,如下面幾個示例所示: EXCLUDE=VIEW EXCLUDE=PACKAGE EXCLUDE=INDEX:"LIKE 'EMP%'" INCLUDE參數可在操作中隻包含指定的對象類型和對象。 文法:INCLUDE = object_type[:"name_expr"] 導出資料時可使用閃回查詢。 QUERY參數與原有導出實用程式的工作方式相似,但前者具有兩個重要的增強功能:一個 功能是此參數可以通過一個表名稱來加以限定,進而使其隻适用于該表;另一個功能是此 參數還可以在導入過程中使用。下面是一個示例: QUERY=hr.employees:"WHERE department_id in (10,20)
- 資料泵導出示例:檔案
DUMPFILE參數指定了基于磁盤的轉儲檔案的名稱和(可選)目錄。可采用逗号分隔的 清單的形式或者單個DUMPFILE參數規範的形式提供多個檔案規範。檔案名可包含替代 變量%U,此變量表示可生成多個檔案。在生成的檔案名中,%U被擴充為雙字元、固定 寬度、從01開始單調遞增的整數。如果未指定DUMPFILE,則預設情況下使用 expdat.dmp。預設情況下,建立的轉儲檔案會自動擴充。 如果指定了 FILESIZE,則每個檔案的大小為FILESIZE位元組且不可擴充。如果需要更 多的轉儲空間,并且提供了帶%U的模闆,則會自動建立具有FILESIZE位元組的新檔案; 否則,客戶機會收到要添加新檔案的消息。 如果指定了帶%U的模闆,則最初建立的檔案數目等于PARALLEL參數。 預設情況下,不會覆寫與所生成檔案名比對的預先存在的檔案,而是會導緻錯誤并導緻 作業中止。如果希望覆寫檔案,可設定REUSE_DUMPFILES=Y。單擊“Next(下一步)” 繼續執行導出操作。 注:如果提供了多個轉儲檔案模闆,則會循環使用這些模闆生成轉儲檔案。 • 在使用資料泵導出之前,你不需要手動建立目錄對象。已經為每個資料庫建立了一個 名為DATA_PUMP_DIR的預設目錄對象,無論資料庫是建立的,還是由UNIX 或 Windows 平台上的腳本更新後得到的。系統會自動将通路DATA_PUMP_DIR目錄的 權限授予給EXP_FULL_DATABASE和IMP_FULL_DATABASE角色。 DATA_PUMP_DIR目錄是在下列位置之一建立的: - <ORACLE_BASE>/admin/DB_UNIQUE_NAME/dpdump - <ORACLE_HOME>/admin/DB_UNIQUE_NAME/dpdump DATA_PUMP_DIR的确切目錄路徑規範取決于ORACLE_BASE和ORACLE_HOME系 統環境變量值,以及是否存在DATA_PUMP_DIR子目錄。如果在目标系統上定義了 ORACLE_BASE,則使用該值。否則,使用ORACLE_HOME值。如果因某種原因而未 找到DATA_PUMP_DIR子目錄,則使用以下預設路徑: ORACLE_HOME/rdbms/log 注:在任何情況下,必須具有對目錄對象的适當通路權限才能執行所嘗試的操作。要執行 導出,需要有所有檔案的寫權限;導入時,需要有轉儲檔案的讀權限以及日志檔案和SQL 檔案的寫權限。
- 資料泵導出示例:排程
Oracle Enterprise Manager Database Control 可将資料泵作業(通過此向導建立的)排程為 可重複執行的作業。如果未指定“Job Name(作業名)”,則會使用系統生成的名稱。 單擊“Next(下一步)”繼續執行導出操作。
- 資料泵導出示例:複查
declare h1 NUMBER; begin h1 := dbms_datapump.open (operation => 'EXPORT', job_mode => 'TABLE', job_name => 'EXPORT_SCOTT_EMP', version => 'COMPATIBLE'); dbms_datapump.set_parallel(handle => h1, degree => 1); dbms_datapump.add_file(handle => h1, filename => 'EXPDAT.LOG', directory => 'EXT_TAB_LOGDIR', filetype => 3); dbms_datapump.set_parameter(handle => h1, name => 'KEEP_MASTER', value => 0); dbms_datapump.metadata_filter(handle => h1, name => 'SCHEMA_EXPR', value => 'IN(''SCOTT'')'); dbms_datapump.metadata_filter(handle => h1, name => 'NAME_EXPR', value => 'IN(''EMP'')'); dbms_datapump.add_file(handle => h1, filename => 'SCOTT_EMP%U.DMP', directory => 'DATA_FILE_DIR', filetype => 1); dbms_datapump.set_parameter(handle => h1, name => 'INCLUDE_METADATA', value => 1); dbms_datapump.set_parameter(handle => h1, name => 'DATA_ACCESS_METHOD', value => 'AUTOMATIC'); dbms_datapump.set_parameter(handle => h1, name => 'ESTIMATE', value => 'BLOCKS'); dbms_datapump.start_job(handle => h1, skip_current => 0, abort_step => 0); dbms_datapump.detach(handle => h1); end; /
“Review(複查)”頁顯示的是已輸入資訊的概要,通過該頁可檢視将用于導出作業的 PL/SQL 過程文法。單擊“Submit Job(送出作業)”按鈕繼續操作。作業送出後無法取 消,關閉浏覽器不會有不利影響。
- 資料泵導入示例:impdp
資料泵可以通過指令行調用,以便進一步指定指令行選項。 $ impdp hr DIRECTORY=DATA_PUMP_DIR \ DUMPFILE=HR_SCHEMA.DMP \ PARALLEL=1 \ CONTENT=ALL \ TABLES="EMPLOYEES" \ LOGFILE=DATA_PUMP_DIR:import_hr_employees.log \ JOB_NAME=importHR \ TRANSFORM=STORAGE:n 資料泵導入示例:impdp 資料泵提供了用于執行導入和導出操作的指令行客戶機。以上示例描述的是如何使用 impdp實用程式進行資料泵導入。使用指令行運作資料泵時,提供的選項更多一些。
- 資料泵導入:轉換
你可以: • 使用REMAP_DATAFILE重新映射資料檔案 • 使用REMAP_TABLESPACE重新映射表空間 • 使用REMAP_SCHEMA重新映射方案 • 使用REMAP_TABLE重新映射表 • 使用REMAP_DATA重新映射資料 REMAP_TABLE= 'EMPLOYEES':'EMP' 資料泵導入:轉換 由于對象中繼資料是以XML 的形式存儲在轉儲檔案集中,是以,在導入過程中形成DDL 時比較容易進行轉換。資料泵導入支援多種轉換: • 在具有不同檔案系統語義的平台之間移動資料庫時,REMAP_DATAFILE十分有用。 • 使用REMAP_TABLESPACE可将對象從一個表空間移至另一個表空間。 • REMAP_SCHEMA提供原有的FROMUSER/TOUSER功能,可用于更改對象所有權。 • REMAP_TABLE可用于重命名整個表。 • REMAP_DATA可用于在插入資料時重新映射資料。
- 使用Oracle Enterprise Manager 監視資料泵作業
可以使用Enterprise Manager 圖形使用者界面(GUI) 監視所有資料泵作業,包括使用 expdp或impdp指令行界面建立的作業,或使用DBMS_DATAPUMP程式包建立的作業。 可以檢視作業的目前狀态,還可将狀态更改為EXECUTE、STOP或SUSPEND。 要通路“Export and Import Jobs(導出和導入作業)”頁,請在“Maintenance(維護)” 頁的“Move Row Data(移動行資料)”區域中單擊“Monitor Export and Import Jobs (監視導出和導入作業)”連結。
- 以資料泵舊模式提供移植支援
• 輔助使用者從imp和exp實用程式過渡到impdp和 expdp實用程式 由于導入腳本和導出腳本的使用很廣泛,Oracle Database 11g發行版2 引入了資料泵舊 模式,輔助使用者進行移植。資料泵實用程式: 1. 如果在指令行或腳本中出現了exp/imp特有的參數,則進入舊模式 2. 如果可行,則将舊參數映射到等效的expdp或impdp參數 3. 顯示轉換後的指令,以便您檢視新文法并在時間允許的情況下修改腳本 4. 如果舊參數和新參數混雜出現,則退出舊模式(資料泵參數中混雜原有導出參數或 導入參數将導緻資料泵直接退出,而不執行所需任務。) 最佳實踐提示:Oracle 強烈建議檢視新文法,并在時間 允許的情況下更改腳本。
- 資料泵舊模式
資料泵導出和導入實用程式: • 僅讀寫資料泵格式的檔案 • 在舊模式下,接受exp和imp實用程式指令 • 其中包括的舊模式參數具有下述特點: – 可能與新文法完全相同: FILESIZE=integer[B | K | M | G] – 可能與新文法相類似: QUERY= query_clause – 如果指令已被資料泵預設值取代,則參數被忽略 BUFFER=integer COMPRESS={y|n} DIRECT={y|n} – 如果新舊文法混雜,則将引發錯誤 資料泵舊模式 資料泵實用程式隻處理資料泵格式的檔案。(exp實用程式建立的檔案必須由imp實用 程式來讀取。)在資料泵實用程式中,采用資料泵舊模式可繼續使用現有的腳本。但是, 如果要通路資料庫的新功能,則必須使用新的資料泵文法。 實用程式如果發現exp或imp特有的參數,則進入舊模式。 • 使用的參數完全相同時,将不會對其進行任何更改。示例: FILESIZE=integer[B | K | M | G]參數指定了轉儲檔案的最大大小。 • QUERY=query_clause參數不會導緻任何轉換,但是請注意,與已經廢棄的導出 實用程式相比,expdp實用程式處理查詢時的限制要少一些。是以查詢結果可能會 略有不同。 • 由于某些參數已被新的預設值取代,是以會被忽略。示例: - BUFFER=integer參數将被忽略,因為expdp實用程式中不包含正常路徑 模式。 - COMPRESS={y|n}參數将被忽略,因為expdp實用程式中不包含等效的參數。 - DIRECT={y|n}參數将被忽略,因為expdp實用程式将判斷請求的導出操作 應使用直接路徑還是外部表模式。 • exp/imp參數與資料泵參數混雜在一起會導緻作業失敗。
• 舊模式參數: – 如果可行,則映射到資料泵參數: consistent={y|n} -> FLASHBACK_TIME GRANTS=n -> EXCLUDE=CONSTRAINTS INDEXES=n -> EXCLUDE=INDEX LOG=filename -> LOGFILE=filename FILE=filename -> dumpfile=directory-object:filename – 可能與新文法相類似,但不完全相同: FEEDBACK=integer -> STATUS – 如果與新資料泵不相容,則會出錯: VOLSIZE=integer 使用資料泵舊模式可将廢棄的腳本轉換為目前版本。以下幾個參數可以映射到新文法: • 資料泵可識别目前時間并将CONSISTENT={y|n}參數映射到FLASHBACK_TIME 參數。 • 将GRANTS=n參數重新映射到EXCLUDE=GRANT。 • 将INDEXES=n參數重新映射到EXCLUDE=INDEX。 • 将LOG=filename參數重新映射到LOGFILE=filename。日志檔案内容(包括 參考性消息和錯誤消息)皆為expdp格式。 • 将FILE=filename參數重新映射到dumpfile=directory-object:filename。 但是如果expdp實用程式無法找到指向現有目錄對象的路徑,則将中止。 參數可以映射,但新功能與以前的不同。将FEEDBACK=integer參數重新映射到 STATUS。由于傳回的不僅僅是處理的行數,還包括導出作業的狀态,是以該映射不是 一種直接映射。 如果參數與資料泵不相容,則會導緻作業中止。exp實用程式的VOLSIZE=integer 參數指定了錄音帶卷大小。資料泵不使用錄音帶機,錄音帶由Oracle Secure Backup 負責管理。
- 管理檔案位置
• 原有的exp和imp實用程式:全限定的檔案名 • 用于指定檔案位置的資料泵目錄對象 – 預設值(早期版本):DATA_PUMP_DIR參數 – 新增可選DATA_PUMP_DIR_schema-name目錄對象 – 使用CREATE DIRECTORY和GRANTSQL 指令進行管理 – 出現以下情況時,為預設位置(與是否在舊模式下無關): — 指令行中不包含DIRECTORY參數 — 使用者不具備EXP_FULL_DATABASE權限 管理檔案位置 原有實用程式與資料泵實用程式處理檔案位置的方式之是以不同,是因為原有實用程式是 基于客戶機的(檔案名皆為全限定的檔案名)。 而資料泵實用程式則是基于伺服器的。資料泵實用程式要求在指定檔案位置時使用目錄對 象。所使用的目錄對象必須是方案可通路的對象。在早期版本中,由DATA_PUMP_DIR 初始化參數來設定預設位置。 此功能并未引入DBA 必須執行的新任務,而是引入了一個可選的 DATA_PUMP_DIR_<schema-name>目錄對象。 如果選擇使用CREATE DIRECTORY和 GRANTSQL 指令建立該目錄對象,則指定的方案即可使用資料泵導出或導入實用程式 (而這會影響到正常伺服器資源,如CPU、記憶體使用量和磁盤使用量)。 如果未在指令行中指定參數,且使用者不具備EXP_FULL_DATABASE權限,則資料泵實用 程式将使用此目錄對象。無論是否在舊模式下,資料泵實用程式都采用此方式。
- SQL*Loader:概覽
SQL*Loader 可将外部檔案中的資料加載到Oracle DB 的表中。它具有一個功能強大的數 據分析引擎,是以對資料檔案中資料的格式沒有什麼限制。 SQL*Loader 使用以下檔案: 輸入資料檔案:SQL*Loader 從控 制檔案中指定的一個或多個檔案(或作業系統的等效文 件)中讀取資料。從SQL*Loader 的角度看,資料檔案中的資料是按記錄組織的。一個 特定的資料檔案可采用固定記錄格式、可變記錄格式或流記錄格式。可通過控制檔案中 的INFILE參數指定記錄格式。如果未指定記錄格式,預設格式為流記錄格式。 控制檔案:控制檔案是一個文本檔案,它是使用SQL*Loader 可識别的語言編寫的。控制 檔案訓示SQL*Loader 在何處查找資料、如何分析和解釋資料以及在何處插入資料等等。 盡管不能精确地定義,但可認為控制檔案包含三個段。 • 第一段包含如下所示的會話範圍資訊: - 全局選項,如輸入資料檔案名和要跳過的記錄 - 用于指定輸入資料位置的INFILE子句 - 要加載的資料 • 第二個段包括一個或多個INTO TABLE塊。其中每一個塊都包含要在其中加載資料 的表的資訊(如表名和表列)。 • 第三個段是可選段,如果存在,則其中包含輸入資料。 日志檔案:SQL*Loader 開始執行時,會建立日志檔案。如果不能建立日志檔案,執行就 會終止。日志檔案包含加載操作的詳細說明,包括加載過程中發生的任何錯誤的說明。 壞檔案:壞檔案中包含被SQL*Loader 或Oracle DB 拒絕的記錄。當輸入格式無效時, SQL*Loader 就會拒絕資料檔案記錄。SQL*Loader 接受處理某一資料檔案記錄後,會将該 資料檔案記錄發送到Oracle DB,以便能夠作為一行插入到表中。如果Oracle DB 确定該 行有效,就會将該行插入到表中;如果确定該行無效,則會拒絕該記錄,然後 SQL*Loader 會将該記錄放入壞檔案中。 放棄檔案:僅當需要這種檔案并且指定了應啟用放棄檔案時,才會建立此檔案。放棄檔案 中包含的記錄是因不符合控制檔案指定的任何記錄選擇标準而從加載中過濾掉的記錄。
- 使用SQL*Loader 加載資料
使用“Load Data from User Files(從使用者檔案加載資料)”向導,可将平面檔案中的資料 加載到Oracle DB 中。 要顯示該向導,請選擇Enterprise Manager 中的“Data Movement > Move Row Data > Load Data from User Files(資料移動> 移動行資料> 從使用者檔案加載資料)”。
- SQL*Loader 控制檔案
SQL*Loader 控制檔案通知SQL*Loader 以下資訊: • 要加載資料的位置 • 資料格式 • 配置詳細資料: – 記憶體管理 – 記錄拒絕 – 中斷的加載處理詳細資料 • 資料操縱詳細資料 SQL*Loader 控制檔案 SQL*Loader 控制檔案是一個文本檔案,其中包含資料定義語言(DDL) 指令。DDL 用來控 制SQL*Loader 會話的以下方面: • SQL*Loader 在何處查找要加載的資料 • SQL*Loader 希望如何确定資料的格式 • SQL*Loader 在加載資料時采用了哪些配置(包括記憶體管理、選擇與拒絕标準、中斷 的加載處理等等) • SQL*Loader 如何處理正在加載的資料 1 -- This is a sample control file 2 LOAD DATA 3 INFILE 'SAMPLE.DAT' 4 BADFILE 'sample.bad' 5 DISCARDFILE 'sample.dsc' 6 APPEND 7 INTO TABLE emp 8 WHEN (57) = '.' 9 TRAILING NULLCOLS 10 (hiredate SYSDATE, deptno POSITION(1:2) INTEGER EXTERNAL(3) NULLIF deptno=BLANKS, job POSITION(7:14) CHAR TERMINATED BY WHITESPACE NULLIF job=BLANKS "UPPER(:job)", mgr POSITION(28:31) INTEGER EXTERNAL TERMINATED BY WHITESPACE, NULLIF mgr=BLANKS, ename POSITION(34:41) CHAR TERMINATED BY WHITESPACE "UPPER(:ename)", empno POSITION(45) INTEGER EXTERNAL TERMINATED BY WHITESPACE, sal POSITION(51) CHAR TERMINATED BY WHITESPACE "TO_NUMBER(:sal, '$99,999.99')", comm INTEGER EXTERNAL ENCLOSED BY '(' AND '%' ":comm * 100" ) 此示例控制檔案的說明(按行号)如下所示: 1. 注釋可出現在檔案指令段中的任何位置,但絕不能出現在資料内部。任何注釋之前 都有兩個連字元。雙連字元右邊的所有文本(直至行尾)都會被忽略。 2. LOAD DATA語句通知SQL*Loader 開始新資料加載操作。如果要繼續執行已中斷的 加載操作,請使用CONTINUE LOAD DATA語句。 3. INFILE關鍵字指定含有待加載資料的資料檔案的名稱。 4. BADFILE關鍵字指定要在其中放置拒絕記錄的檔案的名稱。 5. DISCARDFILE關鍵字指定要在其中放置放棄記錄的檔案的名稱。 6. APPEND關鍵字是将資料加載到非空表時可以使用的選項之一。要将資料加載到空表 中,請使用INSERT關鍵字。 7. 使用INTO TABLE關鍵字可辨別表、字段和資料類型。此關鍵字定義了資料檔案記 錄與資料庫表之間的關系。 8. WHEN子句指定在SQL*Loader 加載資料之前每條記錄必須比對的一個或多個字段條 件。在此示例中,SQL*Loader 僅當第57 個字元為小數點時才加載記錄。這個小數點 用于分隔字段中的美元和美分,如果SAL不包含任何值,這個小數點會導緻記錄被 拒絕。 9. TRAILING NULLCOLS子句提示SQL*Loader 将記錄中不存在的任何相關占位列視 為空列。 10.控制檔案的餘下部分包含一些字段清單,用于提供正在加載的表中列格式的資訊。
- 加載方法
直接路徑加載與正常路徑加載的比較 儲存資料的方法 正常路徑加載通過執行SQL INSERT語句,将表填充到Oracle DB 中。直接路徑加載通 過格式化Oracle 資料塊并将其直接寫入資料庫檔案,消除了大部分Oracle DB 開銷。直接 加載不與其他使用者争用資料庫資源,是以其資料加載速度通常與磁盤速度相差無幾。正常 路徑加載使用SQL 處理和資料庫COMMIT操作來儲存資料。插入記錄數組後要執行 COMMIT操作。每次資料加載可能涉及多個事務處理。 直接路徑加載使用資料儲存将資料塊寫入Oracle 資料檔案。這就是為什麼直接路徑加載 比正常路徑加載快很多的原因。 通過以下特性可區分資料儲存與COMMIT的差異: • 在資料儲存期間,隻有完整的資料庫塊才寫入資料庫中。 • 這些塊是在按照表的高水位标記(HWM) 寫入的。 • 完成資料儲存後,HWM 會移動。 • 完成資料儲存後不會釋放内部資源。 • 完成資料儲存不會結束事務處理。 • 每次執行資料儲存時不會更新索引。
- 外部表
外部表是以檔案形式存儲在Oracle DB 外的作業系統上的 隻讀表。
外部表 外部表通路外部源中的資料時,就好像該資料位于資料庫内的表中一樣。你可以連接配接到數 據庫并使用DDL 建立外部表的中繼資料。外部表的DDL 由兩部分組成:一部分描述Oracle DB 的列類型,另一部分描述如何将外部資料映射到Oracle DB 的資料列。 外部表不描述資料庫中存儲的任何資料,也不描述資料如何存儲在外部源中。而是描述外 部表層怎樣向伺服器提供資料。通路驅動程式和外部表層會對外部檔案中的資料進行必要 的轉換,使這些資料與外部表定義相符,這是通路驅動程式和外部表層的責任。外部表為 隻讀表,是以無法執行DML 操作,也不能對其建立索引。 外部表使用兩種通路驅動程式。ORACLE_LOADER通路驅動程式隻能用于讀取外部表中的 表資料并将其載入資料庫。它使用 文本檔案 作為資料源。ORACLE_DATAPUMP通路驅動程 序既可以将表資料從外部檔案載入資料庫中,也可以将資料從資料庫解除安裝到外部檔案中。 它使用 二進制檔案作為外部檔案。這些二進制檔案與impdp和expdp實用程式所用檔案 的格式相同,并可與之互換。
- 外部表的優點
• 可直接使用外部檔案中的資料或将資料加載到另一個 資料庫。 • 可以同時查詢外部資料和資料庫中駐留的表,并可将 外部資料與資料庫中的表直接聯接,而不必先加載外 部資料。 • 複雜查詢的結果可解除安裝到外部檔案中。 • 可組合來自不同源的已生成檔案在加載中使用。 外部表的優點 為外部表建立的資料檔案是可移動的資料檔案,可用作同一資料庫或不同資料庫中另一外 部表的資料檔案。可以同時查詢外部資料和資料庫中駐留的表,并可将外部資料與資料庫 中的表直接聯接,而不必先加載外部資料。可選擇讓應用程式使用SELECT指令直接通路 外部表,也可選擇先将資料加載到目标資料庫。 複雜查詢的結果可使用ORACLE_DATAPUMP通路驅動程式解除安裝到外部檔案中。 可在另一外部表的LOCATION子句中指定由不同外部表填充的所有資料檔案。這樣,可 輕松地将多個源的資料彙集到一起。唯一的限制是,所有外部表的中繼資料必須完全相同。
- 使用ORACLE_LOADER定義外部表
CREATE TABLE extab_employees (employee_id NUMBER(4), first_name VARCHAR2(20), last_name VARCHAR2(25), hire_date DATE) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY extab_dat_dir ACCESS PARAMETERS ( records delimited by newline badfile extab_bad_dir:'empxt%a_%p.bad' logfile extab_log_dir:'empxt%a_%p.log' fields terminated by ',' missing field values are null ( employee_id, first_name, last_name, hire_date char date_format date mask "dd-mon-yyyy")) LOCATION ('empxt1.dat', 'empxt2.dat') ) PARALLEL REJECT LIMIT UNLIMITED; 使用ORACLE_LOADER定義外部表 外部表的中繼資料是使用SQL 語言在資料庫中建立的。ORACLE_LOADER通路驅動程式使 用SQL*Loader 文法來定義外部表。此指令并不建立外部文本檔案。 示例顯示建立了三個目錄對象(extab_dat_dir、extab_bad_dir和 extab_log_dir),并且這三個目錄對象已映射到使用者有權通路的現有作業系統目錄。 通路extab_employees表時,将使用SQL*Loader 功能來加載該表,并由此建立相應 日志檔案和壞檔案。 最佳實踐提示:如果有大量資料要加載,請為加載操作啟用PARALLEL: ALTER SESSION ENABLE PARALLEL DML;
- 使用ORACLE_DATAPUMP填充外部表
CREATE TABLE ext_emp_query_results (first_name, last_name,department_name) ORGANIZATION EXTERNAL ( TYPE ORACLE_DATAPUMP DEFAULT DIRECTORY ext_dir LOCATION ('emp1.exp','emp2.exp','emp3.exp') ) PARALLEL AS SELECT e.first_name,e.last_name,d.department_name FROM employees e, departments d WHERE e.department_id = d.department_id AND d.department_name in ('Marketing', 'Purchasing'); 使用ORACLE_DATAPUMP填充外部表 示例顯示外部表填充操作如何有選擇地導出由聯接EMPLOYEES和DEPARTMENTS兩個 表生成的一組記錄。 由于外部表可能非常大,是以可使用并行填充操作将資料解除安裝到外部表。與外部表并行查 詢相反,并行填充操作的并行度受到通路驅動程式可寫入的并行檔案數目的限制。在特定 時間點,決不能有多個并行執行伺服器寫入同一個檔案。 LOCATION子句中的檔案數必須與指定的并行度比對,因為每個輸入/輸出(I/O) 伺服器進 程都需要使用自己的檔案。此時,會忽略指定的任何多餘檔案。如果指定的并行度沒有足 夠的檔案數,則會降低并行度來比對LOCATION子句中的檔案數。 填充後的外部表為隻讀表。SELECT指令可以很複雜,通過該指令可将特定資訊填充到外 部表中。然後就可以将與二進制資料泵檔案具有相同檔案結構的外部表移植到另一系統, 并使用impdp實用程式來實施導入或以外部表的方式進行讀取。
- 使用外部表
• 查詢外部表 SQL> SELECT * FROM extab_employees; • 查詢外部表并将其與内部表進行聯接 SQL> SELECT e.employee_id, e.first_name, e.last_name, d.department_name FROM departments d, extab_employees e WHERE d.department_id= e.department_id; • 将資料從外部表附加到内部表 SQL> INSERT INTO hr.employees SELECT * FROM extab_employees; 使用外部表 可以像查詢内部資料庫表一樣查詢外部表。第一個示例說明的是查詢外部表 EXTAB_EMPLOYEES,并僅顯示結果。結果未存儲在資料庫中。 第二個示例說明的是聯接内部表DEPARTMENTS與外部表EXTAB_EMPLOYEES,并僅顯示 結果。 第三個示例說明的是查詢和加載外部表中的資料,然後直接将資料附加到 内部表的資料之後。
- 資料字典
可在以下位置檢視關于外部表的資訊: • [DBA| ALL| USER]_EXTERNAL_TABLES • [DBA| ALL| USER]_EXTERNAL_LOCATIONS • [DBA| ALL| USER]_TABLES • [DBA| ALL| USER]_TAB_COLUMNS • [DBA| ALL]_DIRECTORIES 資料字典 以上資料字典視圖列出了以下表資訊: [DBA| ALL| USER]_EXTERNAL_TABLES:資料庫中外部表的特定屬性。 [DBA| ALL| USER]_EXTERNAL_LOCATIONS:外部表的資料源。 [DBA| ALL| USER]_TABLES:資料庫中關系表的說明。 [DBA| ALL| USER]_TAB_COLUMNS:資料庫中表、視圖和聚簇表的列的說明。 [DBA| ALL]_DIRECTORIES:描述資料庫中的目錄對象。