通过Kill Session杀掉Oracle中会话或死锁的方式
2015-05-13 14:33
435 查看
通过Kill Session杀掉Oracle中会话或死锁的方式
一.v$session,v$process,v$locked_object三张表的一些常见操作:
1.查看当前总会话数和进程数
2.查询那些应用的连接数此时是多少
3.查询是否有死锁:
如果查询结果为空,说明数据库中没有死锁。
实例:
在pl/sql中执行 [delete from news where id = 1;] ,但是没有进行commit。
此时,执行 [select * from v$locked_object;],会出现如下结果:
二.会话状态的说明:
首先,查询Session中的sid,serial#,username,status,machine:
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表
(2).以Oralce管理员权限用户登录Oracle数据,查询到被锁的对象
2.Kill Session:
注:
有时alter system kill session 'sid,serial#';并不能彻底的杀死会话。
如果有ora-00031错误,则在后面加immediate;
例如:
上面查出来的一条记录的sid是149, serial#为4153,就执行以下的语句:
alter system kill session '149,4153' ;
3.如果要一次性杀死多个会话,一个一个填写sid和serial#十分的繁琐,应该在查询被锁对象的同时拼凑出多条的杀会话语句,以分号分隔,一起复制下来,然后就可以批量的执行了。
一.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
相关文章推荐
- 事务和锁定-通过结束会话方式解除死锁
- oracle 中通过使用客户端导致查询出来的中文数据为乱码的解决方式
- 新装服务器通过cp的方式安装oracle
- 本文通过举例的方式来教你如何在Oracle中实现SELECT TOP N的方法(转)
- 杀掉(kill)Oracle中会话或死锁
- Oracle kill session – 删除被死锁的会话
- 通过odbc的方式在64位服务器访问32位oracle
- 通过复制oracle软件方式安装oracle数据库
- Oracle 死锁会话处理
- Oracle中的两种验证方式:操作系统验证和密码文件验证,通过操作系统验证的方式解决客户端登录不了数据的问题
- oracle 查询死锁及处理方式
- c#通过Oracle.DataAccess访问Oracle数据库的性能及访问方式小结
- Oracle HowTo:如何通过只读方式更改Oracle数据文件位置
- OracleServer 通过ODBC方式链接SQLServer
- MySQL,Oracle,PostgreSQL,mongoDB 通过web方式管理维护, 提高开发及运维效率
- oracle通过dblink的方式导出数据
- oracle通过dbms_output方式显示存储过程sql
- Oracle DBA之手动地通过命令行的方式创建一个数据库
- oracle impdp通过network_link不落地方式导入数据
- 用户会话状态管理的另类方式:Oracle ADF BC AM的状态管理机制