使用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值: