Oracle 无效对象查询,编译无效对象

595 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。

📚 前言

在日常数据库维护过程中,我们会发现数据库中一些对象(包Package、存储过程Procedure、函数Function、视图View、同义词.....)会失效,呈现无效状态(INVALID)。

有时候需要定期检查数据库中存在哪些失效对象,对于存在异常的对象需要重新编译,有些自动失效的对象,一般会在下次调用的时候,会被重新编译,所以这些不需要人工干预。

那么为什么对象突然会失效呢?又如何快速、高效的编译失效对象呢?哪些失效的对象不需要我们去重新编译呢?

介绍

Oracle总是会尝试自动重编译无效的PL/SQL对象和视图,但是可能不会成功。

虽然Oracle可能建议手动地进行编译,不过我们并非必须进行这个操作。通常无效对象的产生是由于数据库迁移,针对无效对象,我们可以采取重编译和索引重建。

编译

为了标识数据库中的所有无效的对象,我们可以作为SYSTEM用户或其他有权限的用户做如下查询。

1、检查无效的数据库对象:

SELECT owner, object_name, object_type,status 
FROM dba_objects 
WHERE status = 'INVALID'

2、检查不起作用的约束:

SELECT owner, constraint_name, table_name, constraint_type, status
FROM dba_constraints
WHERE status = 'DISABLED';

3、检查无效的触发器:

SELECT owner, trigger_name, table_name, status
FROM dba_triggers
WHERE status = 'DISABLED'

4、检查失效的索引:

select index_name,table_name,tablespace_name,status
 From dba_indexes 
Where status<>'VALID';

编译无效对象:

有两种方式:

1、执行sql查询结果:

select  'alter  '||object_type||'   '||owner||'.'||object_name||'   compile;'
from  dba_objects t
where t.status = 'INVALID' order by 1;

2、脚本编译:

sqlplus / as sysdba @?/rdbms/admin/utlrp.sql

本次分享到此结束啦~

如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。

❤️ 技术交流可以 关注公众号:Lucifer三思而后行 ❤️