oracle中连接与会话不是一个概念!!!
在Oracle中,连接只是客户进程和数据库实例之间的一条特殊线路,最常见的就是网络连接。这条连接可能连接到一个专用服务器进程,也可能连接到调度器。如前所述,连接上可以有0个或多个会话,这说明可以有连接而无相应的会话。另外,一个会话可以有连接也可以没有连接。使用高级Oracle Net特性(如连接池)时,客户可以删除一条物理连接,而会话依然保留(但是会话会空闲)。客户在这个会话上执行某个操作时,它会重新建立物理连接。
下面事例显示一个连接有两个会话的情况...
1.查询v$session以显示会话信息
sys@OCP10G> select saddr,sid,serial#,paddr,user#,username,process,server,status from v$session where username=USER;
SADDR SID SERIAL# PADDR USER# USERNAME PROCESS SERVER STATUS
-------- ---------- ---------- -------- ---------- ------------------------------ ------------ --------- --------
6EDBCCEC 144 33 6ECF1864 0 SYS 2752:1860 DEDICATED ACTIVE
2.把autotrace设置为on,再次查询v$session
sys@OCP10G> set autotrace on
sys@OCP10G> select saddr,sid,serial#,paddr,user#,username,process,server,status from v$session where username=USER;
SADDR SID SERIAL# PADDR USER# USERNAME PROCESS SERVER STATUS
-------- ---------- ---------- -------- ---------- ------------------------------ ------------ --------- --------
6EDBCCEC 144 33 6ECF1864 0 SYS 2752:1860 DEDICATED ACTIVE
6EDC269C 149 147 6ECF1864 0 SYS 2752:1860 DEDICATED INACTIVE
可以看到本次连接有两个会话,一个是查询时候的会话(sid,serial#)为(144,33),另一个为autotrace的会话(sid,serial#)为(149,147)!
这两个session的saddr不同,paddr,process都相同,说明会话的os进程号与响应这两个会话的服务器进程的os进程号相同
这两个session的status一个为活动的,一个为不活动的
3.以kill session来做一点实验
3.1.我会打开另外一个sqlplus用johnson建立连接(注意:是连接!不是会话!呵呵),并让它拥有两个会话做kill session实验
查询v$session:
sys@OCP10G> select saddr,sid,serial#,paddr,user#,username,process,server,status from v$session where username is not null;
SADDR SID SERIAL# PADDR USER# USERNAME PROCESS SERVER STATUS
-------- ---------- ---------- -------- ---------- ------------------------------ ------------ --------- --------
6EDBCCEC 144 33 6ECF1864 0 SYS 2752:1860 DEDICATED ACTIVE
6EDCFDDC 161 267 6ECF25E4 58 JOHNSON 3232:2652 DEDICATED INACTIVE
3.2.在johnson窗口使用set autotrace on,回到sys窗口查询v$session
sys@OCP10G> select saddr,sid,serial#,paddr,user#,username,process,server,status from v$session where username is not null;
SADDR SID SERIAL# PADDR USER# USERNAME PROCESS SERVER STATUS
-------- ---------- ---------- -------- ---------- ------------------------------ ------------ --------- --------
6EDBCCEC 144 33 6ECF1864 0 SYS 2752:1860 DEDICATED ACTIVE
6EDC269C 149 159 6ECF25E4 58 JOHNSON 3232:2652 DEDICATED INACTIVE
6EDCFDDC 161 267 6ECF25E4 58 JOHNSON 3232:2652 DEDICATED INACTIVE
可以看到johnson的两个session都是inactive状态,因为我在操作sys窗口...呵呵
3.3.我们在sys窗口运行alter system kill session '149,159',看看发生什么情况
sys@OCP10G> alter system kill session '149,159';
系统已更改。
切到johnson窗口执行查询select * from dual;可以看到autotrace以及半残疾了,因为autotrace相关的session被kill了~为什么不是全残??
johnson@OCP10G> select * from dual;
搜集统计信息时出错 ORA-28
SP2-0612: 生成 AUTOTRACE 报告时出错
D
-
X
SP2-0612: 生成 AUTOTRACE 报告时出错
执行计划
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Bytes=2)
1 0 TABLE ACCESS (FULL) OF 'DUAL' (TABLE) (Cost=2 Card=1 Bytes
=2)
SP2-0612: 生成 AUTOTRACE STATISTICS 报告时出错
3.4.我们在sys窗口运行alter system kill session '161,267',看看发生什么情况
sys@OCP10G> alter system kill session '161,267';
系统已更改。
切到johnson窗口执行查询select * from dual;可以看到会话已经被终止了
johnson@OCP10G> select * from dual;
select * from dual
*
第 1 行出现错误:
ORA-00028: 您的会话己被终止
结论:
1.使用connect命令是创建一个连接,而不是创建一个session...
2.kill命令用组合键'sid,serial#'是有道理滴
下面显示一个连接中有0个会话的情况
1.查询v$session发现有个johnson连接,paddr和process可以唯一确定一个连接,记住johnson的连接的paddr是6ECF25E4
sys@OCP10G> select saddr,sid,serial#,paddr,user#,username,process,server,status from v$session where username is not null;
SADDR SID SERIAL# PADDR USER# USERNAME PROCESS SERVER STATUS
-------- ---------- ---------- -------- ---------- ------------------------------ ------------ --------- --------
6EDBCCEC 144 33 6ECF1864 0 SYS 2752:1860 DEDICATED ACTIVE
6EDBDEDC 145 190 6ECF25E4 58 JOHNSON 3964:3040 DEDICATED INACTIVE
2.切到johnson界面执行disconnect(或在sys里用kill session在到johnson里执行select * from dual)
johnson@OCP10G> disconnect;
从 Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options 断开
3.回到sys,查询v$session,发现在v$session里johnson的连接没了,这是因为session没了,即session数为0了,那么johnson的连接还在吗?
sys@OCP10G> select saddr,sid,serial#,paddr,user#,username,process,server,status from v$session where username is not null;
SADDR SID SERIAL# PADDR USER# USERNAME PROCESS SERVER STATUS
-------- ---------- ---------- -------- ---------- ------------------------------ ------------ --------- --------
6EDBCCEC 144 33 6ECF1864 0 SYS 2752:1860 DEDICATED ACTIVE
4.查询v$process,条件为addr='6ECF25E4'(第一步记住的paddr),发现其实这个连接还是存在的,即一个连接有0个session...
sys@OCP10G> select username,program from v$process where addr='6ECF25E4';
USERNAME PROGRAM
--------------- ----------------------------------------------------------------
SYSTEM ORACLE.EXE (SHAD)
注:这里就存在着session没了但连接还在的情况,还是占有一定的系统资源,所以kill session并不能kill掉连接
5.到johnson下执行quit(或exit),只有这样才能断开连接
johnson@OCP10G> quit
sys@OCP10G> select username,program from v$process where addr='6ECF25E4';
未选定行
在Oracle中,连接只是客户进程和数据库实例之间的一条特殊线路,最常见的就是网络连接。这条连接可能连接到一个专用服务器进程,也可能连接到调度器。如前所述,连接上可以有0个或多个会话,这说明可以有连接而无相应的会话。另外,一个会话可以有连接也可以没有连接。使用高级Oracle Net特性(如连接池)时,客户可以删除一条物理连接,而会话依然保留(但是会话会空闲)。客户在这个会话上执行某个操作时,它会重新建立物理连接。
下面事例显示一个连接有两个会话的情况...
1.查询v$session以显示会话信息
sys@OCP10G> select saddr,sid,serial#,paddr,user#,username,process,server,status from v$session where username=USER;
SADDR SID SERIAL# PADDR USER# USERNAME PROCESS SERVER STATUS
-------- ---------- ---------- -------- ---------- ------------------------------ ------------ --------- --------
6EDBCCEC 144 33 6ECF1864 0 SYS 2752:1860 DEDICATED ACTIVE
2.把autotrace设置为on,再次查询v$session
sys@OCP10G> set autotrace on
sys@OCP10G> select saddr,sid,serial#,paddr,user#,username,process,server,status from v$session where username=USER;
SADDR SID SERIAL# PADDR USER# USERNAME PROCESS SERVER STATUS
-------- ---------- ---------- -------- ---------- ------------------------------ ------------ --------- --------
6EDBCCEC 144 33 6ECF1864 0 SYS 2752:1860 DEDICATED ACTIVE
6EDC269C 149 147 6ECF1864 0 SYS 2752:1860 DEDICATED INACTIVE
可以看到本次连接有两个会话,一个是查询时候的会话(sid,serial#)为(144,33),另一个为autotrace的会话(sid,serial#)为(149,147)!
这两个session的saddr不同,paddr,process都相同,说明会话的os进程号与响应这两个会话的服务器进程的os进程号相同
这两个session的status一个为活动的,一个为不活动的
3.以kill session来做一点实验
3.1.我会打开另外一个sqlplus用johnson建立连接(注意:是连接!不是会话!呵呵),并让它拥有两个会话做kill session实验
查询v$session:
sys@OCP10G> select saddr,sid,serial#,paddr,user#,username,process,server,status from v$session where username is not null;
SADDR SID SERIAL# PADDR USER# USERNAME PROCESS SERVER STATUS
-------- ---------- ---------- -------- ---------- ------------------------------ ------------ --------- --------
6EDBCCEC 144 33 6ECF1864 0 SYS 2752:1860 DEDICATED ACTIVE
6EDCFDDC 161 267 6ECF25E4 58 JOHNSON 3232:2652 DEDICATED INACTIVE
3.2.在johnson窗口使用set autotrace on,回到sys窗口查询v$session
sys@OCP10G> select saddr,sid,serial#,paddr,user#,username,process,server,status from v$session where username is not null;
SADDR SID SERIAL# PADDR USER# USERNAME PROCESS SERVER STATUS
-------- ---------- ---------- -------- ---------- ------------------------------ ------------ --------- --------
6EDBCCEC 144 33 6ECF1864 0 SYS 2752:1860 DEDICATED ACTIVE
6EDC269C 149 159 6ECF25E4 58 JOHNSON 3232:2652 DEDICATED INACTIVE
6EDCFDDC 161 267 6ECF25E4 58 JOHNSON 3232:2652 DEDICATED INACTIVE
可以看到johnson的两个session都是inactive状态,因为我在操作sys窗口...呵呵
3.3.我们在sys窗口运行alter system kill session '149,159',看看发生什么情况
sys@OCP10G> alter system kill session '149,159';
系统已更改。
切到johnson窗口执行查询select * from dual;可以看到autotrace以及半残疾了,因为autotrace相关的session被kill了~为什么不是全残??
johnson@OCP10G> select * from dual;
搜集统计信息时出错 ORA-28
SP2-0612: 生成 AUTOTRACE 报告时出错
D
-
X
SP2-0612: 生成 AUTOTRACE 报告时出错
执行计划
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Bytes=2)
1 0 TABLE ACCESS (FULL) OF 'DUAL' (TABLE) (Cost=2 Card=1 Bytes
=2)
SP2-0612: 生成 AUTOTRACE STATISTICS 报告时出错
3.4.我们在sys窗口运行alter system kill session '161,267',看看发生什么情况
sys@OCP10G> alter system kill session '161,267';
系统已更改。
切到johnson窗口执行查询select * from dual;可以看到会话已经被终止了
johnson@OCP10G> select * from dual;
select * from dual
*
第 1 行出现错误:
ORA-00028: 您的会话己被终止
结论:
1.使用connect命令是创建一个连接,而不是创建一个session...
2.kill命令用组合键'sid,serial#'是有道理滴
下面显示一个连接中有0个会话的情况
1.查询v$session发现有个johnson连接,paddr和process可以唯一确定一个连接,记住johnson的连接的paddr是6ECF25E4
sys@OCP10G> select saddr,sid,serial#,paddr,user#,username,process,server,status from v$session where username is not null;
SADDR SID SERIAL# PADDR USER# USERNAME PROCESS SERVER STATUS
-------- ---------- ---------- -------- ---------- ------------------------------ ------------ --------- --------
6EDBCCEC 144 33 6ECF1864 0 SYS 2752:1860 DEDICATED ACTIVE
6EDBDEDC 145 190 6ECF25E4 58 JOHNSON 3964:3040 DEDICATED INACTIVE
2.切到johnson界面执行disconnect(或在sys里用kill session在到johnson里执行select * from dual)
johnson@OCP10G> disconnect;
从 Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options 断开
3.回到sys,查询v$session,发现在v$session里johnson的连接没了,这是因为session没了,即session数为0了,那么johnson的连接还在吗?
sys@OCP10G> select saddr,sid,serial#,paddr,user#,username,process,server,status from v$session where username is not null;
SADDR SID SERIAL# PADDR USER# USERNAME PROCESS SERVER STATUS
-------- ---------- ---------- -------- ---------- ------------------------------ ------------ --------- --------
6EDBCCEC 144 33 6ECF1864 0 SYS 2752:1860 DEDICATED ACTIVE
4.查询v$process,条件为addr='6ECF25E4'(第一步记住的paddr),发现其实这个连接还是存在的,即一个连接有0个session...
sys@OCP10G> select username,program from v$process where addr='6ECF25E4';
USERNAME PROGRAM
--------------- ----------------------------------------------------------------
SYSTEM ORACLE.EXE (SHAD)
注:这里就存在着session没了但连接还在的情况,还是占有一定的系统资源,所以kill session并不能kill掉连接
5.到johnson下执行quit(或exit),只有这样才能断开连接
johnson@OCP10G> quit
sys@OCP10G> select username,program from v$process where addr='6ECF25E4';
未选定行