近日,用imp导入的时候遇到一些问题。先整理一下遇到的问题,并提供解决的方案。
导入命令如下:
imp test1/test1@实例 file=xxx IGNORE=Y GRANTS=N INDEXES=N CONSTRAINTS=N log=/tmp/oracleimp.log buffer=1000000 fromuser=xxx touser=test1
1.ORA-01659: unable to allocate MINEXTENTS beyond 31 in tablespace xxx
(1)导入的时候是分区表,当时备份时并没有指定分区导出,所以导出时包含了全部的分区。导入时oracle会检查要导入的表空间大小是否满足 该分区表预分配的空间大小,不满足的话就会抛出ORA-01659的问题了。所以需要加大导入的表空间大小或者删除一些不需要的数据。
一开始以为导入时表会创建在用户所属的表空间下,实际上是在原来的表空间中。如果要导入的表空间不存在,也会报错的。
所以可以创建要导入的表空间,也可以更换表空间。
(2)也可以指定要导入的表空间,在导入dmp文件之前,先将原备份数据的表结构导出。用文本编辑器更换原来的表空间,然后将sql文件导入到新库。之后执行上述命令可以完整导入。由于表已经被创建了所以导入时忽略了创建表的错误,故可以成功导入。
exp时没有drop表的命令。当表已经被创建时,里面的数据字段和表结构不匹配会产生错误。遇到这种情况需要删除之前创建的表。
在导出时要加上compress=y 将空间压缩一下,会减少该错误的发生。