如题,我用exp从我的机器上把整个数据库导出来,然后在另一个机器上(这个机器单独安装了oracle)使用imp导入,但是有外键的表,只要插入数据时有违反的就自动把那个外键约束删掉了,如何来避免这个问题呀

解决方案 »

  1.   

    具有外键约束的用户数据迁移办法(exp/imp)
    在我们只需要迁移一部分表数据,而不是整个用户,同时又希望得到整个用户的所有非用户数据的结构,此时如果遇到具有外键约束的用户数据,我们总是因为外键约束导致数据导入时出现错误,导致丢失部分数据,乃至无法导入数据,今想出如下办法,通过5个步骤即可解决此问题。
    相信很多环境都需会有类似的需求。以前说的(http://bigboar.itpub.net/post/8411/58613)并没有解决外键约束数据的问题,次解决。==================================================需求:
    1)迁移某oracle数据库用户下所有非用户数据的结构(即包括:table,index,procedure等等除了表数据以外的所有该用户的结构).
    2)迁移该用户下的指定的一部分表的用户数据。测试环境:
    solaris9+oracle817 to redhat2.1+oracle817==================================================
    按下列步骤(一共5步),即可成功:
    导出:1)按用户模式,exp导出该用户的所有非用户数据的结构,文件为:wapmail_nodata.dat
    $exp wapmail/passwd@wapmail file=wapmail_nodata.dat rows=n2)按用户模式,指定表清单导出该用户指定的表清单里的表数据:wapmail_list_table_data.dat
    $exp wapmail/passwd@wapmail file=wapmail_list_table_data.dat parfile=table.listtable.list文件内容,用cat显示如下:
    $cat table.list
    tables=
    (areano, 
    blacklist, 
    cdma_segarea,
    .....
    zone)
    ==================================================
    导入:
    3)按用户模式,imp导入wapmail_nodata.dat,指定INDEXES=n和CONSTRAINTS=n,不导入索引和约束。
    $imp wapmail/wapmail@maildb file=wapmail_nodata.dat INDEXES=n CONSTRAINTS=n
    4)按用户模式,imp导入wapmail_list_table_data.dat里的数据,只指定ignore=y。
    $imp wapmail/wapmail@maildb file=wapmail_list_table_data.dat ignore=y
    5)按用户模式,imp导入wapmail_nodata.dat,只指定ignore=y。
    $imp wapmail/wapmail@maildb file=wapmail_stru.dat ignore=y 此时还有一个问题,JOB任务无法导入,因为在导出文件里得到的是具体的job_id了。此时重新提交JOB即可。
    除此外,问题都解决了。==================================================
    PS:
    wapmail_list_table_data.dat好处是只导出了部分表数据,同时满足需求,导出文件没有整个用户数据大,利于转移。