oracle 11g延迟段创建导致exp-00003错误及关闭延迟段创建特性
开发人员在远程使用exp导出11.2.0.2.0(64bit for linux)版本的数据库中一张分区表时,遇到EXP-00003错误。客户端版本是11.2.0.1.0(32bit for windows)。
C:\Documents and Settings\1>exp resourcedb/resourcedb@192.168.20.105/FHACDB file=d:\aaa.dmp tables=T_FILE_INFO Export: Release 11.2.0.1.0 - Production on 星期二 11月 5 09:49:52 2013 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. 连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Produc tion With the Partitioning, Automatic Storage Management, OLAP, Data Mining and Real Application Testing options 已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集 服务器使用 AL32UTF8 字符集 (可能的字符集转换) 即将导出指定的表通过常规路径... . . 正在导出表 T_FILE_INFO EXP-00003: 未找到段 (0,0) 的存储定义 导出成功终止, 但出现警告。
关于EXP-00003错误,网上什么版本都有,很明显这个错误和segment有关,猜测是和11g的新特性延迟段创建有关系,在MOS上看到一篇关于EXP-00003错误的文章说是由于这张表被其他用户建了索引,而这个用户没有权限去导出其他用户的索引信息,就报这个错误,我感觉这篇文章和我遇到的不是一回事,于是查了下是否有其他用户给我要导出的表建索引。
SQL> SELECT OWNER,TABLE_OWNER,INDEX_NAME FROM DBA_INDEXES WHERE TABLE_NAME='T_FILE_INFO'; OWNER TABLE_OWNER INDEX_NAME ------------------------------ ------------------------------ ------------------------------ RESOURCEDB RESOURCEDB T_F_I_IDE RESOURCEDB RESOURCEDB T_F_I_ID RESOURCEDB RESOURCEDB T_F_I_OBJ
经查看,并没有其他用户在这张表上创建索引,再看看这张表的分区信息、段信息和数据分布情况。
SQL> SELECT PARTITION_NAME,NUM_ROWS FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='T_FILE_INFO'; PARTITION_NAME NUM_ROWS SEGMENT_CREATED ------------------------------ ---------- -------------- PART01 NO PART02 745200 YES PART03 902900 YES PART04 457400 YES PART05 91970 YES PART06 NO PART07 NO PART08 NO PART09 2294 YES PART10 152 YES PART11 NO PART12 NO PART13 NO PART14 NO PART15 NO PART16 NO PART17 NO PART18 85208 YES PART19 NO PART20 NO PART21 41436 YES PART22 NO PART23 NO PART24 NO PART25 NO PART26 NO PART27 NO PART28 NO PART29 NO PART30 NO PART31 NO PART32 NO PART33 NO PART34 NO PART35 NO PART36 NO PART37 NO PART38 NO PART39 NO PART40 NO PART41 2692 YES PART42 NO PART43 NO PART44 NO PART45 NO PART46 NO PART47 NO PART48 NO PART49 NO PART50 NO PART51 NO PART52 NO PART53 NO PART54 NO PART55 NO PART56 NO PART57 NO PART58 NO PART59 NO PART60 NO PART61 NO PART62 NO PART63 NO PART64 NO PART65 NO PART66 NO PART67 NO PART68 NO PART69 NO PART70 NO PART71 NO PART72 NO PART73 NO PART74 NO PART75 NO PART76 NO PART77 0 YES 77 rows selected
这张表是list分区,当前业务只有几个分区有数据,其他数据还没有加工到,现在只有几个分区分配了段,其他分区由于没有数据没有分配段信息。这样就触发了EXP-00003错误。将所有分区都分配下段信息,看看exp还会不会报错。
SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(9999999,'01'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000000,'02'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000001,'03'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000002,'04'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000003,'05'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000004,'06'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000005,'07'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000006,'08'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000007,'09'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000008,'10'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000009,'11'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000010,'12'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000011,'13'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000012,'14'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000013,'15'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000014,'16'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000015,'17'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000016,'18'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000017,'19'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000018,'20'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000019,'21'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000020,'22'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000021,'23'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000022,'24'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000023,'25'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000024,'26'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000025,'27'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000026,'28'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000027,'29'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000028,'30'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000029,'31'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000030,'32'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000031,'33'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000032,'34'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000033,'35'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000034,'36'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000035,'37'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000036,'38'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000037,'39'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000038,'40'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000039,'41'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000040,'42'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000041,'43'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000042,'44'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000043,'45'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000044,'46'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000045,'47'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000046,'48'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000047,'49'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000048,'50'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000049,'51'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000050,'52'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000051,'53'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000052,'54'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000053,'55'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000054,'56'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000055,'57'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000056,'58'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000057,'59'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000058,'60'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000059,'61'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000060,'62'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000061,'63'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000062,'64'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000063,'65'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000064,'66'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000065,'67'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000066,'68'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000067,'69'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000068,'70'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000069,'71'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000070,'72'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000071,'73'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000072,'74'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000073,'75'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000074,'76'); 1 row inserted SQL> INSERT INTO T_FILE_INFO (ID,FOND_CODE) VALUES(10000075,'77'); 1 row inserted SQL> ROLLBACK; Rollback complete
竟然不可以使用ALTER TABLE XXX ALLOCATE EXTENT的方式和ALTER TABLE XXX PARTITION XX ALLOCATE EXTENT的方式分配段信息,只能每个分区都插一条记录来分区了,下面看下exp可不可以直接导出这张表。
C:\Documents and Settings\1>exp.exe resourcedb/resourcedb@105 file=XXXXXX.DMP TA BLES=T_FILE_INFO Export: Release 11.2.0.1.0 - Production on 星期二 11月 5 13:30:04 2013 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. 连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Produc tion With the Partitioning, Automatic Storage Management, OLAP, Data Mining and Real Application Testing options 已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集 服务器使用 AL32UTF8 字符集 (可能的字符集转换) 即将导出指定的表通过常规路径... . . 正在导出表 T_FILE_INFO . . 正在导出分区 PART01导出了 0 行 . . 正在导出分区 PART02导出了 741589 行 . . 正在导出分区 PART03导出了 913385 行 . . 正在导出分区 PART04导出了 469726 行 . . 正在导出分区 PART05导出了 91501 行 . . 正在导出分区 PART06导出了 0 行 . . 正在导出分区 PART07导出了 0 行 . . 正在导出分区 PART08导出了 0 行 . . 正在导出分区 PART09导出了 2294 行 . . 正在导出分区 PART10导出了 152 行 . . 正在导出分区 PART11导出了 0 行 . . 正在导出分区 PART12导出了 0 行 . . 正在导出分区 PART13导出了 0 行 . . 正在导出分区 PART14导出了 0 行 . . 正在导出分区 PART15导出了 0 行 . . 正在导出分区 PART16导出了 0 行 . . 正在导出分区 PART17导出了 0 行 . . 正在导出分区 PART18导出了 85349 行 . . 正在导出分区 PART19导出了 0 行 . . 正在导出分区 PART20导出了 0 行 . . 正在导出分区 PART21导出了 41400 行 . . 正在导出分区 PART22导出了 0 行 . . 正在导出分区 PART23导出了 0 行 . . 正在导出分区 PART24导出了 0 行 . . 正在导出分区 PART25导出了 0 行 . . 正在导出分区 PART26导出了 0 行 . . 正在导出分区 PART27导出了 0 行 . . 正在导出分区 PART28导出了 0 行 . . 正在导出分区 PART29导出了 0 行 . . 正在导出分区 PART30导出了 0 行 . . 正在导出分区 PART31导出了 0 行 . . 正在导出分区 PART32导出了 0 行 . . 正在导出分区 PART33导出了 0 行 . . 正在导出分区 PART34导出了 0 行 . . 正在导出分区 PART35导出了 0 行 . . 正在导出分区 PART36导出了 0 行 . . 正在导出分区 PART37导出了 0 行 . . 正在导出分区 PART38导出了 0 行 . . 正在导出分区 PART39导出了 0 行 . . 正在导出分区 PART40导出了 0 行 . . 正在导出分区 PART41导出了 2692 行 . . 正在导出分区 PART42导出了 0 行 . . 正在导出分区 PART43导出了 0 行 . . 正在导出分区 PART44导出了 0 行 . . 正在导出分区 PART45导出了 0 行 . . 正在导出分区 PART46导出了 0 行 . . 正在导出分区 PART47导出了 0 行 . . 正在导出分区 PART48导出了 0 行 . . 正在导出分区 PART49导出了 0 行 . . 正在导出分区 PART50导出了 0 行 . . 正在导出分区 PART51导出了 0 行 . . 正在导出分区 PART52导出了 0 行 . . 正在导出分区 PART53导出了 0 行 . . 正在导出分区 PART54导出了 0 行 . . 正在导出分区 PART55导出了 0 行 . . 正在导出分区 PART56导出了 0 行 . . 正在导出分区 PART57导出了 0 行 . . 正在导出分区 PART58导出了 0 行 . . 正在导出分区 PART59导出了 0 行 . . 正在导出分区 PART60导出了 0 行 . . 正在导出分区 PART61导出了 0 行 . . 正在导出分区 PART62导出了 0 行 . . 正在导出分区 PART63导出了 0 行 . . 正在导出分区 PART64导出了 0 行 . . 正在导出分区 PART65导出了 0 行 . . 正在导出分区 PART66导出了 0 行 . . 正在导出分区 PART67导出了 0 行 . . 正在导出分区 PART68导出了 0 行 . . 正在导出分区 PART69导出了 0 行 . . 正在导出分区 PART70导出了 0 行 . . 正在导出分区 PART71导出了 0 行 . . 正在导出分区 PART72导出了 0 行 . . 正在导出分区 PART73导出了 0 行 . . 正在导出分区 PART74导出了 0 行 . . 正在导出分区 PART75导出了 0 行 . . 正在导出分区 PART76导出了 0 行 . . 正在导出分区 PART77导出了 0 行 导出成功终止, 但出现警告。
在每个分区都分配段之后,exp可以导出数据了。
这个问题和11g的新特性-延迟段创建有关系,由新的参数deferred_segment_creation来控制是否启用延迟段创建功能,这个参数默认就是TRUE也就是开启,同时呢,在11g的CREATE TABLE语法中也新出现了SEGMENT CREATION参数,该参数有2个值,IMMEDIATE和DEFERRED,默认值是DEFERRED也就是在创建空表示,不分配段信息,有关这个问题详见我之前写过的一篇文章http://www.dbdream.com.cn/?p=346。
下面来看下deferred_segment_creation参数:
SYS@105> show parameter defe NAME TYPE VALUE ------------------------------------ ---------------------- -------------------- deferred_segment_creation boolean TRUE
我个人建议关闭这个特性,现在磁盘都足够大,禁掉这个参数的好处往往要大于节省的那点磁盘空间。特别是在项目开发阶段,要频繁的从开发环境迁移数据到测试环境,而很多人习惯使用exp而不使用expdp来迁移这些数据,而开启延迟段创建特性就不会为新建的空表分配段,exp就导不出这些没有分配段的空表(expdp可以),这样迁移过去的数据,可能就会报表或对象不存在的错误。
这是个动态参数,可以直接修改就生效。
SYS@105> alter system set deferred_segment_creation=false; 系统已更改。
下面创建张空表看看是否分配段。
SYS@105> conn dbdream/dbdream@105 已连接。 DBDREAM@105> create table seg_test(id number); 表已创建。 DBDREAM@105> select segment_name from user_segments where segment_name='SEG_TEST'; SEGMENT_NAME -------------------------------------------------------------------------------- SEG_TEST
可见,在关闭延迟段创建特性后,创建空表时分配了段信息。