一.v$session,v$process,v$locked_object三张表的一些常见操作:
1.查看当前总会话数和进程数
--会话表
select * from v$session;
--进程表
select * from v$process;
--锁信息
select * from v$locked_object;
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.查询是否有死锁:
正常情况下,v$locked_object是没有信息的,但当我们进行了一个表数据的增、删、改操作后,不commit,就可以查到锁信息
delete from emp e where e.empno='7369';
select * from v$locked_object;
4、会话状态说明
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(单位是分钟)
路径:\Oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN
(2).通过ALTER PROFILE DEFAULT LIMIT IDLE_TIME 10; 命令修改,记得重启下oracle。
5、查找并kill死锁的session:
1.以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;
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;