我的环境是这样的,我有个数据库orcl1,其中有两个表空间 tbp1,tbp2.相应的表空间中有各自的数据表。使用 exp userid=system/密码 full=y  file=d:\back.dmp; 做完备份在d盘。在oracle中创建数据库orcl2,然后在数据库中orcl2中创建表空间 tbp1,tbp2。最后使用 imp userid=system/密码 full=y file=d:\back.dmp log=d:\lk.log ignore=y;导入数据。在导入的过程中总是报一些错误,如:不符合约束什么的。到导入后,orcl2 是可以使用的,数据也是和orcl1一致。
  请问,是不是做全库备份的话,做全库导入就是会报这些错误?还是我的导入方法就是错误的?
 因为以前我只exp导出过单个表空间的数据,创建一直表空间后,用imp 就会顺利导入。 请高手指点是哪里的问题?

解决方案 »

  1.   

    你导入的方法有问题。
    约束是默认的导入的,包括用户对表的权限等约束。而你新导入的orcl2中可能没有这些用户。
    正确的做法是:使用用户模式,导出时选择fromuser = 你拥有这2个表空间权限的用户A,B 
    也可以分开导出2次
    然后IMP时 使用TOUSER 选项,导入到新用户中,新用户要有这个表空间的权限。
    可以参考我这篇文章http://blog.csdn.net/kai27ks/article/details/7356269
    虽然你这样不影响使用,但是很有可能会有隐患。
      

  2.   

    是这样的,我创建数据库orcl2后,创建表空间 tbp1,tbp2 以及 对应的用户,并对用户分配权限了。再导入数据还是报同样的错误。
      

  3.   

    3楼的你的那个网址http://blog.csdn.net/kai27ks/article/details/7356269
    里面的内容不怎么给力呀,我用11g的导出报错啊!!!
      

  4.   


    --先使用存储过程检查一下你的表空间是否是自包含的
    execute sys.dbms_tts.transport_set_check ('tbp1,tbp2',true) ;
    select * from sys.transport_set_violations ;如果依赖于其他表空间里面的数据,就会出现约束无法启动等一些问题。希望能够帮到你。
      

  5.   

    一般情况不需要全库导入,你可以全库备份,但是在IMP时最好指定从哪个用户导入的哪个用户