Linux下執行資料泵expdp和impdp命令,字元轉義案例兩則

neverinit發表於2018-11-16


環境背景



    因為工作需要,需要使用資料泵將測試環境資料按照指定日期匯出(透過日期過濾掉部分歷史資料),匯出過程中遇到了字元轉義的問題。這裡專門挑選2個案例,在測試環境進行測試。另外,還對兩種案例使用parfile的方式進行測試。


    本次測試選擇的作業系統版本為RedHat6.5,Oracle資料庫版本為11.2.0.4,資料庫為單機單例項檔案系統部署。


案例簡介



案例一:

        過濾子句的字元轉義,如INCLUDE,EXCLUDE,QUERY等,這裡選擇QUERY子句進行測試。這也是實際開發測試過程中使用頻率較高的功能。


案例二:

        測試表名大小寫敏感,且使用特殊符號“$”。

              


案例一:資料過濾子句轉義



對於本案例,選擇了對使用parfile和不使用parfile兩個場景的測試。


場景1:直接在伺服器端執行命令,不使用parfile


(1)按照expdp命令規範設計匯出語句,原句(無轉義)執行情況如下

(2)根據上述錯誤資訊,對QUERY子句中的左右括號加上跳脫字元,並執行

(3)這個錯誤有點莫名其妙,猜測是雙引號的問題,對QUERY子句中的雙引號加上跳脫字元,並執行

(4)根據新的錯誤資訊,提示錯誤的子句前方有個“<”,猜測是大於小於號都需要轉義,修改後執行

(5)看著有點像那麼回事了,不過還是存在錯誤。看報錯資訊,只能是yyyy-mm-dd兩側的單引號有問題了,這次對QUERY子句中所有單引號加上‘\’並執行

執行很順利。回顧一下,上文一共對括號、單引號、雙引號、大於號、小於號等特殊字元做了轉義。


場景2:在伺服器端建立parfile檔案並執行expdp命令



(1)建立parfile檔案,並去掉所有引數中的跳脫字元

(2)使用parfile引數匯出

執行順利完成。


案例二:大小寫敏感且帶有特殊符號'$'的轉義



對於本案例,選擇了對使用parfile和不使用parfile兩個場景的測試。


場景1:直接在伺服器端執行命令,不使用parfile


(1)建立測試表,名稱小寫且帶有'$'字元

create table cams_core."test$escape"(id number,name varchar2(20));

(2)按照命令格式拼接匯出語句執行報錯

(3)顯然Linux將$escape解析成為環境變數,但變數是個空值,所以提示ORA-39166和ORA-31655的錯誤。這裡還測試了多組值,無一例外全部報錯。

        tables=test\$escape

        tables="test$escape"

        tables='"test$escape"'

        tables=\'\"test$escape\"\'

(4)經過多次驗證,正確的寫法為tables='\"test$escape\"'

執行順利完成。回顧一下,這裡對tables引數使用了單引號包含雙引號的方式,以保證系統能將"test$escape"解析成為小寫字母和'$'混合的字串。同時,按照Linux的要求對雙引號增加轉義。


場景2:在伺服器端建立parfile檔案並執行expdp命令



(1)建立parfile檔案,並去掉所有引數中的跳脫字元

(2)使用parfile引數匯出

執行順利完成。


總結分析




(1)在Linux下執行expdp或者impdp命令且帶有INCLUDE,EXCLUDE,QUERY等子句時,需要對括號、單引號、雙引號、大於號、小於號等特殊字元做轉義。

(2)在Linux下執行expdp或者impdp命令,如果需要匯出名字較為特殊的表,可以使用單引號包含雙引號的方式匯出,但需要對雙引號做轉義。

(3)使用parfile可以避免轉義的問題,減少很多不必要的麻煩。另外,還可以複用parfile,減少資料泵敲命令的時間。




各位讀者朋友也可關注作者微信公眾號“IT技術佳餚”,與作者交流。

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

相關文章