最近做Oracle 11g数据库迁移时发现,使用exp导出dmp文件时有些没有数据的空表没有被导出,查了一下才发现Oracle 11g有一个新特性,默认新建表时没有分配 segment (段),插入数据才会自动分配,据说是为了节省空间,这里解决方案有两种:
1、修改默认的segment分配参数deferred_segment_creation(延迟段创建),默认为TRUE(延迟创建),需要注意的是修改之后只能对后面新建的表起作用,已经建好的空表参考方案2,
查看默认deferred_segment_creation(延迟段创建)参数,
show parameter deferred_segment_creation,
修改deferred_segment_creation为false(不延迟段创建),
alter system set deferred_segment_creation=false,
这里修改之后需要重启oracle才能生效,记住重启之后才能生效;
2、上面的解决方案只能针对后面新建的表,已经建好的空表要导出需要按照下面的方法处理
查询没有分配segment的空表,
select t.table_name,t.segment_created from user_tables t where t.segment_created='NO';
生成给空表分配分区语句,
select 'alter table '||table_name||' allocate extent;' from user_tables where segment_created='NO';
执行语句
alter table T_NULL allocate extent;
重新exp的时候就可以导出空表了