场景描述:

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、重新导入数据。

oracle数据库导入导出问题的更多相关文章

  1. oracle数据库导入导出命令!(转)

    oracle数据库导入导出命令! Oracle数据导入导出imp/exp 功能:Oracle数据导入导出imp/exp就相当与oracle数据还原与备份. 大多情况都可以用Oracle数据导入导出完成 ...

  2. Oracle 数据库导入导出 dmp文件

    转自: http://hi.baidu.com/ooofcu/blog/item/ec5d1f9580d41f007af48077.html 首先询问对方数据库的表空间名称和大小,然后在你的oracl ...

  3. Oracle数据库导入导出命令总结

    Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中.利用 ...

  4. Oracle数据库导入导出命令总结 (详询请加qq:2085920154)

    分类: Linux Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的 ...

  5. oracle数据库导入导出命令!

    Oracle数据导入导出imp/exp 功能:Oracle数据导入导出imp/exp就相当与oracle数据还原与备份. 大多情况都可以用Oracle数据导入导出完成数据的备份和还原(不会造成数据的丢 ...

  6. Oracle数据库导入导出 imp/exp备份还原

    Oracle数据导入导出imp/exp   Oracle数据导入导出imp/exp 在cmd的dos命令提示符下执行,而不是在sqlplus里面,但是格式一定要类似于:   imp/exp 用户名/密 ...

  7. oracle数据库导入导出方法

    Oracle Database 10g以后引入了最新的数据泵(Data Dump)技术,使DBA或开发人员可以将数据库元数据(对象定义)和数据快速移动到另一个oracle数据库中. 数据泵导出导入(E ...

  8. 转载-Oracle 数据库导入导出 dmp文件

    首先询问对方数据库的表空间名称和大小,然后在你的oracle中建立相应表空间,最后使用命令导入.导出数据.补充:1.要新建一个数据库: Oracle数据导入导出imp/exp就相当于oracle数据还 ...

  9. Oracle数据库导入导出总结(dmp文件)

    Oracle 10G 管理页面(Oracle Enterprise Manager 10g): http://localhost:1158/em http://localhost:1158/em/co ...

  10. oracle 数据库导入导出

    要把公司的数据库导入到自己的电脑上(都需要再命令窗口下输入指令) 导出数据库的基本代码: exp zj_user_kf/oracle@tzsw_4 file=d:\test3.dmp full=y 导 ...

随机推荐

  1. 网关协议学习:CGI、FastCGI、WSGI

    网关协议学习:CGI.FastCGI.WSGI https://www.biaodianfu.com/cgi-fastcgi-wsgi.html

  2. MiniDao_1.6.4 版本发布,轻量级Java持久化框架,Hibernate项目辅助利器

    MiniDao 简介及特征 MiniDao 是一款超轻量的JAVA持久层框架,具备Mybatis一样的SQL能力: 支持SQL分离.支持标签.支持注解.MiniDao产生的初衷是为了解决Hiberna ...

  3. English-新概念学习

    English-英语字母发音全攻略.pdf English-新概念第一册笔记.rar English-新概念第二册笔记.rar English-新概念第三册笔记.rar English-英语训练用书. ...

  4. 使用原生js实现前端分页功能

    背景: 从后台提取出来数据,在前端进行分页. 代码: user-manage.js window.onload = function(){ var result = { message : " ...

  5. C# 2018.9.17

    C#的优点:1,不会有运行时崩溃,解决了C++的痛点一,难预防,难查错2,使用文件不需要包含进来,只需要using namespace即可,解决了C++的痛点二,包含复杂,路径复杂,编译复杂3,编译速 ...

  6. linux suse 3.0.101的一次中断暴增的排查

    本文相关背景知识可以在:http://man7.org/linux/man-pages/man5/proc.5.html?spm=5176.100239.blogcont6047.8.ImCGpr 看 ...

  7. 简单步骤Centos7安装Tomcat 8 (yum安装)(ZT)

    原文:https://blog.51cto.com/bestlope/1978114?source=drt 说明: 操作系统:Centos7 系统环境:未安装其他服务 Step 1:更新系统 sudo ...

  8. IE9及以下版本获取上传文件的大小

    IE9及以下版本不能识别files属性:获取图片需要设置浏览器 打开IE_工具_internet选项_安全_自定义级别. 启用ActiveX,开启跨域: var fso=new ActiveXobje ...

  9. UploadFtp

    #!/bin/bash FILENAME=$ DSTDIR=$ FTPSRV=ip FTPUSER="user" FTPPWD="password" SRCDI ...

  10. (转)NHibernate+MySql常见问题

    http://blog.51cto.com/4837471/1567675 版本: NHibernate :NHibernate 4.0.1GA MySql:MySql 5.0.1 常见问题一: “N ...