imp后经常发现即使指定了fromuser和touser以及tablespace,最后却发现表还是导入了system表空间,一开始以为是用户名称、表空间大小写不对导致,后来发现是其他原因
由于之前的数据库创建的用户有dba权限又没有指定默认表空间(导致默认表空间为system),或者建表的时候指定了表空间为system 由于这些表是dba用户导出的,又只能被dba导入 所以导致导入数据库的时候,这些表又回到了system表空间
解决方法1 alter table xxx move tablespace xxx; move过table以后索引会丢失,所以还重建索引,先查找失效的索引 select index_name from user_indexes where status = 'UNUSABLE' alter index xxxx rebuild;
这个方法缺点是对于表较多的库会非常麻烦,要move多个表rebuild很多索引 最大的缺点是不能move入带有long字段的表。
解决方法2 思路,给需要导入的用户dba权限,再取消这个用户的tablespace ulimited权限,让这个用户在SYSTEM表空间的使用空间的size为0,再允许这个用户有需要导入的表空间的ulimited权限(当然足够大小的size权限也行),记得commit 然后再用这个用户导入dmp文件,这样所有表都会导入到指定表空间了,导入完毕再取消这个用户的dba权限 CREATE USER loli IDENTIFIED BY "loli" DEFAULT TABLESPACE LOLI TEMPORARY TABLESPACE TEMP ACCOUNT UNLOCK PROFILE DEFAULT; grant CONNECT to loli; grant resource to loli; GRANT dba TO loli; REVOKE UNLIMITED TABLESPACE FROM loli; alter user loli quota 0 on SYSTEM; alter user loli quota unlimited on LOLI; commit;
$imp file='xxx' fromuer='xx' touser='xx' tablespace='xxx'
最后 REVOKE dba FROM loli;
|