關於DataPump工具引發OGG中斷原因

xysoul_雲龍發表於2015-01-04

關於DataPump工具引發OGG中斷原因

一、問題描述
  
根據業務需求,備份某表中一行資料,在執行完該備份命令後,造成OGG中斷,造成中斷語句如下:
 

ORA-06564: object DIR_DP does not exist SQL CREATE TABLE XXX."ET$017DB8C30001"

   (  "ID",

           ..........--此處省略其他列資訊

            "ROLE"

   ) ORGANIZATION EXTERNAL

    ( TYPE ORACLE_DATAPUMP  DEFAULT DIRECTORY DMP_TEST ACCESS PARAMETERS (DEBUG =0 DATAPUMP INTERNAL TABLE  "FIRSOUL"."TEST"  JOB ( "FIRSOUL","FIRSOUL_TEST12301",1) WORKERID 1 PARALLEL 1 VERSION COMPATIBLE ENCRYPTPASSWORDISNULL ) LOCATION ('bogus.dat') )  PARALLEL 1 REJECT LIMIT UNLIMITED

    AS SELECT "ID", ...... "ROLE"

    FROM RELATIONAL("FIRSOUL"."TEST" ) KU$ where id=20141230;


從以上資訊可以看出,在執行expdp時,Oracle資料庫以建立外部表的方式匯出資料,在建立外部表時,會指定一個目錄(DIRECTORY),由於OGG目標端沒有該目錄造成此語句執行失敗。此前一直使用expdp工具做相關備份、匯出資料,並未發現此問題,問題出現後,在測試系統上分析引發該問題原因。

二、 問題分析過程
 
匯出語句如下:
 

---全表匯出語句

expdp firsoul/firsoul DIRECTORY=dmp_test tables=test DUMPFILE=firsoul_table04.dmp logfile=exp_firsoul_table03.log
---
匯出表中一行資料語句
expdp firsoul/firsoul DIRECTORY=dmp_test tables=test query=test:"where id=520000188" DUMPFILE=firsoul_table04.dmp logfile=exp_firsoul_table04.log


 
此次匯出,先執行一次全表匯出,而後執行的匯出表中一行資料,資料庫中建立外部表語句是在執行第二條語句後出現的。
 
檢視相關資料,得知,DataPump可以透過直接路徑和外部表路徑這兩種方法匯出資料。
  1
)直接路徑方式避開了資料庫快取記憶體,當使用直接路徑模式抽取資料時,DataPump從磁碟直接讀取資料檔案,抽取和格式化檔案內容,最後將內容寫出的轉儲檔案。該種方式和SGA互動等待少,其匯入匯出速度直接取決於資料庫所在磁碟速度和cpu,因此,直接路徑極為快速。
  2
)外部表路徑模式將使用到資料庫的告訴快取buffer cache,透過外部表路徑方式匯出資料時,DataPump使用普通的SELECT操作將資料塊從資料檔案中讀入BUFFER CACHE,為了寫出轉儲檔案,資料會在儲存中備格式化。透過外部表路徑匯入時,DataPump根據轉儲檔案的內容構造標準的插入語句,並且透過將資料塊從資料檔案讀至快取來執行這些語句,插入操作按照標準的樣式在快取中完成,如同普通DML操作一樣,外部表路徑也會同時產生撤銷和重做。

 

  DataPump工具會根據物件的複雜性自動選擇使用直接路徑還是外部表路徑方式,對於複雜的物件,為了分解複雜性而必須同SGA進行互動,此情況下DataPump只能採用外部表模式。我們可以透過access_method引數來控制其行為。例如一下語句

[oracle@firsoul backup]$ expdp firsoul/firsoul DIRECTORY=dmp_test tables=t_pic_edit query=t_pic_edit:"where id=20141230" DUMPFILE=firsoul_table07.dmp logfile=exp_firsoul_table07.log access_method=direct_path

 

Export: Release 11.2.0.3.0 - Production on Wed Dec 31 11:10:10 2014

 

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

 

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

ORA-39001: invalid argument value

ORA-39033: Data cannot be filtered under the direct path access method.


如以上資訊得知,我們無法使用直接路徑匯出資料,也就是當expdp匯出語句中存在引數query時,無法使用直接路徑方式,即使我們透過access_method引數指定,DataPump也會報錯。

 注意事項:在做DataPump相關操作時,建議新增access_method引數,尤其在配有OGGDG等災備工具的系統上,以免出現建立外部表語句造成OGGDG等災備工具中斷。

 

