处理Oracle11g导出数据库不含空表(缺少表)的问题

  • A+
所属分类:数据库

在以往的项目中我们遇到这样一种情况,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语句执行后,再进行导出即可。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: