『锁和进程』Oracle的死锁
2009-09-01 15:09
232 查看
[Q]: 怎么查询Oracle的死锁?
[A]: Oracle会自动捕获死锁,不用去干预。但可能会出现锁长时间不能释放的问题。
可以用如下语句查下:
SELECT *
FROM V$lock
WHERE Sid IN (SELECT l.Sid
FROM V$lock l,
(SELECT Id1, Id2, Sid
FROM V$lock
WHERE BLOCK = 1) Blocker
WHERE l.Id1 = Blocker.Id1
AND l.Id2 = Blocker.Id2);
其中:block=1为的是锁始发者。
sid和session的sid关联。
关闭block=1的会话即可
/****************************************************************************/
[Q]: 怎么快速查找锁与锁等待?
[A]: 数据库的锁是比较耗费资源的,特别是发生锁等待的时候,我们必须找到发生等待的锁,
有可能的话,杀掉该进程。
下面这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句
其实产生了两个锁,一个是表锁,一个是行锁。
SELECT /*+ rule */
s.Username,
Decode(l.TYPE, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL) Lock_Level,
o.Owner, o.Object_Name, o.Object_Type, s.Sid, s.Serial#, s.Terminal,
s.Machine, s.Program, s.Osuser
FROM V$session s, V$lock l, Dba_Objects o
WHERE l.Sid = s.Sid
AND l.Id1 = o.Object_Id(+)
AND s.Username IS NOT NULL
如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待
以下的语句可以查询到谁锁了表,而谁在等待。
SELECT /*+ rule */
Lpad(' ', Decode(l.Xidusn, 0, 3, 0)) || l.Oracle_Username User_Name,
o.Owner, o.Object_Name, o.Object_Type, s.Sid, s.Serial#
FROM V$locked_Object l, Dba_Objects o, V$session s
WHERE l.Object_Id = o.Object_Id
AND l.Session_Id = s.Sid
ORDER BY o.Object_Id, Xidusn DESC
以上查询结果是一个树状结构,如果有子节点,则表示有等待发生。
如果想知道锁用了哪个回滚段,还可以关联到V$rollname,其中xidusn就是回滚段的USN
[A]: Oracle会自动捕获死锁,不用去干预。但可能会出现锁长时间不能释放的问题。
可以用如下语句查下:
SELECT *
FROM V$lock
WHERE Sid IN (SELECT l.Sid
FROM V$lock l,
(SELECT Id1, Id2, Sid
FROM V$lock
WHERE BLOCK = 1) Blocker
WHERE l.Id1 = Blocker.Id1
AND l.Id2 = Blocker.Id2);
其中:block=1为的是锁始发者。
sid和session的sid关联。
关闭block=1的会话即可
/****************************************************************************/
[Q]: 怎么快速查找锁与锁等待?
[A]: 数据库的锁是比较耗费资源的,特别是发生锁等待的时候,我们必须找到发生等待的锁,
有可能的话,杀掉该进程。
下面这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句
其实产生了两个锁,一个是表锁,一个是行锁。
SELECT /*+ rule */
s.Username,
Decode(l.TYPE, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL) Lock_Level,
o.Owner, o.Object_Name, o.Object_Type, s.Sid, s.Serial#, s.Terminal,
s.Machine, s.Program, s.Osuser
FROM V$session s, V$lock l, Dba_Objects o
WHERE l.Sid = s.Sid
AND l.Id1 = o.Object_Id(+)
AND s.Username IS NOT NULL
如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待
以下的语句可以查询到谁锁了表,而谁在等待。
SELECT /*+ rule */
Lpad(' ', Decode(l.Xidusn, 0, 3, 0)) || l.Oracle_Username User_Name,
o.Owner, o.Object_Name, o.Object_Type, s.Sid, s.Serial#
FROM V$locked_Object l, Dba_Objects o, V$session s
WHERE l.Object_Id = o.Object_Id
AND l.Session_Id = s.Sid
ORDER BY o.Object_Id, Xidusn DESC
以上查询结果是一个树状结构,如果有子节点,则表示有等待发生。
如果想知道锁用了哪个回滚段,还可以关联到V$rollname,其中xidusn就是回滚段的USN
相关文章推荐
- oracle遇到死锁杀进程
- 杀死Oracle死锁进程
- oracle 批量杀死 死锁进程
- oracle 中--怎么查看当前表空间在作什么操作?--查锁,死锁,当前执行时间长的Sql语句,没提交的事务,对象为哪些进程所用
- [转帖]怎样杀死"Oracle"的死锁进程
- Oracle数据库案例整理-Oracle系统运行时故障-无法释放已经结束的进程资源导致进程死锁
- 杀死oracle死锁进程
- ORACLE-013:oracle中kill死锁进程
- 关闭Oracle死锁进程
- oracle结束死锁进程
- 转:ORACLE查找并解除死锁进程
- oracle杀死死锁进程
- 如何简单有效关闭Oracle死锁进程
- Oracle 进程死锁处理
- Oracle杀死死锁进程
- 如何杀死oracle死锁进程
- 如何杀死oracle死锁进程
- 查看oracle死锁进程并结束死锁
- 如何杀死oracle死锁进程
- Oracle:杀死死锁进程