天天看點

exp導出表不全

   使用EXP,IMP把A庫中的資料按使用者導入B庫,也是先在B庫建立表空間和對應的使用者,導入後無任何報錯資訊。

   為了謹慎起見,把兩個庫的對象進行對比( select object_type,count(*) from dba_objects where owner='owner_name' group by object_type order by object_type),結果真發現問題,A庫中有許多表和相關對象沒有導入B庫。查詢EXP日志,發現這些表根本沒有被導出。

   上網查了下資料,exp在11g時有個新特性,就是如果這個表為空的,即dba_tables中num_rows字段為空,則不進行導出。

   通過 select table_name, from dba_tables where owner='OWNER_NAME',發現大部分表都是num_rows字段為0,但還有不少字段值為空。

   空值原因是表沒有經過分析,可以有兩種方法: 1 analyze table xxx compute statistics;

2 exec 'DBMS_STATS.GATHER_TABLE_STATS('USER','TABLE');

   我使用第一種方法把使用者下所有的表都分析一遍:select 'analyze table '||table_name||' compute statistices;' from user_tables;

   再次檢查,發現num_rows沒有空值。

   接下來處理導不出來的問題。大概有三種解決辦法:

   1 insert 一行在rollback,就會産生segment;

     但需要insert的表太多,不太适合;

   2 設定deferred_segment_creation參數,預設為TRUE,當改為FALSE時,無論空表還是非空表都配置設定SEGMENT,語句:alter system set deferred_segment_creation=false scope=both;

      但該設定對以前的空表不産生作用,扔不能導出。

   3 查詢空表強行修改segment值:

繼續閱讀