Oracle导出表只会导出占用数据空间的数据,Oracle11g新增特性deferred_segment_creation,默认值为true,表示如果你创建表但是没往其插入数据,这个表是不会立即分配extent,即不占数据空间,表也不会分配segment,所以导致Oracle11g无法导出空表,具体表现在系统表user_tables中segment_created字段为"NO",(空表集合)。
select segment_created,table_name from user_tables where segment_created = 'NO';
以下提供三种解决方法:
一、往空表中插入数据后再删除。(不推荐)
二、设置deferred_segment_creation参数为false,再查出空表集合,删除后重建。因为命令只作用于之后的数据表。(不推荐)
-- sql窗口执行效果 alter system set deferred_segment_creation = false; -- 命令窗口查看效果 show parameter deferred_segment_creation;
三、使用ALLOCATE EXTENT,可以针对每张数据表/索引/视图等手工分配Extent(推荐)
其基本语法如下:
ALLOCATE EXTENT {SIZE integer [K | M] | DATAFILE 'filename' | INSTANCE integer };
针对数据表语法如下:
-- 针对数据表完整语法 ALTER TABLE [schema.] table_name ALLOCATE EXTENT [({SIZE integer [K | M] | DATAFILE 'filename' | INSTANCE integer })]; -- 针对数据表简单实例 alter table table_name allocate extent;
具体实现操作步骤:
1.查找当前用户所有空表,并构建命令语句,为了生成空表集合。
-- 查找所有空表sql select table_name from user_tables where NUM_ROWS=0; -- 构造所有空表的命令语句 select 'alter table' || table_name || 'allocate extent' from user_tables where NUM_ROWS=0 OR NUM_ROWS IS NULL;
效果图如下:
2.I.(针对含有PL/sql工具)可直接在PL/sql中在标题上全选复制,往命令窗口粘贴即可。
II.(若无PL/sql工具),可用文本写入如下sql脚本,然后通过cmd窗口进行操作,
-- 隐藏标题行、提示、结果返回行数,显示命令执行结果,具体参照:sqlplus命令大全。 set heading off; set echo off; set Feedback off; set termout on; spool E:\alter.sql; Select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 or num_rows is null; spool off;
本文参考:http://www.pinhuba.com/oracle/101128.htm