澳门金沙vip 1

澳门金沙vipPLSQL数据导入导出问题解决(空表、大字段表、表空间错误等)

在给客户培训的过程中,发现客户数据库服务器存在一个奇怪的现象。客户数据库服务器环境为AIX6+Oracle11gR2,具体现象如下:

PLSQL使用方法简单,平常使用较多,但在平常使用过程中,遇到一些问题,下面简单罗列并进行解决。这些解决方法大多通过网络查找获得,这里只是进行简单整理。

执行EXP导出时,部分表提示
EXP-00011:表不存在错误,但是查询user_all_tables视图,此表确实是存在的,并且执行select语句也能成功,不过表为空表,查看权限等也没有问题。后来通过查询资料,发现问题是由Deferred
Segment Creation参数引起的。

使用的数据库版本为:Oracle11g。

Deferred Segment Creation,延迟段创建,Oracle11gR2新增参数,
具体用处是当新创建一个可能会有Segment的对象时,如果这个对象中还没有任何记录需要消耗一个Extent,那么将不会在创建对象时自动创建Segment,这样做的好处是在创建对象时大大提高了速度。但是这么一来,因为对象没有Segment,执行EXP导出时,就会报EXP-00011错误。

通用方法:表结构和数据分开导出导入,通用方法可以解决很多问题,对于下面的错误页可以通过这个方法进行解决。

以报错的表cf_template为例,执行以下查询:

方法说明:通过工具—>导出用户对象
导出用户表结构,可以通过编辑方式对表结构进行编辑后在导入的时候选择导入表—>SQL插入方式导入表结构。

复制代码 代码如下:SQL show parameter
DEFERRED_SEGMENT_CREATION

              
表结构导入后可以采用dmp导入导出的方式进行数据导入,对于部分表可以采用数据复制的方式进行数据导入。

NAME TYPE VALUE

1、在数据导出的时候,无法导出空表,提示错误“导出表报EXP-00011:table不存在”。


原因:11g默认创建一个表时不分配segment,只有在插入数据时才会产生(当然也可以强制分配),以节省磁盘空间。


解决方法:

deferred_segment_creation boolean TRUE

           
第一种:在空表中插入一条数据然后再对插入的数据进行删除,便可以进行数据导出(如果表少的话可以手动执行,对于多个表的情况可以采用语句进行批量操作的)。

发现Deferred Segment Creation已经打开,再执行:复制代码 代码如下:SQL select segment_name from
user_segments where segment_name=’CF_TEMPLATE’;

           
第二种:可以使用手工为空表分配Extent的方式,来解决导出之前建立的空表的问题。

no rows selected

                        查找空表语句:select ‘alter table
‘||table_name||’ allocate extent;’ from user_tables where num_rows=0;

没有返回值,数据库确实没有给CF_TEMPLATE表创建Segment,这就验证了为什么报错的都是空表。

                       
注意:我在查询过程中可能查找的空表有遗漏,这个可以先进行一遍导出

解决方法如下:

                       
澳门金沙vip 1

1. 设置deferred_segment_creation的值为false

                        把查询结果导出,执行导出的语句即可。

此方法只对以后的表有效,之前的表没有Segment的还是没有。

                       
导出结果可以通过语句导出,在PLSQL命令窗口执行下面语句: