Oracle创建Job时遇到ORA-04063 SYS.DBMS_INTERNAL_LOGSTDBY的解决办法

在测试平台上创建Oracle Job时遇到ORA-04063错误,通过检查发现DBMS_INTERNAL_LOGSTDBY依赖的视图存在错误。通过创建缺失的system.logmnr_session$和system.logmnr_log$表,重新编译相关视图和包体,最终成功解决错误并创建了Job。

  项目上需要使用job在每月月初重置序列,在我本机的Oracle上创建job成功了,但在项目的测试平台上创建却报了ORA-04063的错误,详见下图:

在网上搜索,有人说要重新编译DBMS_INTERNAL_LOGSTDBY这个包体,尝试了一下,编译后还是有错。

在PL/SQL中查看DBMS_INTERNAL_LOGSTDBY,发现其依赖的视图“DBA_LOGSTDBY_PROGRESS”有错误,打开“DBA_LOGSTDBY_PROGRESS”的DDL语句并执行,报“找不到system.logmnr_session$”的错误:

经过查找发现system用户下的确没有logmnr_session$这张表,于是我从其他数据库拷贝system.logmnr_session$的DDL语句过来执行。然后再执行创建“DBA_LOGSTDBY_PROGRESS”的DDL语句,依然报错:

查看LOGSTDBY_LOG的DDL语句,并执行:

提示找不到“system.logmnr_log$”,再从其他数据库拷贝system.logmnr_log$的DDL语句过来执行,然后再创建LOGSTDBY_LOG,成功了:

提供的参考引用内容中未涉及解决ORA - 12008、ORA - 06512、ORA - 02049错误的方法,不过可以从常见的数据库错误处理思路来给出一般性的解决建议。 ### ORA - 12008错误 该错误表明在物化视图或区域映射刷新路径中出现了问题。可能的原因是依赖对象被修改、权限不足、数据不一致等。 - **检查依赖对象**:确保物化视图所依赖的基表、函数、包等对象没有被修改或删除。可以通过查询数据字典视图 `ALL_DEPENDENCIES` 来查看依赖关系。 ```sql SELECT * FROM ALL_DEPENDENCIES WHERE NAME = 'your_materialized_view_name'; ``` - **检查权限**:确认执行刷新操作的用户具有足够的权限。例如,需要有对基表的查询权限以及对物化视图的刷新权限。 - **重建物化视图**:如果以上检查都没有问题,可以尝试删除并重新创建物化视图。 ```sql DROP MATERIALIZED VIEW your_materialized_view_name; CREATE MATERIALIZED VIEW your_materialized_view_name AS SELECT * FROM your_base_table; ``` ### ORA - 06512错误 这是一个PL/SQL异常处理的错误,通常表示在PL/SQL代码中发生了异常。需要查看错误堆栈信息来定位具体的异常发生位置。 - **查看错误堆栈**:在SQL*Plus中,可以使用 `SHOW ERRORS` 命令查看PL/SQL块中的错误信息。 ```sql DECLARE -- your PL/SQL code here BEGIN -- your PL/SQL code here EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLERRM); DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE()); END; ``` - **调试PL/SQL代码**:使用调试工具(如Oracle SQL Developer的调试功能)逐步执行PL/SQL代码,找出引发异常的具体语句。 ### ORA - 02049错误 该错误表示分布式事务等待锁超。可能的原因是事务持有锁的间过长、锁争用严重等。 - **查看锁信息**:可以通过查询 `V$LOCK` 视图来查看当前的锁信息,找出持有锁的事务。 ```sql SELECT * FROM V$LOCK WHERE TYPE = 'TX'; ``` - **结束长间运行的事务**:如果发现某个事务持有锁的间过长,可以考虑结束该事务。可以通过查询 `V$SESSION` 和 `V$TRANSACTION` 视图来找出对应的会话,并使用 `ALTER SYSTEM KILL SESSION` 命令结束会话。 ```sql SELECT s.sid, s.serial# FROM V$SESSION s, V$TRANSACTION t WHERE s.taddr = t.addr; -- 结束会话 ALTER SYSTEM KILL SESSION 'sid,serial#'; ``` - **调整超间**:可以通过修改 `distributed_lock_timeout` 参数来调整分布式事务等待锁的超间。 ```sql ALTER SYSTEM SET distributed_lock_timeout = 600; -- 设置为10分钟 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值