天天看點

impdp/expdp使用心得

這幾個月經常使用impdp/expdp來做資料遷移,稍微總結一下。

1、如果dump備份檔案的使用者和即将導入的使用者不同,則需要使用remap_schema參數。而當使用了這個參數之後,還想用tables參數指定要導入的表,則必須在表前使用舊的“使用者名.表名”的方式,如從A使用者導出備份dump檔案,導入到B使用者中,隻導入表table1,則參數需要這樣使用:

impdp remap_schema=A:B tables=A.table1

2、同樣,如果導出和導入的表空間不同,則需要使用remap_tablespace參數。

3、如果隻導入表的資料,則使用content=data_only

4、關于table_exists_action參數:

當值為replace時,則隻對表有效,對其他資料庫對象無效,不要妄想它對sequence等也能生效。

當值為truncate時,導入前會先清空表,再導入,如果表之前存在外鍵限制,則truncate時可能會失敗,是以在使用truncate值時,建議先将要導入的表之間的外鍵限制disable掉。且建議使用truncate時,配合DATA_OPTIONS=SKIP_CONSTRAINT_ERRORS參數一起使用,否則導入的過程中,無法保證有外鍵限制的表之間的導入順序,可能會報錯。一般隻會對table進行操作,才會使用truncate參數,則可以考慮與content_data_only一起使用。

當值為append時,如果發生了主鍵、唯一鍵沖突,則會導緻導入失敗,建議提前排查。

注意:隻有replace導入後才會重新統計,否則建議使用dbms_stats.gather_table_stats來對所導入的表重新統計資訊,以便讓SQL優化器CBO獲得較佳的執行計劃,才能獲得更好的性能。

5、在導入過程中,可能出現卡死現象,可能有如下原因:

1)、sga太小,配置設定shared_pool等記憶體不足

2)、遇到過PROCESSING PASSWORD_HISTORY卡死的情況,則exclude=PASSWORD_HISTORY即可

3)、磁盤空間不足,使用df -h可以進行檢視

4)、如果是CPU 100%,則需要再進行定位

5)、如果是undo表空間不足,則可以調大undo表空間,在demo環境下,可以直接設定成自動擴充的

6)、temp表空間不足,同上

6、parallel參數,最好根據show parameter cpu中的參數來設定,我一般設定為網上推薦的cpu個數*每個cpu的線程個數-1。

這個parallel參數設定多少還真不一定,有時候設定大了,線程之間打架,反而幫倒忙。

如果資料量比較大,比如億級,很可能是分區表,則可以考慮将大的分區表,按分區拆分成一個個dump檔案,然後再配合parallel參數來完成導入。

7、當你使用了schema參數時,意味着你要導入該schema下全部的對象。

8、在執行impdp/expdp時,執行Ctrl + C不會退出程式,隻是進入了互動模式,如果想停止程序,則輸入指令:stop_job,回車即可。

如果想恢複,則使用CONTINUE_CLIENT繼續執行。

9、使用expdp備份時,建議exclude掉自己不需要備份的東西,比如:SYSTEM_GRANT、ROLE_GRANT、DEFAULT_ROLE、TABLE_QUOTA、PASSWORD_HISTORY、USER、GRANT等。

10、幾個小Tips:

1)、Linux上可以使用strings指令,直接檢視dump二進制檔案中的内容,可以看到表名等有用的資訊

2)、可以使用impdp指令将dump檔案轉換成sql檔案,需要使用到sqlfile參數,指定将dump生成的sql檔案名

3)、有時候include、exclude參數中,配置了很多值,在shell腳本中會太長,不美觀,則建議使用parfile參數,來指定參數檔案

4)、使用include和exclude時,括号、引号等符号,都需要進行轉義,如果覺得轉義比較麻煩,則将參數寫到parfile中就可以避免轉義問題

5)、使用impdp導入時,如果源表結構與目标表結構不同,還想導入的話,需要安裝XDB元件