oracle--job执行报错--ORA-01031

在Oracle数据库环境中,修改了Job内的SQL语句后,Job无法正常执行,出现权限不足错误。通过调整B用户对相关表的权限,Job恢复正常执行。

今天下午在编辑一个job的时候,发现一个奇怪的现象,A用户下面有一个job,半小时执行一次,然后我在job里加了些增删改的操作,之后job就运行不了了,具体报错信息如下:

Errors in file /oracle/admin/blog/udump/blog_ora_21537.trc:
ORA-12012: error on auto execute of job 2095
ORA-06550: line 4, column 27:
PL/SQL: ORA-01031: insufficient privileges
ORA-06550: line 2, column 1:
PL/SQL: SQL Statement ignored
 
这个错误到蛮奇怪的啊,之前执行都好好的啊,之后把新加的代码去掉也可以正常执行,仔细想想,既然之前都可以正常执行,那么执行job相关包的权限都有的,而job具体执行的语句也就是一条简单的insert语句,类似如下:
insert into B.table1
select * from B.table1@db_link t1
where not exists
(select 1 from B.table1 t2 where t1.col_1=t2.col_1 and ....);
新增加的语句也和上面类似,只是B用户下的另外一张表,之后job就执行不了了,但是把这job里的内容拿出来,直接执行是可以的,db_link也是A用户创建的,应该没什么问题,然后试着:
grant execute dbms_job to A;grant create job to A;
还是不行.....纠结中.....
最后在B用户下执行: grant insert,select on table2 TO A;
然后job就可以正常执行了,还真没嫩明白,有待研究.....
记录一下~

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25618347/viewspace-714756/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25618347/viewspace-714756/

<think>我们正在处理一个关于Oracle JOB执行报错ORA-00054的问题。 ORA-00054错误表示“资源正忙,无法立即获取指定操作所需的锁”。这通常发生在尝试对数据库对象(如表)进行操作时,该对象已被另一个事务锁定(例如被另一个会话以独占模式锁定)。 在JOB执行过程中出现此错误,可能是因为该JOB要访问的对象(如表)被其他会话占用,无法立即获得所需的锁。 常见原因: 1. 其他用户或进程正在对目标表执行DDL操作(如ALTER TABLE)或长时间未提交的DML操作(如UPDATE、DELETE)。 2. JOB本身的多个实例同时运行,导致资源争用(如果JOB被意外多次启动)。 3. 数据库中存在长时间运行的事务未提交,持有锁。 解决方案建议: 1. 等待并重试:设计JOB逻辑,在遇到ORA-00054时进行重试(例如使用DBMS_LOCK.SLEEP等待几秒后重试)。 2. 查找锁持有者:通过视图(如DBA_BLOCKERS、V$LOCK、V$SESSION)查询当前锁的持有者,并决定是否终止阻塞会话(使用ALTER SYSTEM KILL SESSION)。 3. 调整JOB调度:避免在业务高峰期执行可能冲突的操作,或者确保在维护窗口执行。 4. 优化事务:确保事务尽可能短,避免长时间持有锁。 5. 使用NOWAIT选项:在DML语句中指定NOWAIT(如SELECT ... FOR UPDATE NOWAIT)可以立即返回错误而不是等待,但这需要应用程序能够处理错误。 具体步骤: - 查询锁信息: SELECT * FROM V$LOCKED_OBJECT; SELECT * FROM DBA_BLOCKERS; SELECT SID, SERIAL#, USERNAME, BLOCKING_SESSION_STATUS, BLOCKING_SESSION FROM V$SESSION WHERE BLOCKING_SESSION IS NOT NULL; - 如果确定可以终止阻塞会话: ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE; 注意:终止会话可能会影响其他用户,需谨慎操作。 此外,检查JOB的定义,确保没有不必要的锁争用。 根据以上内容,我们提出相关问题: 1. 如何查询Oracle中当前锁定的对象以及锁的持有者? 2. 在PL/SQL中如何实现遇到ORA-00054错误时自动重试的机制? 3. 如何避免Oracle JOB执行过程中因锁冲突而失败? 4. 使用ALTER SYSTEM KILL SESSION终止会话时需要注意哪些风险? 5. 除了锁争用,还有哪些原因可能导致JOB执行失败,如何排查? 但是注意,我们需要3-5个问题,我们选择5个问题。 按照要求,在最后输出§§相关问题§§,然后列出问题。 </think>### 回答: ORA-00054 是 Oracle 数据库的并发控制错误,表示"资源正忙,无法立即获取锁"。当 JOB 尝试修改已被其他会话锁定的数据库对象(如表、行或分区)时触发。常见原因包括: - **锁冲突**:其他会话持有目标对象的排他锁(如长时间未提交的 DML 事务) - **DDL 操作阻塞**:对象正被结构修改(如 `ALTER TABLE`) - **JOB 并发问题**:同一 JOB 的多个实例同时运行 - **索引/分区维护**:在线重建索引或分区交换时锁定资源 **解决方案建议:** 1. **定位锁源**:查询锁持有者: ```sql SELECT * FROM V$LOCKED_OBJECT; SELECT SID, SERIAL#, SQL_ID FROM V$SESSION WHERE SID IN (SELECT BLOCKING_SESSION FROM DBA_BLOCKERS); ``` 2. **终止阻塞会话**(谨慎使用): ```sql ALTER SYSTEM KILL SESSION '<SID>,<SERIAL#>' IMMEDIATE; ``` 3. **优化 JOB 逻辑**: - 添加重试机制(如 `EXCEPTION WHEN OTHERS THEN RETRY`) - 使用 `NOWAIT` 选项:`SELECT ... FOR UPDATE NOWAIT` 4. **调整调度策略**: - 避免高峰时段运行高锁 JOB - 设置 `resource_manager_plan` 限制并发 5. **预防措施**: - 缩短事务时间(及时提交) - 为 DDL 操作添加 WAIT 子句:`ALTER TABLE ... MODIFY ... WAIT 60` 若问题持续,检查 `DBA_SCHEDULER_JOB_LOG` 中的 `ERROR#` 和 `ADDITIONAL_INFO` 字段精确定位。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值