oracle 出现锁表甚至kill 操作无效的处理方式

问题
给oracle数据库插入海量数据时,发现归档日志剩余空间不足,所以停止执行,但是等待了很长时间,锁仍然没有被释放;

解决
(1)查看被锁的信息:

select * from v$locked_object;

通过字段查看到锁表者的操作信息

SESSION_ID :需要在v$session表中查看的 sid 值,我查到的值为478

ORACLE_USERNAME :锁表者使用的oracle账号

OS_USER_NAME:锁表这操作系统的用户名称

(2)通过上述信息锁定到部分锁表者,若仍然无法确定可以再查看:

select * from v$session t where sid = '478'

查看需要处理事务的几个字段:

sid ,SERIAL# :这两个字段是用来杀进程的字段。

PROGRAM :查看到使用者使用的工具

PREV_HASH_VALUE:通过这个字段在查看出哪个sql语句执行的锁表

3、查看到相关锁表语句:

select * from v$sql where hash_value =‘PREV_HASH_VALUE’

4、确定可以去掉的,不影响其他业务可以执行:

alter system kill session '478,13';

这里的这两个数字分别是sid ,SERIAL# 。

5、正常情况下到这一步就可以完成相关解锁的操作,如果提示无法操作可以查看:

select pro.spid from v$session ses,v$process pro where ses.sid=478 and ses.paddr=pro.addr; 

这里sid就是上面1的 SESSION_ID 。

查出 spid 后再在linux中查看 相关进程的信息

ps -ef|grep  spid

sid是上面的sid然后可以杀掉这个进程

KILL -9 'SPID' 

猜你喜欢

转载自blog.csdn.net/javahelpyou/article/details/114467655