oracle数据库用imp命令导入数据库时报1659的错误,怎么解决?

IMP-00017: 由于 ORACLE 错误 1659, 以下语句失败:
"CREATE TABLE "TEMPLATECONTENT" ("CONTENT_ID" VARCHAR2(50) NOT NULL ENABLE, "
""TITLE" VARCHAR2(50) NOT NULL ENABLE, "PID" VARCHAR2(50) NOT NULL ENABLE, ""
"TYPE" VARCHAR2(50), "TEMP_CONTENT" BLOB, "BIND_ID" VARCHAR2(50)) PCTFREE 1"
"0 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 25165824 FREELISTS 1 F"
"REELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "PACS31" LOGGING NOCOMPRES"
"S LOB ("TEMP_CONTENT") STORE AS (TABLESPACE "PACS31" ENABLE STORAGE IN ROW"
" CHUNK 8192 PCTVERSION 10 NOCACHE LOGGING STORAGE(INITIAL 65536 FREELISTS "
"1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT))"
IMP-00003: 遇到 ORACLE 错误 1659
ORA-01659: 无法分配超出 6 的 MINEXTENTS (在表空间 PACS31 中)
. . 正在导入表 "TEMPLATECONTENT_LLM20010510"导入了 2394 行
. . 正在导入表 "TEMP_CSMODULUSDB"导入了 0 行
. . 正在导入表 "TRANSLOG"导入了 0 行
. . 正在导入表 "UIDTABLE"导入了 1 行
. . 正在导入表 "USERPROFILE"导入了 72 行
. . 正在导入表 "USER_KEY"导入了 0 行
. . 正在导入表 "WORKGROUP"导入了 0 行
. . 正在导入表 "WORKLIST"导入了 0 行
成功终止导入, 但出现警告。

oracle在导入数据时报1659的错误的原因主要是数据库表空间剩余空间不足引起的。

分析原因

1、表空间剩余空间不足。

使用下面语句,查看表空间剩余空间

select Upper(f.tablespace_name) "表空间名", 

           d.tot_grootte_mb "表空间大小(M)", 

      d.tot_grootte_mb - f.total_bytes "已使用空间(M)", 

           to_char(round((d.tot_grootte_mb - f.total_bytes) /

           d.tot_grootte_mb * 100, 2),'990.99') || '%' "使用比", 

        f.total_bytes "空闲空间(M)", 

     f.max_bytes "最大块(M)" 

  from (select tablespace_name, 

                       round(sum(bytes) / (1024 * 1024), 2) total_bytes, 

                      round(max(bytes) / (1024 * 1024), 2) max_bytes 

             from sys.dba_free_space 

           group by tablespace_name) f, 

           (select dd.tablespace_name, 

                       round(sum(dd.bytes) / (1024 * 1024), 2) tot_grootte_mb 

              from sys.dba_data_files dd 

             group by dd.tablespace_name) d 

  where d.tablespace_name = f.tablespace_name 

   order by f.tablespace_name;

表空间剩余空间不足时,可以根据原数据库表空间大小增加表空间。

alter tablespace 表空间名 add datafile '数据文件名' size 数据文件大小;

2、剩余表空间还很多。

使用下面语句查看原数据库表表定义,找到initial_extent值大的表,将这些表的

创建语句导出后修改initial_extent值,在目标数据库中创建后再导入数据,导入时

增加参数ignore=y。

select table_name, initial_extent 

  from user_tables 

 where initial_extent is not null

 order by initial_extent desc

如果找不到原数据库,可以使用

imp userid/userid@service_name file=dmp文件名 indexfile=index文件名 rows=n full=Y

命令将dmp文件中创建表的语句导入到indexfile文件中,查看indexfile如下:

REM  CREATE TABLE "TEST"."DM_KJKM_COPY" ("KJZDMB_DM" VARCHAR2(100) 

REM  ENABLE, "KMID" NUMBER(20, 0), "KMBM" VARCHAR2(100), "KMMC" 

REM  VARCHAR2(500), "KMQC" VARCHAR2(1000), "KMLB_DM" VARCHAR2(100), 

REM  ...

使用文本编辑工具,查找INITIAL将过大的初始值改为65536后,将REM去除后,在数据库中创建后再使用exp导入数据,导入时增加参数ignore=y。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-09
数据库分成3个表空间:big, medium 和 normal 当把生产环境中的表结构导入开发环境的时候收到IMP-00003: ORACLE error 1659 encountered的错误。问题主要出自于当我们需要把big表空间的表导入其他环境时,初始化分配表空间的值过大造成。解决方案:

1。在导出表结构的时候exp命令后加上compress=n

2。导入的时候仍然报该错误。使用imp file=xxx.dmp indexfile=indxxx.sql生成sql文件,然后使用记事本打开工具打开sql文件。把初始化参数的值设置为最小然后去掉rem的注释。最后运行该语句。最终表结构成功建立。本回答被提问者和网友采纳