前兩天,需要将遠端一個測試庫用expdp導出的資料dump導入到本地的一個測試環境中,其中碰到了一些問題,值得小結下。
環境介紹:
資料量:10+表,<1000萬的資料,dump檔案大約400多MB
源庫和目标庫都是11.2.0.4
字元集不同,源庫字元集是GBK,目标庫字元集是UTF-8
導入指令:
導入過程中碰到的兩個問題:
(1) 中文字元集轉換
這裡涉及到了字元集轉換的問題,中文在GBK字元集中占2位,但在UTF-8字元集中占3位,是以在GBK中儲存小于20個字元的情況下,導入到了UTF-8的庫中,就可能因為需要額外的字元空間導緻超出字段長度定義,報了ORA-12899的錯誤。
(2) 主外鍵關聯
由于有些表之間是存在主外鍵關聯的,expdp導出的時候選擇了data_only僅導出資料,impdp導入的時候會因未插入主鍵記錄而插入外鍵記錄,出現ORA-02291的錯誤,對于這種情況可以選擇先禁止主外鍵關聯,導入後再恢複關聯。
操作順序:
(a) 導入前,執行如下SQL找到需要禁止的外鍵關聯
(b) 執行(a)的結果SQL
(c) 導入後,執行如下SQL找到需要恢複的外鍵關聯
NOVALIDATE參數不會驗證已存儲的資料,但未來再插入的記錄則會遵循主外鍵關聯的關系。
總結:
使用10g以上版本提供的expdp/impdp資料泵導入導出工具,較以往的exp/imp工具,無論是在參數的可選擇性上,還是速度和壓縮比上,都有了不小的改進,提供更為友善快速的資料導入導出方法給我們。
導入導出可能碰到最多的問題,字元集轉換算是其中之一,要明确導入導出資料對字元集的依賴程度,才能確定資料導入導出的正确。
對于有主外鍵關聯的資料,如果選擇data_only僅導出資料,那麼可在導入前禁止限制,這樣導入過程不會受到主外鍵關聯的影響,導入後可以恢複限制,保證限制的正确。