小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。
📚 前言
在日常数据库维护过程中,我们会发现数据库中一些对象(包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三思而后行 ❤️