问题分析
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 | select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 or num_rows is null; |
说明:使用 ALLOCATE EXTENT 可以为数据库对象的每一张表分配 Extent (注意针对每一张表,就是说一张表需要一条SQL 代码)。这样比较麻烦,我们通过 sql 语句查询 num_rows 为空的表,并生成 allocate extent 语句,批量执行语句即可。
检查设置
1 | # step1 检查是否有未分配 segment空间的表 |