数据库imp导入时报如下错误,dmp文件只有120M,而导入后数据库占用表空间多大几十个G;导致磁盘空间迅速增长;
. 正在导入表 "DAP_BASDOCIMP"导入了 0 行
. . 正在导入表 "DAP_BASDOCLIST"导入了 0 行
. . 正在导入表 "DAP_BATCH_Q"导入了 0 行
. . 正在导入表 "DAP_BILLFACTOR"导入了 367 行
. . 正在导入表 "DAP_BILLLOGS"导入了 0 行
IMP-00017: 由于 ORACLE 错误 1659, 以下语句失败:
"CREATE TABLE "DAP_CONTROLRULE" ("CONTROL" CHAR(15) NOT NULL ENABLE, "DR" NU"
"MBER(10, 0), "PK_BILLTYPE" VARCHAR2(20) NOT NULL ENABLE, "PK_CONTROLRULE" C"
"HAR(20) NOT NULL ENABLE, "PK_CORP" CHAR(4) NOT NULL ENABLE, "PK_GLBOOK" CHA"
"R(20), "PK_GLORG" CHAR(20), "TS" CHAR(19)) PCTFREE 10 PCTUSED 40 INITRANS "
"1 MAXTRANS 255 STORAGE(INITIAL 20480000 FREELISTS 1 FREELIST GROUPS 1 BUFFE"
"R_POOL DEFAULT) TABLESPACE "NNC_DATA01" LOGGING NOCOMPRESS"
IMP-00003: 遇到 ORACLE 错误 1659
ORA-01659: 无法分配超出 67 的 MINEXTENTS (在表空间 NNC_DATA01 中)
IMP-00017: 由于 ORACLE 错误 1659, 以下语句失败:
1.1.2. 分析:查看表空间大小
查看段的盘区信息等,发现初始盘区基本都比较大(基本都大于10M)
select segment_name,BYTES,BLOCKS,EXTENTS,INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,MAX_EXTENTS from user_segments
查看段对应的分配盘区大小都很大(客户的数据实际没有多少,很多表没有数据)
Select a..segment_name,sum(bytes)/1024/1024 || ‘MB’from user_extents a group by a.segment_name;
查看表对应的块数,同样发现很多表实际并没有数据;
select a.table_name, blocks,empty_blocks from user_tables a
测试:
测试1:
用户Mslc1
create table a (a varchar2(20),b varchar2(20));
create table b (a varchar2(20),b varchar2(20));
insert into a values('ddddd1','ddddd2'); commit;
insert into a select * from a;反复执行插入,commit;
C:\>exp system/oracle@orcl file=e:\mslc1.dmp compress=yes owner=mslc1 压缩参数等于Y
C:\> exp system/oracle@orcl file=e:\mslc2.dmp compress=no owner=mslc1 压缩参数等于N
可以发现加了compress=yes的备份,导入时初始盘区是按照原有表的分配盘区来分配大小的;
C:\>imp system/oracle@orcl file=e:\mslc1.dmp fromuser=mslc1 touser=mslc2
加了compress=no的备份,导入时初始盘区是按照正常默认值的来分配大小的;
C:\>imp system/oracle@orcl file=e:\mslc2.dmp fromuser=mslc1 touser=mslc3
测试2:
用户Mslc1
create table a (a varchar2(20),b varchar2(20));
create table b (a varchar2(20),b varchar2(20));
insert into a values('ddddd1','ddddd2'); commit;
insert into a select * from a; 反复执行插入,commit;
delete from a; commit;
C:\>exp system/oracle@orcl file=e:\mslc1.dmp compress=yes owner=mslc1
C:\> exp system/oracle@orcl file=e:\mslc2.dmp compress=no owner=mslc1
可以发现即使数据被删除,加了compress=yes的备份,导入时初始盘区还是按照原有表的分配盘区来分配大小的;
C:\>imp system/oracle@orcl file=e:\mslc1.dmp fromuser=mslc1 touser=mslc2
可以发现数据被删除,加了compress=no的备份,导入时初始盘区是按照正常默认值的来分配大小的;
C:\>imp system/oracle@orcl file=e:\mslc2.dmp fromuser=mslc1 touser=mslc3
1.1.3. 解决方法:基于上面的分析,加了compress=yes参数会导致导入时分配盘区按照原来表的分配空间大小来分配盘区(即使数据删除了也是),因此导出时不加该参数。
1.1.4. 参考:碎片整理EXPORT/IMPORT一个很重要的应用方面就是整理碎片。因为如果时初次IMPPORT,就会重新CREATE TABLE 再导入数据,所以整张表都是连续存放的。另外缺省情况下EXPORT会在生成DUMP文件是“压缩(COMPRESS)”TABLE,但是这种压缩在很多情况下被误解。事实上,COMPRESS是改变STORAGE参数INITIAL的值。比如:
CREATE TABLE .... STORAGE( INITIAL 10K NEXT 10K..)现在数据已经扩展到100个EXTENT,如果采用COMPRESS=Y来EXPORT数据,则产生的语句时 STORAGE( INITIAL 1000K NEXT 10K)
我们可以看到NEXT值并没有改变,而INITIAL是所有EXTENT的总和。所以会出现如下情况,表A有4个100M的EXTENT,执行DELETE FROM A,然后再用COMPRESS=Y 导 出数据,产生的CREATE TABLE语句将有400M的INITIAL EXTENT。即使这是TABLE中 已经没有数据!!这是的DUMP文件即使很小,但是在IMPORT时就会产生一个巨大的TABLE.
另外,也可能会超过DATAFILE的大小。比如,有4个50M的数据文件,其中表A有15个10M的EXTENT,如果采用COMPRESS=Y的方式导出数据,将会有INITIAL=150M,那么在重新导入时,不能分配一个150M的EXTENT,因为单个EXTENT不能跨多个文件。
8、在USER和TABLESPACE之间传送数据
一般情况下EXPORT的数据要恢复到它原来的地方去。如果SCOTT用户的表以TABLE或USER方式EXPORT数据,在IMPORT时,如果SCOTT用户不存在,则会报错!以FULL方式导出的数据带有CREATE USER的信息,所以会自己创建USER来存放数据。
当然可以在IMPORT时使用FROMUSER和TOUSER参数来确定要导入的USER,但是要保证TOUSER一定已经存在啦。
http://www.cnblogs.com/advocate/archive/2010/12/14/1905974.html
http://www.bhcode.net/article/20101115/13975.html
http://dingchaoqun12.blog.163.com/blog/static/11606250420110184248721/
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/14710393/viewspace-1082733/ ,如需转载,请注明出处,否则将追究法律责任。