上个星期开始,oracle SESSION 老是达到最大连接数,查看oracle SESSION 发现有100多个inactiveSESSION.
可能是由于WEBSPHERE最近老是内存javacore导致websphere出现重启现象。
以下的SQL语句列出当前数据库建立的会话情况:
select sid,serial#,username,program,machine,status from v$session;
SID SERIAL# USERNAME PROGRAM MACHINE STATUS
---------- ---------- ------------------------------ ---------------------------------------------------------------- ---------------------------------------------------------------- --------
1 1 ORACLE.EXE PC-200903311241 ACTIVE
2 1 ORACLE.EXE PC-200903311241 ACTIVE
3 1 ORACLE.EXE PC-200903311241 ACTIVE
4 1 ORACLE.EXE PC-200903311241 ACTIVE
5 1 ORACLE.EXE PC-200903311241 ACTIVE
6 1 ORACLE.EXE PC-200903311241 ACTIVE
7 1 ORACLE.EXE PC-200903311241 ACTIVE
8 1 ORACLE.EXE PC-200903311241 ACTIVE
9 14 BASE_BJ JDBC Thin Client PC-200903311241 INACTIVE
10 585 SYS plsqldev.exe WORKGROUP/BOXING10 INACTIVE
13 220 DRV_BX_2010_EXAM plsqldev.exe WORKGROUP/XZ INACTIVE
14 10 VIO_ADMIN JDBC Thin Client PC-200903311241 INACTIVE
15 21 VIO_ADMIN JDBC Thin Client PC-200903311241 INACTIVE
16 95 SYS plsqldev.exe WORKGROUP/BOXING10 ACTIVE
18 374 DRV_BX_2010_EXAM xz INACTIVE
19 193 DRV_BX_2010_EXAM plsqldev.exe WORKGROUP/XZ INACTIVE
20 281 SYS plsqldev.exe WORKGROUP/BOXING10 INACTIVE
21 201 DRV_BX_2010_EXAM plsqldev.exe WORKGROUP/XZ ACTIVE
22 267 SYS plsqldev.exe WORKGROUP/BOXING10 INACTIVE
29 248 DRV_BX_2010_EXAM plsqldev.exe WORKGROUP/XZ ACTIVE
SID SERIAL# USERNAME PROGRAM MACHINE STATUS
---------- ---------- ------------------------------ ---------------------------------------------------------------- ---------------------------------------------------------------- --------
31 354 DRV_BX_2010_EXAM plsqldev.exe WORKGROUP/XZ INACTIVE
32 53 BASE_BJ JDBC Thin Client PC-200903311241 INACTIVE
33 720 VIO_ADMIN BOXING12 INACTIVE
其中,
SID 会话(session)的ID号;
SERIAL# 会话的序列号,和SID一起用来唯一标识一个会话;
USERNAME 建立该会话的用户名;
PROGRAM 这个会话是用什么工具连接到数据库的;
STATUS 当前这个会话的状态,ACTIVE表示会话正在执行某些任务,INACTIVE表示当前会话没有执行任何操作;
如果DBA要手工断开某个会话,则执行:
alter system kill session 'SID,SERIAL#' ;
或
alter system kill session 'SID,SERIAL#' immediate; 不会产生KILLED SESSION
注意,上例中SID为1到8(USERNAME列为空)的会话,是Oracle的后台进程,不要对这些会话进行任何操作。
从各处收集了一些查看当前会话的语句和杀session的方法,记录一下:
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;
如果查询结果为no rows selected,说明数据库中没有死锁。否则说明数据库中存在死锁。
接下来说明一下会话的状态:
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/ora92/network/admin
2.通过ALTER PROFILE DEFAULT LIMIT IDLE_TIME 10; 命令修改,记得重启下oracle。
==========
自动杀的JOB