Oracle11g之后加入了新的特性,如果你创建了table,表中并没有插入数据,那么Oracle是不会分配extent给table以节省空间,所以在exp导数据的时候,空表将会无法被导出。原因在于deferred_segment_creation的参数默认为true。
解决方案如下
1、若空表已经建立,需要使用ALLOCATE EXTENT为每一张空表分配extent,这样就可以通过exp命令成功导出。
a、查看当前用户的所有空表,执行下面的SQL语句
SQL>select table_name from user_tables where NUM_ROWS=0;
*TIPS:
ALLOCATE EXTENT可以为数据库对象的每一张表分配Extent
针对数据表操作的完整语法如下:
ALTER TABLE [schema.] table_name ALLOCATE EXTENT [({ SIZE integer [K | M] | DATAFILE 'filename' | INSTANCE integer})]
构建最简单的extent命令如下:
alter table TableName allocate extent
也就是说有N张空表,我们就需要执行N次SQL语句,实在过于蛋疼。
b、拼接每张表的sql语句,执行下面的SQL命令,即可得到extent table的SQL语句。
SQL>Select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 or num_rows is null
输出结果如下:
然后复制执行就可以为空表分配extent。
c、需改 deferred_segment_creation参数为false,这样即使以后再新增空表,Oracle也会默认的对其分配extent了。
2、若空表还未建立,需要通过设置deferred_segment_creation参数来解决问题,该参数默认值为true,也就是说对空表不分配extent。
执行下面的SQL命令即可:
SQL>alter system set deferred_segment_creation=false;