zoukankan      html  css  js  c++  java
  • oracle数据库导入导出问题

    场景描述:

    1、做一个从UAT到PRD的Schema迁移,UAT环境有sys用户,PRD环境没有sys用户,由于权限限制,没办法使用expdp/impdp,只好选择exp/imp命令;

    2、UAT和PRD环境的TNS已明确,假设UAT环境的TNS配置为:TNS_UAT,PRD环境的配置为:TNS_PRD;

    3、PRD环境的DB USER已建好(其他人建好提供的),和UAT环境的是一样的,假设都为user/pwd;

    4、UAT和PRD环境,user用户的表空间名不同,假设UAT环境表空间为:TBSP_UAT,PRD环境为TBSP_PRD;

    当两个user的表空间不同时无法直接exp/imp(不妨尝试一下),所以找了以下两种解决办法:

    方法一:

    1、使用exp命令从UAT库导出user用户数据文件Schema_USER_BAK.dmp,命令格式为:

    EXP  user/pwd@TNS_UAT  BUFFER=64000  FILE=D:SCHEMA_USER_BAK.dmp  OWNER=USER(参数按需添加)

    2、使用Notepad++等文本工具打开文件,查找出其中的表空间信息,将SCHEMA_USER_BAK.dmp文件中的UAT环境表空间名TBSP_UAT全部替换PRD对应的表空间名TBSP_PRD,修改后的文件另存为SCHEMA_USER.dmp;

    3、然后使用imp命令将SCHEMA_USER.dmp文件导入给PRD环境的user用户,命令格式为:

    IMP  user/pwd@TNS_PRD   BUFFER=64000   FILE=D:SCHEMA_USER.dmp FROMUSER=USER  TOUSER=USER

    4、OK,方法一完成。

    但是,假设UAT环境的user用户的数据量很大,导出的dmp文件通常有3GB、4GB甚至更大,此时就无法通过Notepad++或者UE等编辑器直接去编辑替换表空间信息了,方法一就行不通了,所以这时有了方法二。

    方法二:

    1、修改UAT环境user用户的表空间名为PRD环境对应的表空间名:(修改之前记得备份)

    ALTER TABLESPACE TBSP_UAT  RENAME TO  TBSP_PRD

    2、导出UAT环境user用户:

    EXP  user/pwd@TNS_UAT  BUFFER=64000  FILE=D:SCHEMA_USER.dmp  OWNER=USER

    3、将导出的dmp文件导入给PRD环境的user用户:

    IMP  user/pwd@TNS_PRD   BUFFER=64000   FILE=D:SCHEMA_USER.dmp FROMUSER=USER  TOUSER=USER

    4、还原UAT环境user用户的表空间名:

    ALTER TABLESPACE TBSP_PRD  RENAME TO  TBSP_UAT

    5、OK,方法二完成。

    上述两种方法亲测有效,但是可能会有特殊情况,至于特殊情况是什么,那就不好说了。所谓特殊情况特殊处理,所以还得各位小伙伴多多研究了。

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

        一、问题描述:

           所用环境:Oracle 11g客户端、Windows 64bit、C#;

           具体描述:用户UserA默认表空间为tablespace_A,使用EXP命令导出数据表备份文件.dmp,用IMP命令导入时发现数据仍然自动导入到SYSTEM表空间下,即并没有导入到期望的tablespace_A表空间中去。在IMP导入时即使指定了tablespaces=tablespace_A,也无效,数据还是导入到SYSTEM表空间下。

           二、原因:

           IMP在导入dmp文件时,会根据该dmp导出时的源表空间为依据进行导入表空间的选择,即:从SYSTEM表空间导出的dmp文件,导入时只会默认导入到当初导出时的表空间SYSTEM中。这是因为EXP在导出dmp时不仅包含了导出数据表的脚本语句,还包括其导出时的表空间信息;IMP在导入时就根据dmp中该表空间信息来当做目标表空间进行导入。所以,即使用户UserA的默认表空间为tablespace_A,但如果dmp的源表空间若是SYSTEM表空间的话,用户UserA在用IMP导入并显式指定表空间时,数据还是自动导入到SYSTEM表空间中去。

           上述情况常发生于不同电脑上的备份还原,比如用户UserB的数据表都存在于SYSTEM中,他EXP时生成dmp文件的源表空间自然就是SYSTEM;当UserA用这个dmp进行还原时就会直接导入到SYSTEM表空间中而非他自己的默认tablespace_A表空间。

           一句话总结:EXP导出时的源表空间是哪个,IMP导入时就自动导入到该源表空间中去。

           (如果目标数据库上该源表空间不存在,可能会报错:表空间不存在之类问题;当源表空间不存在时,在IMP时指定自己希望导入的表空间呢?这留给大家自行验证吧)

          三,解决思路:

           思路1:以导入约束导出;

           即尽量做到相同表空间之间的导出导入。(其他思路最后也都是转换到这一步。)

           思路2:将其他表空间中的表迁移到默认表空间中;

           当时想到最笨的办法就是重新在默认表空间tablespace_A下建表,然后把用户UserA在SYSTEM表空间中的表删除。

           思路3:修改用户UserA在SYSTEM表空间的限额(也是很多网友提供的方法);       

    1.  
      revoke unlimited tablespace from UserA;//撤销UserA的unlimited tablespace权限
    2.  
       
    3.  
      alter user UserA quota 0 on SYSTEM;//将用户在System表空间的配额置为0
    4.  
       
    5.  
      alter user UserA quota unlimited on TABLESPACE_A;//设置在用户在tablespace_A表空间配额不受限

           

           思路4:修改用户UserA在SYSTEM表空间中数据表的表空间,改为其默认表空间tablespace_A;

           比如用户UserA里有张TD_USERS的表,其现在表空间是SYSTEM,将其表空间修改为tablespace_A。

           至于如何修改表空间,方法一是利用下面SQL语句:

    1.  
      alter table TD_USERS move tablespace TABLESPACE_A // 第一步:将表TD_USERS移至表空间tablesapce_A下
    2.  
      alter index TD_USERS_ID rebuild tablespace TABLESPACE_A // 第二步:修改该表的索引的表空间
       
       
       
      解决方法:

      --1、sys用户登录收回用户A的unlimited tablespace权限
      revoke unlimited tablespace from A;

      --2、指定A用户在表空间B上的权限
      alter user A quota unlimited on B;

      --3、重新导入数据。

  • 相关阅读:
    关闭编辑easyui datagrid table
    sql 保留两位小数+四舍五入
    easyui DataGrid 工具类之 util js
    easyui DataGrid 工具类之 后台生成列
    easyui DataGrid 工具类之 WorkbookUtil class
    easyui DataGrid 工具类之 TableUtil class
    easyui DataGrid 工具类之 Utils class
    easyui DataGrid 工具类之 列属性class
    oracle 卸载
    “云时代架构”经典文章阅读感想七
  • 原文地址:https://www.cnblogs.com/UUUz/p/9289095.html
Copyright © 2011-2022 走看看