通过Kill Session杀掉Oracle中会话或死锁的方式
一.v$session,v$process,v$locked_object三张表的一些常见操作:
1.查看当前总会话数和进程数
select count(*) from v$session; select count(*) from v$process;
2.查询那些应用的连接数此时是多少
select b.MACHINE, b.PROGRAM, count(*) from v$process a, v$session b where a.ADDR = b.PADDR and b.USERNAME is not null group by b.MACHINE, b.PROGRAM order by count(*) desc;
3.查询是否有死锁:
select * from v$locked_object;
如果查询结果为空,说明数据库中没有死锁。
实例:
在pl/sql中执行 [delete from news where id = 1;] ,但是没有进行commit。
此时,执行 [select * from v$locked_object;],会出现如下结果:
二.会话状态的说明:
首先,查询Session中的sid,serial#,username,status,machine:
select saddr, sid, serial#, paddr, username, status, machine from v$session where username is not null;
1.active 处于此状态的会话,表示正在执行,处于活动状态。
2.killed 处于此状态的会话,表示出现了错误,正在回滚,当然,也是占用系统资源的。还有一点就是,
killed的状态一般会持续较长时间,而且用windows下的工具pl/sql developer来kill掉,是不管用的,
要用命令:alter system kill session 'sid,serial#' ;
3.inactive 处于此状态的会话表示不是正在执行的,比如select语句已经完成。(我一开始以为,
只要是inactive状态的会话,就是该杀,为什么不释放呢。)其实,inactive对数据库本身没有什么影响,
但是如果程序没有及时commit,那么就会造成占用过多会话。解决inactive的方法最好的就是在oracle中
直接设置超时时间,也是有两种方法,区别暂时还不清楚:
(1).修改sqlnet.ora文件,新增expire_time=x(单位是分钟)
我的sqlnet.ora位置在D:\Oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN
(2).通过ALTER PROFILE DEFAULT LIMIT IDLE_TIME 10; 命令修改,记得重启下oracle。
三.查找并kill死锁的session:
1.查找:(注:若没有死锁的session,查询记录将为空。)
(1).查询v$locked_object表
select * from v$locked_object;
(2).以Oralce管理员权限用户登录Oracle数据,查询到被锁的对象
SELECT a.object_id, a.session_id, b.object_name, c.* FROM v$locked_object a, dba_objects b, v$session c WHERE a.object_id = b.object_id AND a.SESSION_ID = c.sid(+);
2.Kill Session:
alter system kill session 'sid, serial#';
注:
有时alter system kill session 'sid,serial#';并不能彻底的杀死会话。
如果有ora-00031错误,则在后面加immediate;
alter system kill session '29,5497' immediate;
例如:
上面查出来的一条记录的sid是149, serial#为4153,就执行以下的语句:
alter system kill session '149,4153' ;
3.如果要一次性杀死多个会话,一个一个填写sid和serial#十分的繁琐,应该在查询被锁对象的同时拼凑出多条的杀会话语句,以分号分隔,一起复制下来,然后就可以批量的执行了。
SELECT 'alter system kill session ''' || c.sid || '' || ',' || c.serial# || ''';', a.object_id, a.session_id, b.object_name, c.* FROM v$locked_object a, dba_objects b, v$session c WHERE a.object_id = b.object_id AND a.SESSION_ID = c.sid(+) AND schemaname = 'Unmi' ORDER BY logon_time
相关推荐
kill system session(解决oracle死锁)
本过程自动捕捉SQLSERVER中的死锁进程并且自动杀掉
本文介绍了解决Oracle杀死死锁进程的方法。
有效关闭Oracle死锁进程,和释放状态为killed的session
oracle死锁问题查询代码,仅供参考,有问题大家一起交流
oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁
收集,整理出来的,很实用的,关于oracle中常见的死锁的处理
oracle杀死会话,解决死锁。保证准确无误。。。。。。。。
OracleOracle查询死锁表OracleOracle查询死锁表OracleOracle查询死锁表
oracle如何解除死锁[进程互相锁死]
解决Oracle数据库死锁问题,查询出数据库所有死锁,并杀死所有的死锁,解决程序运行问题;
在任何数据库中发生死锁都是不愉快的,即使是在一个特殊的情况下发生也是如此,它们会减小应用程序的接受程度(ACCEPTANCE),因此避免并正确解释死锁是非常重要的。
oracle查询死锁语句,并能根据根据ID值杀死锁表的进程!
oracle杀死锁 ,在批量导入数据的时候,在数据库中很容易就碰到锁表了,导致长时间数据库卡死,此脚本方便找寻数据库被锁对象,如果在oracle中不能alter kill掉 说明该session已过期需要进入后台去杀掉进程
oracle后台查看死锁语句,也可以通过plsql的工具---会话--点击lock_wait列过滤出死锁的语句。
提供了处理oracle死锁的详细oracle死锁语句,包括对死锁的定位,查找死锁的进程,kill掉死锁的进程,
但通常情况下,出现死锁时,想通过命令行或者通过Oracle的管理工具删除有死锁的session,oracle只会将该session标记为killed,但无法清除掉,往往需要通过第二步在操作系统层级进行删除! Connected to Oracle9i ...
oracle查询kill死锁方法
并发访问ORACLE数据库的数据死锁分析和解决措施.pdf
执行查询语句查询Oracle是否有死锁,以及叫你如何解锁。