IMP-00041: 警告: 创建的对象带有编译警告,创建视图报错

IMP-00041: 警告: 创建的对象带有编译警告

  • 发现
    笔者用的环境是 oracle11g,在使用exp导出,然后给其他同事使用时,发现无法导入,查看日志 “IMP-00041: 警告: 创建的对象带有编译警告”,后面紧接着视图创建语句。猜测应该视图创建报错,随后笔者自测imp导入此前导出的dmp,发现也报错 IMP-00041
    笔者查阅了大部分网站的说法,几乎几乎几乎全网都是 “导入命令里加上 ignore=y 导入完成后,在pl/sql developer 里选中出现警告的触发器,右键选择recompiled ”,然后清一色的评论都是未解决。而后该问题也一直遗留至今,直到接到一个关于备份还原的任务。

  • 探究
    若排除视图创建涉及到其他非imp/exp用户的表,和权限问题,那未解决也就正常,IMP-00041: 警告: 创建的对象带有编译警告, 创建视图 失败,那是不是创建代码本身有问题,先看创建视图依赖的表,查询发现该表中没有数据,并且imp导出 dmp包过程没有导出该空表。
    究其原因,是Oracle11G环境,exp只会导出有分配过segment的表,如果数据库中的导出用户的某个表中没有数据,oracle将不对该表分配segment,因此导出的dmp包不包含 数据为空的表,该dmp在导入到数据库时,创建视图因为没有所依赖的表,而报错。

  • 解决方法
    给参数 deferred_segment_creation 赋值为false,禁用上述功能,重启数据库。注意关闭该参数,不会对已存在数据为空的表 分配segment。只对以后创建的table 生效

  • show parameter deferred_segment_creation;

SQL> show parameter deferred_segment_creation;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation            boolean     TRUE
  • alter system set deferred_segment_creation=false;
  • shutdown immediate;
  • startup
SQL> show parameter deferred_segment_creation;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation            boolean     FALSE

drop掉用户对象,重新导入标准库,再次执行exp导出,并imp导入,不再报错
!!!问题解决

你可能感兴趣的:(oracle导入导出)