转://执行impdp时出现ORA-39154错误的解决案例
问题描述
如下导出过程正常:
expdp \"/ as sysdba\" tables=user_a.t directory=mydir dumpfile=t.dmp logfile=exp_t.log reuse_dumpfiles=yes
导入过程中出现ORA-39154错误,提示导入的内容里包含有不属于user_a用户的对象,这部分对象没有能够正常导入,但user_a.t表已经导入成功了
revoke imp_full_database from user_a;
impdp user_a/passwd directory=mydir dumpfile=t.dmp logfile=imp_t.log
ORA-39154: Objects from foreign schemas have been removed from import
出错原因分析:
因为导入内容里包括了统计信息,统计信息的相关操作在导入的过程中是在sys.impdp_stats表里进行的(可从impdp生成的sql脚本看出来),user_a用户需赋予imp_full_database权限才能导入这部分统计信息,这应该就是ORA-39154的成因
赋给user_a用户imp_full_database权限后再次进行impdp,ORA-39083取代了ORA-39154,问题出现在为user_b.IDX1_T1,user_b.IDX1_T2这两个索引生成统计信息时发现索引不存在,即索引和表不在同一个schema,表在user_a用户下,索引却建在user_b用户下。
grant imp_full_database to user_a;
impdp user_a/passwd directory=mydir dumpfile=t.dmp logfile=imp_t.log
ORA-39083: Object type INDEX_STATISTICS failed to create with error:
ORA-20000: INDEX "USER_B"."IDX1_T1" does not exist or insufficient privileges
ORA-20000: INDEX "USER_B"."IDX1_T2" does not exist or insufficient privileges
检查发现:目标库检查只有表被导入,索引并没有导入
验证:是否因为user_a是普通用户没有权限在user_b下创建索引,使用sysdba再次执行impdp,报错依旧:
impdp \"/ as sysdba\" directory=mydir dumpfile=t.dmp logfile=imp_t.log
使用sysdba用户导入也出现同样错误,应该不是权限问题,报错信息出现在导入索引统计信息阶段,因为user_b用户下的两个索引不存在导致ORA-39083,难道是导出的dmp文件压根就没包含这两个索引的信息,将impdp内容重定向到脚本,检查内容发现除了建表与导入索引的统计信息外,确实没有创建这两个索引的DDL语句。
impdp user_a/passwd directory=mydir dumpfile=t.dmp logfile=imp_t.log sqlfile=t.sql
解决方案:expdp阶段user_b用户下的索引也带上
######Schemas必须带上user_a,user_b这两个用户,如果Schema不指定那么默认在SYS下去找
expdp \"/ as sysdba\" schemas=user_a,user_b include=TABLE:\"=\'T\'\",INDEX:\"IN \(\'IDX1_T\',\'IDX2_T\'\)\" directory=mydir dumpfile=t.dmp logfile=exp_t.log reuse_dumpfiles=yes
注:上述导出操作如果为普通用户,则需授予该用户exp_full_database权限,否则将触发如下错误
ORA-39165: Schema user_b was not found.
ORA-39168: Object path INDEX was not found.
#####导入目标库之前先将impdp内容重定向到sql脚本,发现已包含create index的步骤
impdp user_a/passwd directory=mydir dumpfile=t.dmp logfile=imp_t.log sqlfile=t.sql
#####导入成功,表与索引都导入了
grant imp_full_database to user_a;
impdp user_a/passwd directory=mydir dumpfile=t.dmp logfile=imp_t.log
总结:本例中导致ORA-39154的根本问题在于user_a用的表上的索引没建在user_a用户下,这样的情况称为cross schema references,即不同schema的对象间存在关联,cross schema references导致的impdp错误还是比较隐蔽的,好在我们使用了sysdba权限从源库expdp导出表,然后通过impdp时有关统计信息无法导入的ORA-39154错误,一步一步追溯直至发现索引和表不在同一个schema下,问题才得以精确定位。此案例说明table mode export方式,如果依赖于a.tb表的对象,比如基于a.tb的索引ind_b,建在b用户下,则如下命令在导出结果里不会包含b用户下的索引
expdp user/passwd tables=a.tb directory=dirname dumpfile=a.tb.dmp logfile=exp_a.tb.dmp
必须使用schemas、include参数精确指定表名和索引名称,例如:
expdp user/passwd schemas=a,b include=TABLE:\"=\'TB\'\",INDEX:\"IN \(\'IND_B\'\)\" directory=dirname dumpfile=a.tb.dmp logfile=exp_a.tb.dmp
顺便提下,如果一开始从源库导出表时没有像下面这样使用sysdba权限
expdp \"/ as sysdba\" tables=user_a.t directory=mydir dumpfile=t.dmp logfile=exp_t.log reuse_dumpfiles=yes
而是像下面这样使用ad用户
expdp user_a/passwd tables=user_a.t directory=mydir dumpfile=t.dmp logfile=exp_t.log reuse_dumpfiles=yes
那么impdp目标库是不会有任何报错的,后果很严重的,将导致目标库上的表应该有索引的字段却没有建索引。
转://执行impdp时出现ORA-39154错误的解决案例的更多相关文章
- 执行impdp时出现的各种问题
1.不同的表空间,不同的用户,不同的表名 impdp ODS_YYJC_BUF_ZB/ODS_YYJC_BUF_ZB job_name=bs3 directory=EXPDMP exclude=OBJ ...
- 执行impdp时ORA-39213: Metadata processing is not available错误处理
通过impdp命令将Oracle11g数据库的dmp文件导入至Oracle10g中时,报出如下错误: [oracle@dbsrv3 ~]$ impdp dhccms/dhccms DIRECTORY= ...
- MVC.Net:对MVC5部署时出现403.14错误的解决方法
当我们部署MVC5到IIS 7的时候,有时会出现403.14的错误,如下图: 对于这个错误的解决方法就是在应用程序的web.config的system.webServer节点中加入这一句: <m ...
- 关于oracle 11g导出数据时 报 ORA 1455错误的处理
因为导出的该用户的表可能存在空数据表,那么可能就会出现此其异常. 首先: 查看: SQL>show parameter deferred_segment_creation; 假设为T ...
- ASP.NET输出PNG图片时出现GDI+一般性错误的解决方法
偶原来的用ASP.NET生成验证码图片时用的是JPG格式,今天想把它改成PNG格式的,结果就出现GDI+一般性错误,查了N久资料,才发现解决的办法,对分享此解决办法的网友深表感谢 Response.C ...
- 记录python接口自动化测试--pycharm执行测试用例时需要使用的姿势(解决if __name__ == "__main__":里面的程序不生效的问题)(第三目)
1.只运行某一条case 把光标移动到某一条case后面,然后右键,选择"Run..."来运行程序 此时,pycharm会只运行光标所在位置的这一条case 2.如果想执行全部ca ...
- [Win10]安装msi时2503,2502错误及其解决
简述 刚安装了win10系统,在安装TortoiseGit和TortoiseSvn时,这两个软件是.msi后缀的安装文件,在点击安装时老是提示2503,2502错误,因此无法安装上 搜索了下一般都提到 ...
- 初始化mysql数据库时提示字符编码错误的解决办法
有时候在安装完数据库并初始化的时候会出现如下错误: root@localhost mysql-5.5.19]# bash scripts/mysql_install_db --user=mysql - ...
- 使用VS2015编写驱动时出现的部分错误以及解决方法
前几日在github上下载了一个Windows驱动的demo,原本想着直接下载下来打开解决方案就可以用,没想到一编译,出现了奇奇怪怪的Error,部分Error网上也没什么好的解决办法,对我这个从未深 ...
随机推荐
- Springboot项目打包成jar运行2种方式
最近公司有个项目需要移植到SpringBoot框架上,项目里面又有许多第三方jar包,在linux服务器上最方便的就是用jar的方式来运行SpringBoot项目了,因此我研究了2种打jar包的方式, ...
- [转]git操作指南
[GIT上手篇]-1-基本操作(初始化仓库,添加.提交文件) 创建(初始化)一个GIT库 init 命令 说明:用于仓库的初始化 参数:--bare 创建一个纯仓库(不含缓存区和工作目录,服务器一般采 ...
- IdentityServer4 中文文档 -6- (简介)示例服务器和测试
IdentityServer4 中文文档 -6- (简介)示例服务器和测试 原文:http://docs.identityserver.io/en/release/intro/test.html 目 ...
- angular 禁止缓存
angular 单页面开发,会存在和管理很多HTML和JS文件,缓存有时是个麻烦. 在开发和测试阶段,F12调出调试工具,禁止缓存F5刷新下就好了. 但是在客户那里缓存就体验效果不好,甚至认为有问题, ...
- JQuery遍历,find()和each()方法
find()方法 jquery选择器非常强大,利用css的命名规约,可以更快更方便的找出想要的元素. 比如: $("#id") $("#"+"id&q ...
- 【Spring】26、利用Spring的AbstractRoutingDataSource解决多数据源,读写分离问题
多数据源问题很常见,例如读写分离数据库配置. 1.首先配置多个datasource <bean id="dataSource" class="org.apache. ...
- EL表达式和JSTL的使用
一:EL表达式 1.概述:在jsp开发中,为了获取Servlet域对象中存储的数据,经常要写很多java代码,这样的做法会使JSP页面混乱,难以维护,为此,在JSP2.0规范中提供了EL表达式.它是E ...
- webpack4 系列教程(六): 处理SCSS
这节课讲解webpack4中处理scss.只需要在处理css的配置上增加编译scss的 LOADER 即可.了解更多处理css的内容 >>> >>> 本节课源码 & ...
- CSS3效果:实现气泡效果
首先定义一个 <p class="speech"></p> 先给外层的容器添加样式: p.speech { position: relative; widt ...
- GIS基础知识
投影转换 若两者地理坐标系不一致,需要设置七参数进行转换. 不同地方,七参数大小不一样,需要通过计算得到.