|
我这里的测试环境使用的是专用连接模式,共享模式略有不同,这个大家可以自己测试观察一下。
--记得在pub里曾经有人问到我们在登录db的时候,谁来负责校验用户名和密码?带着
这样一个疑问来看看oracle里的连接究竟是指什么...
--先来看一下目前oracle里session和process的对应关系,他们是1对1的
SQL> select s.sid,s.paddr,s.server,p.pid,p.spid,p.addr,p.program
2 from v$session s ,v$process p
3 where s.paddr(+)=p.addr
4 and p.pid<>1;
SID PADDR SERVER PID SPID ADDR PROGRAM
---- -------- --------- ---------- ----- -------- -------------------------
139 6CE5314C DEDICATED 33 5940 6CE5314C ORACLE.EXE (q001)
140 6CE51F7C DEDICATED 30 5024 6CE51F7C ORACLE.EXE (q000)
146 6CE4C66C DEDICATED 15 3640 6CE4C66C ORACLE.EXE (SHAD)
148 6CE5256C DEDICATED 31 492 6CE5256C ORACLE.EXE (SHAD)
149 6CE501CC DEDICATED 25 5332 6CE501CC ORACLE.EXE (QMNC)
151 6CE4EA0C DEDICATED 21 5816 6CE4EA0C ORACLE.EXE (ARC0)
153 6CE4EFFC DEDICATED 22 5820 6CE4EFFC ORACLE.EXE (ARC1)
159 6CE4BA8C DEDICATED 13 5612 6CE4BA8C ORACLE.EXE (MMNL)
160 6CE4B49C DEDICATED 12 5608 6CE4B49C ORACLE.EXE (MMON)
161 6CE4AEAC DEDICATED 11 5604 6CE4AEAC ORACLE.EXE (CJQ0)
162 6CE4A8BC DEDICATED 10 5552 6CE4A8BC ORACLE.EXE (RECO)
SID PADDR SERVER PID SPID ADDR PROGRAM
---- -------- --------- ---------- ----- -------- -------------------------
163 6CE4A2CC DEDICATED 9 5548 6CE4A2CC ORACLE.EXE (SMON)
164 6CE49CDC DEDICATED 8 5544 6CE49CDC ORACLE.EXE (CKPT)
165 6CE496EC DEDICATED 7 5540 6CE496EC ORACLE.EXE (LGWR)
166 6CE490FC DEDICATED 6 5536 6CE490FC ORACLE.EXE (DBW0)
167 6CE4793C DEDICATED 2 4648 6CE4793C ORACLE.EXE (SHAD)
168 6CE48B0C DEDICATED 5 5380 6CE48B0C ORACLE.EXE (MMAN)
169 6CE4851C DEDICATED 4 5376 6CE4851C ORACLE.EXE (PSP0)
170 6CE47F2C DEDICATED 3 5336 6CE47F2C ORACLE.EXE (PMON)
已选择19行。
--==============================
--这里我显示一下session 1的sid,paddr,process,为了和即将建立的session 2区分;
试验的过程中一共使用2个sqlplus窗口来登录db,其中session 1对应的sid是167,sqlplus进程的pid(这里是指windows里的进程概念),
从图1我们也能清楚的看到pid是5184,那么另一个sqlplus窗口对应的pid就是5084了(看图1)
看图的时候要注意,关键的地方我使用矩形框带了颜色进行了标注!
SQL> select sid,paddr,process from v$session where sid=(select sid from v$mystat
where rownum=1);
SID PADDR PROCESS
---- -------- ------------
167 6CE4793C 5184:5188
--===============================
--在pid=5084的这个sqlplus窗口里我们有意输入错误的口令
session 2:
C:\>sqlplus test/test1@test
SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 8月 18 10:58:56 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝
请输入用户名:
--================================
--在session 1里再次查看session和process的关系,发现此时db里多了1个server process,pid=16(这里的pid是指oracle里的pid)
SQL> select s.sid,s.paddr,s.server,p.pid,p.spid,p.addr,p.program
2 from v$session s ,v$process p
3 where s.paddr(+)=p.addr
4 and p.pid<>1;
SID PADDR SERVER PID SPID ADDR PROGRAM
---- -------- --------- ---------- ----- -------- -------------------------
139 6CE5314C DEDICATED 33 5940 6CE5314C ORACLE.EXE (q001)
140 6CE51F7C DEDICATED 30 5024 6CE51F7C ORACLE.EXE (q000)
146 6CE4C66C DEDICATED 15 6124 6CE4C66C ORACLE.EXE (SHAD)
147 6CE4C07C DEDICATED 14 3264 6CE4C07C ORACLE.EXE (J000)
148 6CE5256C DEDICATED 31 492 6CE5256C ORACLE.EXE (SHAD)
149 6CE501CC DEDICATED 25 5332 6CE501CC ORACLE.EXE (QMNC)
151 6CE4EA0C DEDICATED 21 5816 6CE4EA0C ORACLE.EXE (ARC0)
153 6CE4EFFC DEDICATED 22 5820 6CE4EFFC ORACLE.EXE (ARC1)
159 6CE4BA8C DEDICATED 13 5612 6CE4BA8C ORACLE.EXE (MMNL)
160 6CE4B49C DEDICATED 12 5608 6CE4B49C ORACLE.EXE (MMON)
161 6CE4AEAC DEDICATED 11 5604 6CE4AEAC ORACLE.EXE (CJQ0)
SID PADDR SERVER PID SPID ADDR PROGRAM
---- -------- --------- ---------- ----- -------- -------------------------
162 6CE4A8BC DEDICATED 10 5552 6CE4A8BC ORACLE.EXE (RECO)
163 6CE4A2CC DEDICATED 9 5548 6CE4A2CC ORACLE.EXE (SMON)
164 6CE49CDC DEDICATED 8 5544 6CE49CDC ORACLE.EXE (CKPT)
165 6CE496EC DEDICATED 7 5540 6CE496EC ORACLE.EXE (LGWR)
166 6CE490FC DEDICATED 6 5536 6CE490FC ORACLE.EXE (DBW0)
167 6CE4793C DEDICATED 2 4648 6CE4793C ORACLE.EXE (SHAD)
168 6CE48B0C DEDICATED 5 5380 6CE48B0C ORACLE.EXE (MMAN)
169 6CE4851C DEDICATED 4 5376 6CE4851C ORACLE.EXE (PSP0)
170 6CE47F2C DEDICATED 3 5336 6CE47F2C ORACLE.EXE (PMON)
16 3928 6CE4CC5C ORACLE.EXE (SHAD)
已选择21行。
--紧接着来看图2,图2是双击5084这个进程(windows概念)打开之后的TCP/IP TAB页,
从图中清晰的看到local address(client端,端口号:2450)和remote address(server端,端口号:1521),
在我的图里遗憾的是1521没有被显示出来,大家在测试的时候可以留意一下,紧接着state是:ESTABLISHED,
这个过程说明了什么?在oracle用户能够正常连上db之前,其实请求连接的client端进程和即将为连接成功
之后创建的session服务的server端进程早已事先建立了连接,事先建立连接的目的当然是为了验证用户名和密码
是否正确(这可能是其中的一个目的),这和我们在开发C/S模式时应用程序登录是何其的相似,我们在开发C/S
结构的应用的时候是不是也是这么做的?在应用程序登录应用系统之前是不是也的首先连上数据库,之后从数据库里
需要提取用户名和密码来进行校验(前提是你的应用程序用户名和密码是存放着db里...),讲到这里,oracle连接的
概念已经变的非常清晰了,在oracle里究竟什么是连接,其实就是client process和server process事先建立的连接通道,
这就是oracle的connection,目前我是这样理解的
--===================================
--在5084对应的sqlplus里我们始终没有再输入正确的用户名和密码,过了1分多种,oracle的pmon为了节约资源,自动释放了
进程16,查询结果如下,当然刚才建立的连接也就不存在了,如图3,state为:CLOSE_WAIT
SQL> /
SID PADDR SERVER PID SPID ADDR PROGRAM
---- -------- --------- ---------- ----- -------- -------------------------
139 6CE5314C DEDICATED 33 5940 6CE5314C ORACLE.EXE (q001)
140 6CE51F7C DEDICATED 30 5024 6CE51F7C ORACLE.EXE (q000)
146 6CE4C66C DEDICATED 15 6124 6CE4C66C ORACLE.EXE (SHAD)
147 6CE4C07C DEDICATED 14 6020 6CE4C07C ORACLE.EXE (J000)
148 6CE5256C DEDICATED 31 492 6CE5256C ORACLE.EXE (SHAD)
149 6CE501CC DEDICATED 25 5332 6CE501CC ORACLE.EXE (QMNC)
151 6CE4EA0C DEDICATED 21 5816 6CE4EA0C ORACLE.EXE (ARC0)
153 6CE4EFFC DEDICATED 22 5820 6CE4EFFC ORACLE.EXE (ARC1)
159 6CE4BA8C DEDICATED 13 5612 6CE4BA8C ORACLE.EXE (MMNL)
160 6CE4B49C DEDICATED 12 5608 6CE4B49C ORACLE.EXE (MMON)
161 6CE4AEAC DEDICATED 11 5604 6CE4AEAC ORACLE.EXE (CJQ0)
SID PADDR SERVER PID SPID ADDR PROGRAM
---- -------- --------- ---------- ----- -------- -------------------------
162 6CE4A8BC DEDICATED 10 5552 6CE4A8BC ORACLE.EXE (RECO)
163 6CE4A2CC DEDICATED 9 5548 6CE4A2CC ORACLE.EXE (SMON)
164 6CE49CDC DEDICATED 8 5544 6CE49CDC ORACLE.EXE (CKPT)
165 6CE496EC DEDICATED 7 5540 6CE496EC ORACLE.EXE (LGWR)
166 6CE490FC DEDICATED 6 5536 6CE490FC ORACLE.EXE (DBW0)
167 6CE4793C DEDICATED 2 4648 6CE4793C ORACLE.EXE (SHAD)
168 6CE48B0C DEDICATED 5 5380 6CE48B0C ORACLE.EXE (MMAN)
169 6CE4851C DEDICATED 4 5376 6CE4851C ORACLE.EXE (PSP0)
170 6CE47F2C DEDICATED 3 5336 6CE47F2C ORACLE.EXE (PMON)
已选择20行。
SQL>
--===================================
--由于这个连接建立的时间太短,所以我们不得不再次回到dos窗口下重新使用
sqlplus test/test1@test来再次登录,这时候发现oracle启动的进程pid还是16,这个纯属巧合,
也可能pid不是16
--============================
C:\>sqlplus test/test1@test
SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 8月 18 10:58:56 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝
请输入用户名:
--============================
SQL> /
SID PADDR SERVER PID SPID ADDR PROGRAM
---- -------- --------- ---------- ----- -------- -------------------------
139 6CE5314C DEDICATED 33 5940 6CE5314C ORACLE.EXE (q001)
140 6CE51F7C DEDICATED 30 5024 6CE51F7C ORACLE.EXE (q000)
141 6CE4C07C DEDICATED 14 4120 6CE4C07C ORACLE.EXE (J000)
146 6CE4C66C DEDICATED 15 6124 6CE4C66C ORACLE.EXE (SHAD)
148 6CE5256C DEDICATED 31 492 6CE5256C ORACLE.EXE (SHAD)
149 6CE501CC DEDICATED 25 5332 6CE501CC ORACLE.EXE (QMNC)
151 6CE4EA0C DEDICATED 21 5816 6CE4EA0C ORACLE.EXE (ARC0)
153 6CE4EFFC DEDICATED 22 5820 6CE4EFFC ORACLE.EXE (ARC1)
159 6CE4BA8C DEDICATED 13 5612 6CE4BA8C ORACLE.EXE (MMNL)
160 6CE4B49C DEDICATED 12 5608 6CE4B49C ORACLE.EXE (MMON)
161 6CE4AEAC DEDICATED 11 5604 6CE4AEAC ORACLE.EXE (CJQ0)
SID PADDR SERVER PID SPID ADDR PROGRAM
---- -------- --------- ---------- ----- -------- -------------------------
162 6CE4A8BC DEDICATED 10 5552 6CE4A8BC ORACLE.EXE (RECO)
163 6CE4A2CC DEDICATED 9 5548 6CE4A2CC ORACLE.EXE (SMON)
164 6CE49CDC DEDICATED 8 5544 6CE49CDC ORACLE.EXE (CKPT)
165 6CE496EC DEDICATED 7 5540 6CE496EC ORACLE.EXE (LGWR)
166 6CE490FC DEDICATED 6 5536 6CE490FC ORACLE.EXE (DBW0)
167 6CE4793C DEDICATED 2 4648 6CE4793C ORACLE.EXE (SHAD)
168 6CE48B0C DEDICATED 5 5380 6CE48B0C ORACLE.EXE (MMAN)
169 6CE4851C DEDICATED 4 5376 6CE4851C ORACLE.EXE (PSP0)
170 6CE47F2C DEDICATED 3 5336 6CE47F2C ORACLE.EXE (PMON)
16 2516 6CE4CC5C ORACLE.EXE (SHAD)
已选择21行。
--========================================
--测试又事先建立了连接,这回我把1521端口也显示了出来,如图4,
紧接着以最快的速度输入正确的用户名和密码(一定要在pmon释放16号进程之前)
--======================================
C:\>sqlplus test/test1@test
SQL*Plus: Release 10.2.0.1.0 - Production on 星期三 8月 18 11:36:31 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝
请输入用户名: test@test
输入口令:
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL>
--正确连接之后,session已经被成功创建,具体session和其对应的process之间的关系如下:
SQL> select sid,paddr,process from v$session where sid=(select sid from v$mystat
where rownum=1);
SID PADDR PROCESS
---------- -------- ------------
138 6CE4CC5C 2168:800
SQL> col program format a25
SQL> select pid,spid,program from v$process where addr='6CE4CC5C';
PID SPID PROGRAM
---------- ------------ -------------------------
16 5252 ORACLE.EXE (SHAD)
SQL>
--那么v$session里字段process的值:2168:800表示什么意思呢,稍微有经验的兄弟一看就知道
这是windows client端,没错,这里的2168是指sqlplus程序对应的进程id,是windows的概念
和oracle无关,从图5也能看到。800是指windows里的thread id,从图6可以清楚的看到,也就是说
正是windows下的这个800线程(unix中会对应具体的进程)和5252(unix中会对应具体的进程)线程在进行通信,为session 138在服务。
--======================================
SQL> /
SID PADDR SERVER PID SPID ADDR PROGRAM
---- -------- --------- ---------- ----- -------- -------------------------
138 6CE4CC5C DEDICATED 16 5252 6CE4CC5C ORACLE.EXE (SHAD)
139 6CE5314C DEDICATED 33 5940 6CE5314C ORACLE.EXE (q001)
140 6CE51F7C DEDICATED 30 5024 6CE51F7C ORACLE.EXE (q000)
141 6CE4C07C DEDICATED 14 4120 6CE4C07C ORACLE.EXE (J000)
146 6CE4C66C DEDICATED 15 6124 6CE4C66C ORACLE.EXE (SHAD)
148 6CE5256C DEDICATED 31 492 6CE5256C ORACLE.EXE (SHAD)
149 6CE501CC DEDICATED 25 5332 6CE501CC ORACLE.EXE (QMNC)
151 6CE4EA0C DEDICATED 21 5816 6CE4EA0C ORACLE.EXE (ARC0)
153 6CE4EFFC DEDICATED 22 5820 6CE4EFFC ORACLE.EXE (ARC1)
159 6CE4BA8C DEDICATED 13 5612 6CE4BA8C ORACLE.EXE (MMNL)
160 6CE4B49C DEDICATED 12 5608 6CE4B49C ORACLE.EXE (MMON)
SID PADDR SERVER PID SPID ADDR PROGRAM
---- -------- --------- ---------- ----- -------- -------------------------
161 6CE4AEAC DEDICATED 11 5604 6CE4AEAC ORACLE.EXE (CJQ0)
162 6CE4A8BC DEDICATED 10 5552 6CE4A8BC ORACLE.EXE (RECO)
163 6CE4A2CC DEDICATED 9 5548 6CE4A2CC ORACLE.EXE (SMON)
164 6CE49CDC DEDICATED 8 5544 6CE49CDC ORACLE.EXE (CKPT)
165 6CE496EC DEDICATED 7 5540 6CE496EC ORACLE.EXE (LGWR)
166 6CE490FC DEDICATED 6 5536 6CE490FC ORACLE.EXE (DBW0)
167 6CE4793C DEDICATED 2 4648 6CE4793C ORACLE.EXE (SHAD)
168 6CE48B0C DEDICATED 5 5380 6CE48B0C ORACLE.EXE (MMAN)
169 6CE4851C DEDICATED 4 5376 6CE4851C ORACLE.EXE (PSP0)
170 6CE47F2C DEDICATED 3 5336 6CE47F2C ORACLE.EXE (PMON)
已选择21行。
SQL>
--============================
--session 建立之后我们也发现一个奇怪的现象,在连接建立之后session
创建之前,16号进程对应的地址是6CE4CC5C,spid是2516;但是真真创建session之后
16号进程的地址是6CE4CC5C,spid是5252,这个不知道为什么,也是我的疑问...
--===========================
至此,我把我对oracle里连接的概念介绍了一下,至于session和process其实还是比较
好理解的,他们之间的关系在理解了连接之后也变得非常好理解了,具体大家可以看看tom
的力作,几年前看tom的力作对这几个概念解释的时候我对connection的概念始终理解不好...
[ 本帖最后由 warehouse 于 2010-10-20 21:52 编辑 ] |
-
1.JPG
(136.18 KB, 下载次数: 59)
-
2.JPG
(137.92 KB, 下载次数: 60)
-
3.JPG
(134.61 KB, 下载次数: 59)
-
4.JPG
(133.34 KB, 下载次数: 53)
-
5.JPG
(133.89 KB, 下载次数: 56)
-
6.JPG
(138.45 KB, 下载次数: 58)
|