描述移動數據的方式
• 建立和使用目錄對象
• 使用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 數據泵具備如下特色:
• 可經過DBMS_DATAPUMP調用
• 可提供如下工具:
– expdp
– impdp
– 基於Web 的界面
• 提供四種數據移動方法:
– 數據文件複製
– 直接路徑
– 外部表
– 網絡連接支持
• 可與長時間運行的做業分離後再從新掛接
• 可從新啓動數據泵做業
使用Oracle 數據泵可快速加載或卸載Oracle DB 的數據與元數據。數據泵基礎結構是經過DBMS_DATAPUMP PL/SQL 程序包調用的。所以,經過使用數據泵可構建定製的數據移動實用程序。
Oracle Database 11g提供如下工具:
• 命令行導出與導入客戶機,分別稱爲expdp和impdp
• 基於Web 的導出與導入界面,可經過Database Control 訪問
數據泵會自動肯定要使用的數據訪問方法;訪問方法多是直接路徑或外部表。若是表結構容許使用直接路徑加載和卸載,並且但願單個流性能達到最大時,數據泵會使用直接路徑加載和卸載。可是,若是存在聚簇表、引用完整性約束條件、加密列或一些其它項,數
據泵會使用外部表(而不是直接路徑)來移動數據。
由於數據泵可以在與長時間運行的做業分離後從新掛接而不影響做業自己,因此你能夠監視多個位置正在運行的做業。只要元信息未受干擾,就可從新啓動全部中止的數據泵做業而不會丟失數據。不管做業是自發中止的,仍是因爲崩潰而非自發中止的,都可有可無。
與早期的數據移動工具相比,數據泵具備許多優勢並提供了一些新的功能,如:
• 細粒度級的對象和數據選擇
• 顯式指定數據庫版本
• 並行執行
• 估計導出做業佔用的空間
• 在分佈式環境中支持網絡模式
• 從新映射功能
• 數據取樣率和元數據壓縮
• 在數據泵導出期間壓縮數據
• 經過加密加強安全性
• 可以將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 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 可將外部文件中的數據加載到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 會將該記錄放入壞文件中。
放棄文件:僅當須要這種文件而且指定了應啓用放棄文件時,纔會建立此文件。放棄文件中包含的記錄是因不符合控制文件指定的任何記錄選擇標準而從加載中過濾掉的記錄。
使用「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 控制文件是一個文本文件,其中包含數據定義語言(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子句中指定由不一樣外部表填充的全部數據文件。這樣,可輕鬆地將多個源的數據聚集到一塊兒。惟一的限制是,全部外部表的元數據必須徹底相同。
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;
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:描述數據庫中的目錄對象。