在以往的项目中我们遇到这样一种情况,Oralce数据库导出后,在目标库上做导入时发现缺表、少表,这是什么原因导致的呢?
原来Oracle11g中有个新特性,当表中无数据时,数据库不会给空表分配Segment,以节省空间。
那么如何处理空表的导出或给空表分配Segment空间呢?
方法一:
在空表中insert一行记录,再Rollback回滚就产生Segment了
该方法是在在空表中插入数据,再删除,则产生Segment,导出时则可导出分配了Segment的“空表”。
方法二:
设置Oracle数据库deferred_segment_creation参数
登录Oracle DBA用户,查看deferred_segment_creation当前值,默认为true,将其修改为false即可。
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
*需注意的是:该值修改后对已经存在的空表不产生作用,只对设置后的库和表有效。如需导出之前的空表,只能用第一种方法。
下面提供一种对已经存在的空表 导出的批量处理方法:
首先使用下面的sql语句查询一下当前用户下的所有空表
select table_name from user_tables where NUM_ROWS=0;
然后用一下SQL语句执行查询
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0
执行结果如下:
alter table tabName1 allocate extent;
alter table tabName2 allocate extent;
alter table tabName3 allocate extent;
alter table tabName4 allocate extent;
粘贴上面的SQL语句执行后,再进行导出即可。