前两天同事又碰到oracle连接n慢的问题,由于这个现象时有时无,于是我检查了下是不是表或者其他对象有被锁住,或者是否有死锁。对象资源被锁是一个经常要碰到的急需解决的问题。
在Oracle里,当前的锁的信息存储在动态性能视图v$lock和v$locked_object中。先来看下它们定义:
Oracle官方文档及简单翻译 (oracle官方可下载资源网址在我的收藏里有列出):
V$LOCK
lists the locks currently held by the Oracle Database and outstanding requests for a lock or latch.
视图V$LOCK列出了当前被Oracle数据库持有的所有的锁以及未完成的锁和栓锁请求。
V$LOCKED_OBJECT
lists all locks acquired by every
transaction on the system. It shows which sessions are holding DML
locks (that is, TM-type enqueues) on what objects and in what mode.
视图V$LOCKED_OBJECT列出系统中每个事务获得的所有锁。它列出了那些以具体哪些模式对具体哪些对象持有TM锁的会话。
查找有关锁/死锁的更多我们需要的信息有时还需要通过表all_objects或者视图v$session,它们就不再一一讲解,请到oracle官方文档
查询。
查询有关锁的信息:
查询一:
select a.os_user_name,
a.oracle_username,
a.object_id,
c.object_name,
c.object_type
from v$locked_object a, dba_objects c
where a.object_id=c.object_id;
查询二:
select s.PROCESS,
s.SID,
s.SERIAL#,
b.object_name,
b.subobject_name,
a.LOCKED_MODE,
s.OSUSER,
s.LOGON_TIME,
s.MACHINE,
s.PROGRAM,
s.SQL_ADDRESS,
s.SQL_HASH_VALUE
from v$locked_object a, dba_objects b, v$session s
where a.OBJECT_ID = b.object_id
and a.SESSION_ID = s.SID
找到锁/死锁就好办了。找到相应需要解开的锁可以通过完成该事务或者杀死会话解锁。
杀锁进程可以用以下命令:
alter system kill session '
'查出的SID,查出的SERIAL#'。(这个必须要用查询二来获得相关Session信息)
杀oracle会话进程有时会失效,需要根据SPID到系统中杀相应的oracle进程。另外要注意的是, 我看到网上有外国的学者说, 当直接连接数据库时, 直接用OS命令 $kill process_num 或者 $kill -9 process_num杀系统进程来终止用户连接也不能完全解决问题, 因为一个用户进程可能产生一个以上的锁,杀oracle进程不能彻底解决锁的问题。
Reference:
http://www.lslnet.com/linux/edosc/42/linux-42294950.htm
分享到:
相关推荐
详细介绍了Oracle中各种锁的机制原理及解锁方法
详细介绍了Oracle中乐观锁、悲观锁的原理及应用,并有实例
oracle中锁和表分区 详细的介绍,自己学的时候总结的。希望对你有点帮助哦
Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实现的呢?
数据库死锁的概念, 所谓死锁,是指两个会话,每个会话都持有另外一个会话想要的资源,因争夺资源而造成...对于锁死的会话,我们可以直接删掉该会话,等事物回滚完成,也可以找出锁死进程的spid,从服务器中删掉该进程。
在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁(用来保证表的结构不被用户修改),TX锁称为事务锁或行级锁。当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统...
介绍在oracle数据库中锁的使用和运行方式
怎样快速查出Oracle 数据库中的锁等待 怎样快速查出Oracle 数据库中的锁等待
此文档可以查看当前Oracle数据库中被锁的表和解锁命令,
oracle查询锁表和解锁。oracle在操作的过程中经常会遇到锁表的情况,一般能够用kill命令消除。
一片关于Oracle中索引、序列、锁机制的文章,里面出现的每条语句都附有截图。
基于oracle数据库开发的应用,在发生锁情况下,如何检查锁和解锁
怎样快速查出Oracle_数据库中的锁等待,该文档详细,且定位准确
Oracle中使用锁进行并发控制
处理oracle中杀不掉的锁
oracle中判断表是否被锁 和解锁方法
当前系统中存在的锁争用: 引发争用的session信息: 引发争用的sql语句: 引发争用的数据对象 --查看被锁对象 --数据库中的表锁,查找某个表被哪个session锁定 --DML语句产生的锁 --谁锁住了表,引起了谁的等待 --...
彻底清除Oracle中长时间持锁的session
1.查询数据库中的锁 select * from v$lock; select * from v$lock where block=1; 2.查询被锁的对象 select * from v$locked_object; 3.查询阻塞 查被阻塞的会话 select * from v$lock where lmode=0 and type ...