暂无图片
求oracle11g环境下怎样获得因DDL操作导致依赖对象失效的日志
我来答
分享
暂无图片 匿名用户
求oracle11g环境下怎样获得因DDL操作导致依赖对象失效的日志

环境:ORACLE 11.2.0.4

背景:存储过程总是因为某些依赖对象发生了定时DDL操作(可能的操作例如:DROP相关分区表、TRUNCATE相关分区表)等操作失效,导致下一次调用触发ORACLE的自动编译,进而引起大量library cache的争用,逐个研究依赖关系并定位问题费时费力,希望通过日志精确定位问题发生的时间和原因

问题:1、ORACLE是否会记录DDL操作引起其他对象失效的过程日志?

          2、是否可以通过编写脚本实现监控?

备注:本问题不能提供相关性能报告和TRACE,敬请谅解


我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
布衣
暂无图片

问题1:Oracle 一般没有对象失效的过程日志。
问题2:可以写一个监控脚本,定时输出存储过程状态。从而达到监控的目的。
例如:

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; SQL>select object_name, object_type, status, LAST_DDL_TIME --最后一个操作时间 from user_objects where status = 'INVALID'; OBJECT_NAME OBJECT_TYPE STATUS LAST_DDL_TIME ------------------------------ ------------------- ------- ------------------- SP_DATE_DELETE_PART PROCEDURE INVALID 2022-02-12 18:22:31 SP_test PROCEDURE INVALID 2022-02-12 18:22:31

通过(user_objects)定时检查数据库是对象的状态。有异常报警。

仅提供解决思路,如有帮助,请点击采纳

暂无图片 评论
暂无图片 有用 0
Thomas

如果针对特定SCHEMA,那可以做个DDL TRIGGER,专门针对这个SCHEMA的,写法大致如下:

for rec in (select OBJECT_TYPE,OBJECT_NAME from user_objects where status='INVALID' and object_name not like '%OGG%')
loop
--dbms_output.put_line(rec.object_name);
str:='alter '||rec.object_type||' '||rec.object_name||' compile';
dbms_output.put_line(str);
execute immediate str ;
end loop;

一旦有了DDL,会自动执行如上语句,从而重编译失效对象

暂无图片 评论
暂无图片 有用 0
Root__Liu

可以打开ddl监控,设置enable_ddl_logging参数为true,可以在alert日志里面看到所有的ddl操作时间和操作命令,可以通过监控alert日志告警来监控失效对象。

通过短信告警可以实现ddl操作,同时,可以监控失效对象,若ddl操作和失效对象同时告出来,基本可以说明是ddl导致的对象失效了。

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