1. 程式人生 > >Oracle DB 移動數據

Oracle DB 移動數據

pdu 註釋 一個 tro 進行 obj feedback exe 賬號

描述移動數據的方式 ? 創建和使用目錄對象 ? 使用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 toExport 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 ofThreads 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 > LoadData 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 由兩部分組成:一部分描述OracleDB 的列類型,另一部分描述如何將外部數據映射到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 /*+ APPEND */ 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:描述數據庫中的目錄對象。

Oracle DB 移動數據