- 浏览: 576438 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
a1641693970:
还不错,学习了
BeanUtils使用总结(二)LazyDynaBean -
zjfshowtime:
很好的办法,学习了。
ORA-28001: the password has expired -
ya654277yo:
哦,多谢分享
Apache整合Tomcat后get方式提交中文乱码问题解决 -
foolkeeper:
nice !!
jvm内存参数设定 -
tracy821:
谢谢了,找了好久才找到
关于Spring 声明式事务处理时,throws exception不回滚的问题
1、找到sid,serial#;
SELECT /*+ rule */ s.username, l.type,
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,s.status
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 order by l.type;
2、根据找到的sid,serial#,执行以下语句,清除进程。
alter system kill session '~sid~,~serial#~';
例如: alter system kill session '14,4820';
如果死锁不能自动释放,就需要我们手工的kill session。 步骤如下:
1. 查看有无死锁对象,如有kill session
SELECT 'alter system kill session ''' || sid || ',' || serial# || ''';' "Deadlock"
FROM v$session
WHERE sid IN (SELECT sid
FROM v$lock
WHERE block = 1);
如果有,会返回类似与如下的信息:
alter system kill session '132,731';
alter system kill session '275,15205';
alter system kill session '308,206';
alter system kill session '407,3510';
kill session:
执行alter system kill session '391,48398'(sid为391);
注意:应当注意对于sid在100以下的应当谨慎,可能该进程对应某个application,如对应某个事务,可以kill.
2. 查看导致死锁的SQL
SELECT s.sid, q.sql_text
FROM v$sqltext q, v$session s
WHERE q.address = s.sql_address AND s.sid = &sid -- 这个&sid 是第一步查询出来的
ORDER BY piece;
返回:
SID SQL_TEXT
---------- ----------------------------------------------------------------
77 UPDATE PROFILE_USER SET ID=1,COMPANY_ID=2,CUSTOMER_ID=3,NAMED
77 _INSURED_ID=4,LOGIN=5,ROLE_ID=6,PASSWORD=7,EMAIL=8,TIME_ZON
77 E=9 WHERE PROFILE_USER.ID=:34
3 rows selected.
3. 查看谁锁了谁
SELECT s1.username
|| '@'
|| s1.machine
|| ' ( SID='
|| s1.sid
|| ' ) is blocking '
|| s2.username
|| '@'
|| s2.machine
|| ' ( SID='
|| s2.sid
|| ' ) '
AS blocking_status
FROM v$lock l1,
v$session s1,
v$lock l2,
v$session s2
WHERE s1.sid = l1.sid
AND s2.sid = l2.sid
AND l1.BLOCK = 1
AND l2.request > 0
AND l1.id1 = l2.id1
AND l2.id2 = l2.id2;
或者
SELECT
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
三.锁 和 阻塞
3.1 相关概念
通常来讲,系统如果平时运行正常,突然会停止不动,多半是被阻塞(Blocked)住了。 我们可以通过v$lock 这张视图,看查看阻塞的信息。
SQL> desc v$lock;
名称 是否为空? 类型
----------------------------------------- -------- -----------------
ADDR RAW(4)
KADDR RAW(4)
SID NUMBER
TYPE VARCHAR2(2)
ID1 NUMBER
ID2 NUMBER
LMODE NUMBER
REQUEST NUMBER
CTIME NUMBER
BLOCK NUMBER
我们关注的比较多的是request 和 block 字段。
如果某个request列是一个非0值,那么它就是在等待一个锁。 如果block列是1,这个SID
就持有了一个锁,并且阻塞别人获得这个锁。 这个锁的类型由TYPE 字段定义。锁的模式有LMODE 字段定义,ID1和ID2
字段定义了这个锁的相关信息。ID1相同,就代表指向同一个资源。这样就有可能有加锁者和等待者。 LMODE 的6中模式参考上面的TM锁类型表。
可以结合v$lock 和 v$session 视图来查询相关的信息:
SELECT sn.username,
m.SID,
sn.SERIAL#,
m.TYPE,
DECODE (m.lmode,
0,
'None',
1,
'Null',
2,
'Row Share',
3,
'Row Excl.',
4,
'Share',
5,
'S/Row Excl.',
6,
'Exclusive',
lmode,
LTRIM (TO_CHAR (lmode, '990')))
lmode,
DECODE (m.request,
0,
'None',
1,
'Null',
2,
'Row Share',
3,
'Row Excl.',
4,
'Share',
5,
'S/Row Excl.',
6,
'Exclusive',
request,
LTRIM (TO_CHAR (m.request, '990')))
request,
m.id1,
m.id2
FROM v$session sn, v$lock m
WHERE (sn.SID = m.SID AND m.request != 0) --存在锁请求,即被阻塞
OR (sn.SID = m.SID --不存在锁请求,但是锁定的对象被其他会话请求锁定
AND m.request = 0 AND lmode != 4
AND (id1, id2) IN
(SELECT s.id1, s.id2
FROM v$lock s
WHERE request != 0
AND s.id1 = m.id1
AND s.id2 = m.id2))
ORDER BY id1, id2, m.request;
或者
SELECT
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
转自:http://yajie.iteye.com/blog/1188309
发表评论
-
Oracle数据库的锁类型(转)
2014-05-08 14:05 1132Oracle数据库的锁类型 o ... -
AWR报告手动生成
2014-04-12 12:23 998sqlplus / as sysdba SQL> ... -
PowerDesigner脚本生成
2013-11-23 17:04 8621 PowerDesigner中批量根据对象的name生 ... -
EXP-00011:oracle11g 空表不能exp导出的问题
2013-05-23 10:51 1401环境:Oracle11gR2+linux RH 5.5 最 ... -
新建Oracle数据库2种方法
2013-03-14 15:53 1152新建Oracle数据库2种方法:1.通过运行Oracle ... -
(转)查看执行计划
2012-09-29 11:00 1470Oracle10g获取sql语句的执 ... -
(转)ORACLE 数据库(查询--主键外键约束)
2012-05-15 15:50 2148-- 查询外键约束(查某表的所有父表) sel ... -
(转)Redhat Linux安装Oracle 11g R2数据库
2012-04-04 22:17 1744Oracle目前最新的版本是11g R2版本,网上不少安装介绍 ... -
ORA-28001: the password has expired
2012-02-23 13:47 9493大早上正式库提示: Oracle提示错误消息ORA-28 ... -
linux自动备份数据库
2012-02-13 18:08 1033#!/bin/sh export PATH=$PATH:$H ... -
Oracle中使用sys_connect_by_path函数实现行转列
2012-01-09 20:16 1376select category ,MAX(s ... -
Oracle常用技巧(转)
2011-10-11 14:39 10121.删除表空间 DROP TABLESPACE ... -
查询oracle表的信息(表,字段,约束,索引)
2011-08-09 12:22 11271、查询出所有的用户表 select * fro ... -
Oracle index
2011-08-09 12:19 1125索引: 1、一般索引: create inde ... -
(转)oracle执行计划
2011-07-20 19:23 1080一.相关的概念 ... -
ORA-01658 表空間大小不足
2011-02-22 12:24 1325解決方法: 1.查詢各個表空間的利用率 sele ... -
(转)ORACLE数据导入导出
2011-02-19 15:45 902Oracle数据导入导出imp/exp就相当于oracle数据 ... -
Oracle 10g 安装之网络适配器要求 Microsoft Loopback Adapter (环回适配器)
2011-02-19 15:36 4687安装10g的时候,遇到了 ... -
【ORA-12560: TNS: 协议适配器错误】解决方案
2011-02-19 14:42 1348ORA-12560: TNS: 协议适配器错误的问题的原因有三 ... -
SQL优化34条
2010-07-05 12:47 8401) 选择最有效率的表名顺序(只在基于规则的优化器中有效):O ...
相关推荐
数据库死锁的概念, 所谓死锁,是指两个会话,每个会话都持有另外一个会话想要的资源,因争夺资源而造成...对于锁死的会话,我们可以直接删掉该会话,等事物回滚完成,也可以找出锁死进程的spid,从服务器中删掉该进程。
当你采用的是直接连接数据库的方式,也不要用OS系统命令$kill process_num或者$kill -9 process_num来终止用户连接,因为一个用户进程可能产生一个以上的锁,杀OS进程并不能彻底清除锁的问题。 oracle死锁表后处理...
解决锁冲突通常包括强制回滚事务、杀死会话进程或者调整应用程序逻辑以减少并发冲突。强制回滚可以通过`ALTER SYSTEM KILL SESSION`命令实现,但这种方法应谨慎使用,因为它可能会影响业务的正常运行。更好的方式是...
- **解决方法**: 使用`ALTER SYSTEM KILL SESSION`命令杀死其中一个会话。 #### 35. ORA-00061: 另一个例程设置了不同的DML_LOCKS - **描述**: 当两个或多个会话设置了不同的DML_LOCKS时触发。 - **解决方法**: ...
一旦识别出锁定的表和会话,下一步是决定如何解决问题。可能的解决方案包括: 1. **手动解锁**:可以使用`ALTER SYSTEM KILL SESSION`命令杀死阻塞的会话,但需谨慎操作,避免数据丢失。 2. **调整应用逻辑**:优化...
- **解决方法**:使用`ALTER SYSTEM KILL SESSION`来杀死造成死锁的会话。 ##### orA-00061: 另一个例程设置了不同的DML_LOCKS - **描述**:DML_LOCKS参数被另一个实例设置为不同的值。 - **解决方法**:协调所有...
在Oracle数据库管理及开发过程中,有时会遇到表被锁的问题,这种情况可能会导致应用程序出现性能瓶颈甚至完全无法执行某些操作。因此,掌握如何查看哪些表被锁以及如何解锁变得尤为重要。下面将详细介绍相关的查询...
- 在Windows或Unix中使用`orakill`命令杀死线程: ```bash orakill orcl 12345 ``` #### 四、注意事项 1. **谨慎使用`KILL`命令**:终止会话可能会导致正在进行的事务回滚,从而可能影响数据一致性。 2. **...
如果发现某个会话长时间占用表锁导致其他操作无法执行,可以通过以下命令杀死该会话: ```sql ALTER SYSTEM KILL SESSION '286,2184'; ``` 这里 `286,2184` 是会话ID及其序列号。 **检查会话状态:** ```sql SELECT...