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

本文探讨了在Oracle 11g环境下,使用exp导出数据后,因空表未被导出导致的IMP-00041错误:创建对象时带有编译警告。通过调整deferred_segment_creation参数,禁用了仅导出分配过segment的表的功能,解决了视图创建失败的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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导入,不再报错
!!!问题解决

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值