oracle锁表检查处理

oracle锁表以及存储的原因

针对在数据库中锁表或者编译存储时,经常会出现无法编译存储,或者编译状态一直在卡着,从而plsql客户端无响应,这时候就要判定是否存在锁表从而导致存储无法编译通过。
  •      查询数据库里面是否存在锁表,查询sql如下:
    
SELECT l.session_id sid, s.serial#, l.locked_mode,l.oracle_username,
l.os_user_name,s.machine, s.terminal, o.object_name, s.logon_time
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
ORDER BY sid, s.serial# ;

可以查到锁表的信息如下:
在这里插入图片描述

  • 查到数据后,可以使用如下语句进行解锁,后面的session后面的参数 6187是上述sql查到的sid,后面的46273是上述sql查到的字段serial。
alter system kill session '6187,46273';
  • 但是当执行这段sql时,会有提示,数据库登陆用户权限不足,该怎么办呢?
  • 用dba用户给你所登陆的数据库用户进行添加权限,sql如下:wasys350_gsdl这个是我当前登陆的数据库用户
grant select any dictionary,select any table,unlimited tablespace,update any table,connect,
resource,dba,exp_full_database,imp_full_database,alter any index,insert any table,alter any procedure,alter any table,delete any table,drop any sequence,debug any procedure, debug connect session to wasys350_gsdl; 
  • 执行完上述添加权限后,可以再次执行下面的sql
alter system kill session '6187,46273';
  • 执行完后就可以正常的解锁了,然后用下面sql再次去查询就不会出现锁表的信息了
SELECT l.session_id sid, s.serial#, l.locked_mode,l.oracle_username,
l.os_user_name,s.machine, s.terminal, o.object_name, s.logon_time
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
ORDER BY sid, s.serial# ;
  • 当上述sql查不到消息时,说明锁表信息已正常解锁,但是在编译存储的时候还会出现卡死状况,说明锁表进程资源还没有释放,可以使用如下sql第二种,直接可以释放锁表信息资源
alter system kill session 'sid,serial#';(用来终止会话,不释放资源)
alter system kill session '154,58' immediate;(终止会话,释放资源)
  • 用第二种可以终止会话并且释放资源,然后进行编译,编译正常通过。
上述就是解决锁表的方法,愿可以帮助你们解决如上问题。如果你们有好的解决方式或者上述描述有问题可以进行留言进行讨论。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值