对IMP-00013问题的思考(r3笔记第71天)
对于IMP的问题或者是各类ORA问题,如果碰到的时候使用oerr是一个很不错的参考方案。比如对于ora错误12041的解释如下。
> oerr ora 12041
12041, 00000, "cannot record ROWIDs for index-organized table "%s"."%s""
// *Cause: Index-organized tables do not have ROWIDs. Therefore a materialized
// view log that records the ROWIDs of an index-organized table
// could not be created.
// *Action: Do not include the WITH ROWID option when using the
// CREATE MATERIALIZED VIEW command and do not include the ADD ROWID
// option when using the ALTER MATERIALIZED VIEW command if the master
// table is index-organized.
其实碰到问题的时候,办法总比困难多。有很多的方式来解决,如果处理得当,就会避免很多后续的问题。 比如今天开发反馈在测试环境导入一个dump的时候 碰到了如下的错误。这个问题是很常见的。
Export file created by EXPORT:V11.02.00 via conventional path
IMP-00013: only a DBA can import a file exported by another DBA
IMP-00000: Import terminated unsuccessfully
基本有两种思路,一种是赋予dba权限,另外一种是赋予imp_full_database的权限。
通过错误的字面意思,是需要赋予dba的权限。如果这样做,就很被动了,因为目前测试环境有几十个,分别归属不同的开发小组,他们会根据需求导入对应的dump,这个dump是直接从现场环境中传过来的,导出的时候就直接用了dba的权限,所以在导入的时候就出了上面的错误。如果我们这次赋予了dba权限,那么这个用户就存在一定的风险,如果开发做了超出权限之外的操作,那就会造成一些不明不白的问题,所以如果赋予了dba权限,那么在dump导入之后就需要revoke dba权限。如果dba每次都去跟踪这些操作就显得有些“多余”了。所以就陷入一个很尴尬的境地,权限放开出问题是dba,不给权限导不了dump还是dba的问题。如果能够一劳永逸的解决问题就太好了。
这个时候如果我们细细的琢磨一下这个问题,就会发现,其实我们直接赋予imp_full_database的权限就够了。不用直接动用dba权限。
这个imp_full_database的权限目前来看也是安全的。如果开发拿到这个权限,还真干不了什么其他的操作。
所以目前为止我们可以认为imp_full_database的权限已经足够应付这个问题,不需要大动干戈,做吃力不讨好的事情。
事情到目前为止还没有完,真实的情况是过了一段时间又出现了问题。这次是在现场测试环境中碰到了,问题的原因是因为在开发测试环境中会有一些数据字典相关的数据。如果把各个模块的数据字典数据合并起来,就是一个dump文件了,根据流程这个dump文件需要在生产中部署。结果在现场的测试环境中就发现了这个问题。
这个问题说大也大,说下也小,当时有个哥们的处理思路就是生产环境中直接加个imp_full_database的权限就可以了。我当时就拒绝了。客户的环境中的任何权限,他们都有监控,我们不能在没有得到许可的情况下私自改动。
那个哥们当时也有点急了。
Man...
its just a privilege
otherwise we have to work again
you can revoke it
after my confirmation
我给他解释了一番,如果我们现在在哪个环境中碰到了问题,就这么修,那么现场测试环境也有几十套,我们也要一套一套这么修吗。况且现场环境中会不断的增加新的测试环境,没次新增一个,客户都会找到我说,你们的环境有问题,这样就把问题又推给dba了。到了生产,如果我们放了一马,私自修改了权限,那么从生产中导出的dump文件都需要这个权限,又得修。所以就是错误的连锁反应了。 他听了听,也确实有道理就把测试环境中的那个权限给revoke了之后,重新导出了一个dump。直到一年多过去了,也没有听说过生产中导入dump有问题。 所以对于这个问题的归纳就是,赋予imp_full_database权限,也不能一概而论,要根据需要来。要不就会画蛇添足。开发,测试,dba都工作相安无事才是真的好。
- 关于interval partitioning(r3笔记65天)
- Spark Tips4: Kafka的Consumer Group及其在Spark Streaming中的“异动”(更新)
- 关于数据库中的一些name(r3笔记第64天)
- 码农的瑞士军刀-脚本语言
- shell基础学习总结(一) (r3笔记第63天)
- 关于sysdba,sysoper,dba的区别(r3笔记第62天)
- 使用句柄实现特定场景的无备份恢复 (r3笔记第61天)
- 关于dual表的破坏性测试(r3笔记第60天)
- 哈希现金(Hashcash)与“工作量证明”
- 关于oracle中的sql数据类型(r3笔记第59天)
- 使用awr来分析sesson leak问题(r3笔记第78天)
- 弹窗层效果的实现(非jQuery实现)
- 简单的导航栏实现
- js实现css3的过渡,需要注意的一点(浏览器优化)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- phabricator介绍与搭建
- nginx反向代理与负载均衡
- APP | edxposed框架+trustmealredy模块抓包小程序
- nginx动态添加模块
- 曾经豪言“指哪爬哪”,如今被一个JS狠狠教做人
- mysql主从复制延迟问题记录
- linux下设置locale
- 宜信OCR技术探索与实践|直播速记
- keepalived结合lvs实现双机热备
- jenkins安装说明
- Haproxy combined with FTP cluster for load balancing
- redis使用playbook批量安装
- SpringCloud Alibaba微服务实战十八 - Oauth2.0 自定义授权模式
- 包子旧闻&Leetcode solution 1344. Angle Between Hands of a Clock
- Ubuntu下DNS服务搭建