ORACLE11g“空表”无法导出的深入分析
2016-03-01 20:38
627 查看
我觉得将空表无法导出描述为没有使用过的表无法导出应该更确切一些。oralce11g为了节省存储空间,新建表的时候默认是不分配segment的。既然segment都没有,就不用谈exp了。但是oracle还是预留了系统参数DEFERRED_SEGMENT_CREATION(延迟创建segment)。这个参数,默认是true。我们可以将他改成false。这样的话,再创建表的时候就会立即分配segment了。但是修改参数之前创建的没使用过的表还是不会立即分配segment的。如果想分配segment,可以在表中插入一条数据,再删除。也可以使用alter
table XXX allocate extent。这样就会创建segment了。再使用exp就会导出没使用过的表。
理解了oracle11g无法导出的不是空表而是没使用过的表之后,我们就不难看出,网络上很多人给出的查询批量修改无法导出的表的语句是错的。
比较常见的有:
select 'alter table '||table_name||' allocate extent;' 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;
我们来分析一下这两个select语句。num_rows = 0表示表里的记录数为0,但是这个数值是通过数据库执行analyze table之后写入的,而数据库执行analyze table是有条件的,所以num_rows并不能实时的表示表里面的记录数。num_rows
= 0, 对应表里的记录数可能会大于0。新创建的从未使用过的表在数据库没有执行analyze table之前,num_rows是NULL,只有执行了analyze table之后num_rows才会变成0。而且如果执行analyze table tablename delete statistics把表的统计信息删除,该表在user_tables中对应的num_rows会变成NULL。
也就是说num_rows =0 并不能说明这个表没有被使用过,也并不能说明这个表里没有记录。num_rows is null也不能说明这个表没有被使用过。
理解了表无法导出是因为没有分配segment之后,我们就可以写出真正的查询批量修改无法导出的表的语句了。
select 'alter table '||table_name||' allocate extent;' from user_tables where tablespace_name = 'PORTAL_HIS' and not exists(select 1 from dba_segments where segment_type ='TABLE'
and tablespace_name =user_tables.tablespace_name and dba_segments.segment_name = user_tables.table_name);
错误理解了“空表”无法导出,才写出了错误的select语句。只有真正弄明白了问题的原因,才能写出正确的应对方法。
table XXX allocate extent。这样就会创建segment了。再使用exp就会导出没使用过的表。
理解了oracle11g无法导出的不是空表而是没使用过的表之后,我们就不难看出,网络上很多人给出的查询批量修改无法导出的表的语句是错的。
比较常见的有:
select 'alter table '||table_name||' allocate extent;' 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;
我们来分析一下这两个select语句。num_rows = 0表示表里的记录数为0,但是这个数值是通过数据库执行analyze table之后写入的,而数据库执行analyze table是有条件的,所以num_rows并不能实时的表示表里面的记录数。num_rows
= 0, 对应表里的记录数可能会大于0。新创建的从未使用过的表在数据库没有执行analyze table之前,num_rows是NULL,只有执行了analyze table之后num_rows才会变成0。而且如果执行analyze table tablename delete statistics把表的统计信息删除,该表在user_tables中对应的num_rows会变成NULL。
也就是说num_rows =0 并不能说明这个表没有被使用过,也并不能说明这个表里没有记录。num_rows is null也不能说明这个表没有被使用过。
理解了表无法导出是因为没有分配segment之后,我们就可以写出真正的查询批量修改无法导出的表的语句了。
select 'alter table '||table_name||' allocate extent;' from user_tables where tablespace_name = 'PORTAL_HIS' and not exists(select 1 from dba_segments where segment_type ='TABLE'
and tablespace_name =user_tables.tablespace_name and dba_segments.segment_name = user_tables.table_name);
错误理解了“空表”无法导出,才写出了错误的select语句。只有真正弄明白了问题的原因,才能写出正确的应对方法。
相关文章推荐
- Oracle SQL性能优化
- Oracle EBS VMI/寄售(6)--不能创建冲减解决方案
- 各种数据库(oracle、mysql、sqlserver等)在Spring中数据源的配置和JDBC驱动包
- oracle备份恢复学习
- oracle中的术语
- Oracle 11g必须开启的服务及服务详细介绍
- oracle数据库中数据库名、实例名、数据库域名、全局数据库名、数据库服务名,ORACLE_SID
- oracle 迭代查询
- Oracle数据库数据迁移到MySQL数据库之connect by 问题
- Oracle12c中多宿主环境(CDB&PDB)的数据库触发器(Database Trigger)
- PYTHON 链接 Oracle
- Oracle JDeveloper 11g (11.1.2.3.0)下载地址
- Oracle数据库数据迁移到MySQL数据库之序列问题解决办法
- PHP 调用Oracle存储过程
- 老李分享: Oracle Performance Tuning Overview 翻译 2
- 老李分享: Oracle Performance Tuning Overview 翻译
- oracle常用sql函数和语句
- oracle常用sql函数和语句
- Oracle数据库数据迁移到MySQL数据库时间格式问题
- Oracle sysdate