在oracle11g的imp和exp的使用过程中,发现有些从来没有被插入数据的表总是导不出来,今天在导
表的时候借机研究一下,分享给大家,希望对有此困扰的同学提供帮助。
oracle11g的初始化参数deferred_segment_creation,这个参数我自己理解是延迟段的空间分配,意
思是说段建立以后,如果没有数据插入的时候,暂时不为段分配磁盘空间,这样节约了磁盘空间。这
个参数的默认值为true,及开启这个参数。
SQL> show parameter deferred_segment_creation;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean TRUE
为了解决这个问题,可以通过以下两种方式:
1、修改初始化参数deferred_segment_creation;
SQL> alter system set deferred_segment_creation=false;
System altered
这样无论有没有插入数据的表都会分配extent,这样我们可以使用exp将其导出,但是在修改这个参数
之前的空表这个办法是解决不了的,这个很好理解,所以我们介绍第二种方法;
2、手动为空表分配extent;
SQL> alter table t_oa_staff allocate extent;
Table altered
这样我们就可以讲没有插入过数据的表使用exp导出了,为了批量做这件事情,我采用
SQL> select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0
2 /
25 rows selected
SQL>
将查询的数据导出后批量执行下,问题解决了;