oracle 11G中有个新特性,当表无数据时,不分配segment,以节省空间。
因此,如果表内没有数据,采用 exp 导出时,那些空表就不会导出
insert一行,再rollback就产生segment了
该方法是在在空表中插入数据,再删除,则产生segment。导出时则可导出空表。
即,取消oracle11g的这个特性
SQL> 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该值设置后对以前导入的空表不产生作用,仍不能导出,只能对后面新增的表产生作用。
如需导出之前的空表,只能用第一种方法。
如果要导出的表中空表非常多,挨个插入数据再删除就非常麻烦了。
这里提供一种批量处理的方法。
select table_name from user_tables where NUM_ROWS=0;
假设我们这里有空表TBL_a,TBL_b,TBL_c,TBL_d,则查询结果如下:
alter table TBL_a allocate extent; alter table TBL_b allocate extent; alter table TBL_c allocate extent; alter table TBL_d allocate extent;将上面构造的SQL语句(查询的结果)批量执行即可