Oracle11g使用exp空表不导出问题

问题分析

ORACLE 11g 用 exp 命令导出库文件备份时,只能导出来一部分表而且不提示错误。因为 Oracle 11g中有个新特性:新增了一个参数“deferred_segment_creation”,含义是段延迟创建,默认是 true。

如果这个参数设置为 true,新建了一个表 Table1,并且没有向其中插入数据,那么这个表不会立即分配 extent,也就是不占数据空间,即表也不分配 segment 以节省空间,所以这些表不会导出来。

解决方案

step1

设置 deferred_segment_creation 使之后新增的表自动分配segment空间

1
alter system set deferred_segment_creation=false

说明:在安装 oracle 时最好就设置这个参数为 false。因为该值设置后只对后面新增的表产生作用,对之前建立的已经存在的空表不起作用(旧的表可使用下面第二种方式处理),仍不能导出。并且要重新启动数据库,让参数生效。

step2

为已经存在的表分配 segment空间

1
2
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 or num_rows is null; 
# 查出所有未分配segment空间的表,并强制分配segment空间

说明:使用 ALLOCATE EXTENT 可以为数据库对象的每一张表分配 Extent (注意针对每一张表,就是说一张表需要一条SQL 代码)。这样比较麻烦,我们通过 sql 语句查询 num_rows 为空的表,并生成 allocate extent 语句,批量执行语句即可。

检查设置

1
2
3
4
5
6
7
# step1 检查是否有未分配 segment空间的表
SELECT table_name,segment_created as "是否已生成表空间" FROM user_tables WHERE segment_created = 'NO';

# step2 检查新表是否默认生成segment空间
sqlplus /nolog
conn /as sysdba
show parameter deferred_segment_creation
0%