三、關於Datapump選擇匯出方式參考(參考文章:%e5%85%b3%e4%ba%8edatapump%e7%9a%84external_table%e6%a8%a1%e5%bc%8f.html)

若滿足右列條件EXPDP將採用direct_path即直接路徑模式

表結構允許使用直接路徑模式,舉例而言:

表上沒有啟用針對SELECT操作的fine-grained access control

非佇列表(queue table)

表上沒有BFILEopaque型別的列,或包含有opaque列的物件型別

表上沒有加密列

表上沒有被廢棄的舊型別列

若表上存在LONGLONG RAW型別列,則此列只能是最後一列
使用Expdp執行匯出任務時沒有為相關表指定QUERY, SAMPLE, or REMAP_DATA等引數

需要匯出的表或分割槽相對較少(多達250M),亦或者表或分割槽其實很大,但匯出任務無法工作在並行模式(未指定parallel引數,或parallel引數設定為1)

若滿足右列條件EXPDP將採用external_table即外部表模式

資料結構不滿足在直接路徑模式下抽取的條件,舉例而言:

表上啟用了針對SELECT操作的精細粒度控制

佇列表

表上包含了BFILEopaque型別列,或者包含有opaque列的物件型別

表上存在加密列

表上存在被廢棄的舊型別列

表上存在LONGLONG RAW型別列,且不是最後列

資料結構滿足使用直接路徑模式的條件,但執行匯出任務時相關表上指定了QUERY, SAMPLE, or REMAP_DATA等引數

資料結構滿足使用直接路徑模式的條件,但相關的表或分割槽相對較大(大於250M),此時並行SQL可以用來加速資料抽取

若滿足右列條件IMPDP將採用direct_path即直接路徑模式

資料結構滿足使用直接路徑模式的條件,舉例而言:

當匯入某單一表分割槽時該分割槽表上沒有建立全域性索引,這一點也包括分割槽的物件表

沒有基於LOB列建立的域索引(domain index)

cluster

表上沒有BFILE列或opaque型別列

表上沒有嵌入了opaque型別的VARRAY

表上沒有加密列

沒有啟用補全日誌(Supplemental logging)且表上沒有LOB型別列

若匯入表已預先建立了表建構,則需滿足以下條件:

表上沒有啟用的觸發器 並且 若是分割槽表則應有索引 並且 表上上沒有啟用針對INSERT操作的精細粒度控制 並且 表上除去check型別約束不存在其他型別約束 並且 表上沒有unique的索引

執行匯入任務時沒有為相關表指定QUERY, REMAP_DATA等引數

需要匯入的表或分割槽相對較小(少於250M),或者表或分割槽其實很大,但無法以並行模式匯入(未指定parallel引數或指定其為1)

若滿足右列條件IMPDP將採用external_table即外部表路徑

當資料結構不滿足在直接路徑模式下匯入的條件,舉例而言:

當匯入某單一表分割槽時該分割槽表上建有全域性索引,這一點也包括分割槽的物件表

表上有基於LOB列建立的域索引(domain index)

cluster

表上有BFILE列或opaque型別列

表上有嵌入了opaque型別的VARRAY

表上有加密列

啟用了補全日誌且表上有至少一個LOB

若匯入表已預先建立了表建構,且滿足以下條件:

表上有啟用的觸發器 或者

是分割槽表且沒有任何索引 或者

表上啟用了針對INSERT操作的精細粒度控制 或者

表上除去check型別約束還還有其他型別約束 或者

表上有unique的索引

執行匯入任務時有為相關表指定QUERY, REMAP_DATA等引數

資料結構滿足使用直接路徑模式的條件,但相關的表或分割槽相對較大(大於250M),此時並行SQL可以用來加速資料匯入

四、問題總結:

在執行第二條語句(匯出表中某一行)時,由於語句複雜性(引數query),需要檢索表中資料,進而必須與SGA進行互動,DataPump工具就會選擇透過外部表方式匯出資料,在匯出時出現建立外部表語句,而造成OGG中斷。如上述注意事項,在使用DataPump工具時,建議新增access_method引數(預設選擇直接路徑匯出方式),當DataPump工具強行選擇使用外部表方式匯出時,DataPump語句會報錯,以免造成OGGDG等災備工具中斷及其他問題。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29487349/viewspace-1389858/,如需轉載,請註明出處,否則將追究法律責任。

相關文章