近日单位oracle数据库软件升级到11g rac,在搭建和配置数据库的过程中没有任何问题,结果在运行最后的应用系统时发现系统无法运行,提示存储过程有错误,查找问题后才发现,由于这个过程中用exp导出导入过数据库文件,而再次导出数据库时发现应用系统用户下有很多空表并没有被导出,而应用系统在运行时会调用一些空表来完成一些操作等,经过查找资料发现:

      11G中有个新特性,当表无数据时,不分配segment,以节省空间

解决方法:

 1.insert一行,再rollback就产生segment了:

  该方法是在在空表中插入数据,再删除,则产生segment。导出时则可导出空表。

 2.设置deferred_segment_creation 参数:

show parameter deferred_segment_creation

NAME                                 TYPE        VALUE 
------------------------------------ ----------- ------------------------------ 
deferred_segment_creation            boolean     TRUE 
SQL> alter system set deferred_segment_creation=false; 

系统已更改。

SQL> show parameter deferred_segment_creation 

NAME                                 TYPE        VALUE 
------------------------------------ ----------- ------------------------------ 
deferred_segment_creation            boolean     FALSE

 该参数值默认是TRUE,当改为FALSE时,无论是空表还是非空表,都分配segment。

  需注意的是:该值设置后对以前导入的空表不产生作用,仍不能导出,只能对后面新增的表产生作用。如需导出之前的空表,只能用第一种方法。

3.   手动分配区:

先查询一下当前用户下的所有空表

select table_name from user_tables where NUM_ROWS=0;

把查询结果导出,执行导出的语句

'ALTERTABLE'||TABLE_NAME||'ALLOCATEEXTENT;'
-----------------------------------------------------------
for example:alter table abc allocate extent;

然后再执行 exp命令!成功!

 

4. 使用EXPDP/IMPDP工具可以导出空表: