设为首页 收藏本站
查看: 750|回复: 0

[经验分享] oracle技术之进程、会话、连接之间的差异

[复制链接]

尚未签到

发表于 2018-9-14 09:33:53 | 显示全部楼层 |阅读模式
  --========================
  -- 进程、会话、连接之间的差异
  --========================
  在使用Oracle database的时候,连接与会话是我们经常碰到的词语之一。咋一看貌似一回事,事实则不然。一个连接上可以建立零个、
  一个、甚至多个会话。啊,咋这样呢?是的,没错。这也是我们经常误解的原因。
  各个会话之间是单独的,独立于其他会话,即便是同一个连接的多个会话也是如此。
  一、几个术语之间的定义(参照Oracle 9i &10g 编程艺术)
  连接(connection):连接是从客户到Oracle 实例的一条物理路径。连接可以在网络上建立,或者通过IPC 机制建立。通常会在
  客户进程与一个专用服务器或一个调度器之间建立连接。
  会话(session):会话是实例中存在的一个逻辑实体。这就是你的会话状态(session state),也就是表示特定会话的一组内存
  中的数据结构.提到"数据库连接"时,大多数人首先想到的就是“会话”。你要在服务器中的会话上执行SQL、提交事务和运行存储过程。
  二、通过例子演示来查看之间的关系
  1. 无连接,无会话,无进程的情形
  [-->没有建立建立连接时,没有任何会话服务器进程
  [oracle@odbp ~]$ ps -ef | grep oracleorcl
  oracle    5685  5446  0 19:30 pts/1    00:00:00 grep oracleorcl
  [oracle@odbp ~]$ sqlplus /nolog

  SQL*Plus:>  Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
  idle> ho ps -ef | grep oracleorcl    -->使用nolog登录是同样也看不到任何会话服务器进程
  oracle    5691  5686  0 19:31 pts/0    00:00:00 /bin/bash -c ps -ef | grep oracleorcl
  2. 单个连接,单个会话,单个进程
  -->使用scott身份登录,有一个对应的服务器进程被产生
  idle> conn scott/tiger
  Connected.
  scott@ORCL> select sid,serial#,username from v$session where username is not null;
  SID    SERIAL# USERNAME
  ---------- ---------- -------------------------
  159          5 SCOTT
  scott@SQL> ho ps -ef | grep oracleorcl
  oracle    5696  5686  0 19:32 ?        00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
  oracle    5699  5686  0 19:32 pts/0    00:00:00 /bin/bash -c ps -ef | grep oracleorcl
  3. 无连接,无会话,单个进程
  -->使用disconnect断开会话,但对应的服务器进程并没有撤销,直到使用exit则对应的服务器进程被释放
  scott@SQL> disconnect

  Disconnected from Oracle Database 10g Enterprise Edition>  With the Partitioning, OLAP, Data Mining and Real Application Testing options
  -->此时开启另外一个会话session2来查看scott的会话是否还存在,从下面的查询中已经不存在scott用户的会话
  sys@ORCL> select sid,serial#,username from v$session where username='SCOTT';
  no rows selected
  scott@SQL> ho ps -ef | grep 5696  -->对应的后台进程依然存在
  oracle    5696  5686  0 19:32 ?        00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
  oracle    5702  5686  0 19:32 pts/0    00:00:00 /bin/bash -c ps -ef | grep 5696
  scott@ORCL> exit

  Disconnected from Oracle Database 10g Enterprise Edition>  With the Partitioning, OLAP, Data Mining and Real Application Testing options
  [oracle@odbp admin]$ ps -ef | grep 5696  -->exit命令退出后则相应的进程5696被释放
  oracle    4082 16943  0 19:45 pts/0    00:00:00 grep 5696
  4. 单个连接,多个会话,单个进程
  -->从视图中观察对应的session与后台进程
  -->在session1中使用scott登录
  idle> conn scott/tiger;
  Connected.
  -->在session2 中使用sys帐户登录
  sys@ORCL> select sid,serial#,username from v$session where username is not null;
  SID    SERIAL# USERNAME
  ---------- ---------- ------------------------------
  141          4 SYS
  159          5 SCOTT
  -->在session1中开启autotrace功能
  scott@ORCL> set autotrace on
  -->可以看到在session2的v$session视图查询时多出了一个账户为scott,但SID与SERIAL#与之前不同的记录
  sys@ORCL> set linesize 160
  sys@ORCL> SELECT spid, s.sid, s.serial#,s.status,s.username, p.program
  2  FROM v$process p, v$session s
  3  WHERE p.addr = s.paddr
  4  and s.username='SCOTT';
  SPID                SID    SERIAL# STATUS   USERNAME                  PROGRAM
  ------------ ---------- ---------- -------- ------------------------- --------------------------------------
  4602                159          5 INACTIVE SCOTT                     oracle@oradb.robinson.com (TNS V1-V3)
  4602                139         25 INACTIVE SCOTT                     oracle@oradb.robinson.com (TNS V1-V3)
  sys@ORCL> ho ps -ef | grep 4602
  oracle    4602  4499  0 18:36 ?        00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
  oracle    4856  4655  0 18:47 pts/3    00:00:00 /bin/bash -c ps -ef | grep 4602
  sys@ORCL> ho ps -ef | grep oracleorcl
  oracle    4602  4499  0 18:36 ?        00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
  oracle    4656  4655  0 18:36 ?        00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
  oracle    4859  4655  0 18:47 pts/3    00:00:00 /bin/bash -c ps -ef | grep oracleorcl
  -->从上面的查询结果可以看出,SCOTT用户对应的后台进程仅有一个,其spid为4062
  set autotrace 完成的动作
  当启用set autotrace功能后,通常会创建一个新的会话用于监控当前的操作并返回统计信息,下面描述其过程
  a.在session1执行一个查询,则此时原来创建的会话(159,5)执行DML或DQL操作
  b.新创建的会话(139,25)会话则开始查询V$SESSTAT 视图来记住实际会话(即运行DML 的会话)的初始统计值
  c.原会话(139,25)中得DML或DQL操作执行
  d.新会话(139,25)将再次查询V$SESSTAT 视图,根据与上次的差值计算统计信息并生成执行时的执行计划以及统计信息予以返回
  有关启用set autotrace 请参考:启用 AUTOTRACE 功能
  -->下面演示在session1中的查询
  scott@ORCL> select count(1) from emp;
  COUNT(1)
  ----------
  14
  Execution Plan
  ----------------------------------------------------------
  Plan hash value: 2937609675
  -------------------------------------------------------------------

  |>  -------------------------------------------------------------------
  |   0 | SELECT STATEMENT |        |     1 |     1   (0)| 00:00:01 |
  |   1 |  SORT AGGREGATE  |        |     1 |            |          |
  |   2 |   INDEX FULL SCAN| PK_EMP |    14 |     1   (0)| 00:00:01 |
  -------------------------------------------------------------------
  Statistics
  ----------------------------------------------------------
  296  recursive calls
  0  db block gets
  54  consistent gets
  1  physical reads  &n,bsp;

  0  redo>  411  bytes sent via SQL*Net to client
  385  bytes received via SQL*Net from client
  2  SQL*Net roundtrips to/from client
  6  sorts (memory)
  0  sorts (disk)
  1  rows processed
  scott@ORCL> set autotrace off;
  -->在session2中再次执行查询,可以看到会话139,25已经被释放
  sys@ORCL> /
  SPID                SID    SERIAL# STATUS   USERNAME                  PROGRAM
  ------------ ---------- ---------- -------- ------------------------- --------------------------------------
  4602                159          5 INACTIVE SCOTT                     oracle@oradb.robinson.com (TNS V1-V3)
  5.SID不变,serial#变化的情形
  -->将所有的会话全部退出,下面来查看SID不变而serial#变化的情形
  [oracle@oradb ~]$ ps -ef | grep oracleorcl    -->此时Oracle数据库无任何服务器进程
  oracle   26767 16943  0 19:49 pts/0    00:00:00 grep oracleorcl
  [oracle@oradb ~]$ sqlplus scott/tiger@orcl
  Connected to:

  Oracle Database 10g Enterprise Edition>  With the Partitioning, OLAP and Data Mining options
  scott@ORCL> select sid,serial#,username from v$session where username='SCOTT';
  SID    SERIAL# USERNAME
  ---------- ---------- ------------------------------
  134         39 SCOTT
  scott@ORCL> exit

  Disconnected from Oracle Database 10g Enterprise Edition>  With the Partitioning, OLAP and Data Mining options
  [uniread] Saved history (652 lines)
  [oracle@oradb ~]$ sqlplus scott/tiger@orcl
  Connected to:

  Oracle Database 10g Enterprise Edition>  With the Partitioning, OLAP and Data Mining options
  scott@ORCL> select sid,serial#,username from v$session where username='SCOTT';
  SID    SERIAL# USERNAME
  ---------- ---------- ------------------------------
  134         41 SCOTT
  -->从上面的情形可以看出尽管scott用户退出后重新登录,依然使用了相同的SID,因此在执行kill session时,一定要注意SID,serial#
  -->两者的值,以免kill掉不该kill的session
  三、session与process的设置关系
  session:指定了一个实例中允许的会话数,即能同时登录到数据库的并发用户数。
  process: 指定了一个实例在操作系统级别能同时运行的进程数,包括后台进程与服务器进程。
  由上面的分析可知,一个后台进程可能同时对应对个会话,因此通常sessions的值是大于processes的值
  通常的设置公式
  sessions = 1.1 * processes + 5
  -->如在下面的系统的设置中processes得值为150,session的值设定为170,
  scott@ORCL> select name,value from v$parameter where name='processes';
  NAME                 VALUE
  -------------------- --------------------
  processes            150
  scott@ORCL> select name,value from v$parameter where name='sessions';
  NAME                 VALUE
  -------------------- --------------------
  sessions             170
  scott@ORCL> select 150*1.1+5 from dual;
  150*1.1+5
  ----------
  170
  oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-581977-1-1.html 上篇帖子: Oracle ROWID-Oracle之路 下篇帖子: Oracle RAC failover测试
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表