• http://www.78888881.com
  • ITPUB论坛-中国最专业的IT技术社区

     找回密码
     注册
    查看: 872|回复: 6

    [讨论] 当一个会话执行了disconnect命令后,“与之相连”的那个专用服务会不会被销毁?

    [复制链接]
    论坛徽章:
    4
    ITPUB新首页上线纪念徽章
日期:2018-06-19 08:38:442013年新春福章
日期:2018-06-19 14:51:24优秀写手
日期:2018-06-19 09:29:08秀才
日期:2018-06-19 10:17:19
    跳转到指定楼层
    1#
    发表于 2018-06-19 13:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 liklstar 于 2018-06-19 13:50 编辑

    假设有一个连接到dedicate server的session。现在这个session执行了disconnect命令,自然这个会话就断开了。

    请问:当一个会话执行了disconnect命令后,“与之相连”的那个dedicate server会不会被销毁?换句话说,当一个来自TCP/IP的操作系统连接请求到来后,建立的这个dedicate server是这个“连接”(传输层)的一部分,而不是会话层的一部分,对吗?
    论坛徽章:
    486
    秀才
日期:2018-06-19 10:33:01秀才
日期:2018-06-19 10:03:12秀才
日期:2018-06-19 10:03:12秀才
日期:2018-06-19 10:03:12状元
日期:2018-06-19 10:04:09举人
日期:2018-06-19 10:04:09秀才
日期:2018-06-19 14:10:21秀才
日期:2018-06-19 14:10:21秀才
日期:2018-06-19 14:10:21秀才
日期:2018-06-19 14:10:21
    2#
    发表于 2018-1-2 05:43 | 只看该作者
    会被销毁。
    论坛徽章:
    182
    红宝石
日期:2018-06-19 08:24:37萤石
日期:2018-06-19 10:25:392015年新春福章
日期:2018-06-19 15:11:03马上有对象
日期:2018-06-19 10:28:08马上有钱
日期:2018-06-19 09:26:57马上有房
日期:2018-06-19 08:46:05马上有钱
日期:2018-06-19 09:33:24马上有钱
日期:2018-06-19 15:17:08马上有对象
日期:2018-06-19 17:33:15沸羊羊
日期:2018-06-19 09:07:41
    3#
    发表于 2018-1-4 08:36 | 只看该作者
    SCOTT@78> @ &r/spid
           SID    SERIAL# PROCESS                  SERVER    SPID       PID  P_SERIAL# C50
    ---------- ---------- ------------------------ --------- ------ ------- ---------- --------------------------------------------------
           274          5 460:3272                 DEDICATED 28499       21          3 alter system kill session '274,5' immediate;

    $ ps -f  -p 28499
    UID        PID  PPID  C STIME TTY          TIME CMD
    oracle   28499     1  0 08:34 ?        00:00:00 oraclebook (LOCAL=NO)


    SCOTT@78> disconnect
    Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options

    $ ps -f  -p 28499
    UID        PID  PPID  C STIME TTY          TIME CMD
    oracle   28499     1  0 08:34 ?        00:00:00 oraclebook (LOCAL=NO)

    --//进程没有取消.
    论坛徽章:
    182
    红宝石
日期:2018-06-19 08:24:37萤石
日期:2018-06-19 10:25:392015年新春福章
日期:2018-06-19 15:11:03马上有对象
日期:2018-06-19 10:28:08马上有钱
日期:2018-06-19 09:26:57马上有房
日期:2018-06-19 08:46:05马上有钱
日期:2018-06-19 09:33:24马上有钱
日期:2018-06-19 15:17:08马上有对象
日期:2018-06-19 17:33:15沸羊羊
日期:2018-06-19 09:07:41
    4#
    发表于 2018-1-4 08:38 | 只看该作者
    # lsof -P -i | grep 28499
    oracle    28499  oracle   15u  IPv4 40262043      0t0  TCP zzzzz.com:1521->192.168.XXXX.YYYY:51995 (ESTABLISHED)
    论坛徽章:
    182
    红宝石
日期:2018-06-19 08:24:37萤石
日期:2018-06-19 10:25:392015年新春福章
日期:2018-06-19 15:11:03马上有对象
日期:2018-06-19 10:28:08马上有钱
日期:2018-06-19 09:26:57马上有房
日期:2018-06-19 08:46:05马上有钱
日期:2018-06-19 09:33:24马上有钱
日期:2018-06-19 15:17:08马上有对象
日期:2018-06-19 17:33:15沸羊羊
日期:2018-06-19 09:07:41
    5#
    发表于 2018-1-4 08:53 | 只看该作者
    这个问题实际上是连接与会话的问题.
    论坛徽章:
    182
    红宝石
日期:2018-06-19 08:24:37萤石
日期:2018-06-19 10:25:392015年新春福章
日期:2018-06-19 15:11:03马上有对象
日期:2018-06-19 10:28:08马上有钱
日期:2018-06-19 09:26:57马上有房
日期:2018-06-19 08:46:05马上有钱
日期:2018-06-19 09:33:24马上有钱
日期:2018-06-19 15:17:08马上有对象
日期:2018-06-19 17:33:15沸羊羊
日期:2018-06-19 09:07:41
    6#
    发表于 2018-1-4 08:59 | 只看该作者
    在一条连接上可以建立0 个、一个或多个会话。各个会话是单独而且独立的,即使它们共享同一条数据库物理连接也是如此。一个会话中
    的提交不会影响该连接上的任何其他会话。实际上,一条连接上的各个会话可以使用不同的用户身份。

    在Oracle 中,连接只是客户进程和数据库实例之间的一条特殊线路,最常见的就是网络连接。这条连接可能连接到一个专用服务器进程
    ,也可能连接到调度器。如前所述,连接上可以有0 个或多个会话,这说明可以有连接而无相应的会话。另外,一个会话可以有连接也可
    以没有连接。使用高级Oracle Net 特性(如连接池)时,客户可以删除一条物理连接,而会话依然保留(但是会话会空闲)。客户在这个会
    话上执行某个操作时,它会重新建立物理连接。

    连接(connection):连接是从客户到Oracle 实例的一条物理路径。连接可以在网络上建立,或者通过IPC 机制建立。通常会在客户进程
    与一个专用服务器或一个调度器之间建立连接。不过,如果使用Oracle 的连接管理器(Connection Manager ,CMAN),还可以在客户和
    CMAN之间以及CMAN 和数据库之间建立连接。

    会话(session):会话是实例中存在的一个逻辑实体。这就是你的会话状态(session state),也就是表示特定会话的一组内存中的数据结
    构。提到"数据库连接"时,大多数人首先想到的就是"会话"。你要在服务器中的会话上执行SQL、提交事务和运行存储过程。可以使用
    SQL*Plus 来看一看实际的连接和会话是什么样子,从中还可以了解到,实际上一条连接有多个会话的情况相当常见。

    这里使用了AUTOTRACE 命令,并发现有两个会话。我们在一条连接上使用一个进程创建了两个会话。以下是其中的第一个会话:

    1.环境:
    SCOTT@book> @ &r/ver1
    PORT_STRING                    VERSION        BANNER
    ------------------------------ -------------- --------------------------------------------------------------------------------
    x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

    SCOTT@book> @ &r/spid
           SID    SERIAL# SPID       PID  P_SERIAL# C50
    ---------- ---------- ------ ------- ---------- --------------------------------------------------
           232         11 47940       21          6 alter system kill session '232,11' immediate;

    SCOTT@book> select username, sid, serial#, server,paddr, status from v$session where username='SCOTT';
    USERNAME                    SID    SERIAL# SERVER    PADDR            STATUS
    -------------------- ---------- ---------- --------- ---------------- --------
    SCOTT                       232         11 DEDICATED 00000000854F1758 ACTIVE

    SCOTT@book> set autotrace on statistics

    SCOTT@book> select username, sid, serial#, server,paddr, status from v$session where username='SCOTT';
    USERNAME                    SID    SERIAL# SERVER    PADDR            STATUS
    -------------------- ---------- ---------- --------- ---------------- --------
    SCOTT                       232         11 DEDICATED 00000000854F1758 ACTIVE
    SCOTT                       233        117 DEDICATED 00000000854F1758 INACTIVE

    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
              0  consistent gets
              0  physical reads
              0  redo size
            992  bytes sent via SQL*Net to client
            520  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              2  rows processed


    此时有了两个会话,但是这两个会话都使用同一个专用服务器进程,从它们都有同样的PADDR 值就能看出这一点。从操作系统也可以得到
    确认,因为没有创建新的进程,对这两个会话只使用了一个进程(一条连接)。

    需要注意,其中一个会话(原来的会话)是ACTIVE(活动的)。这是有道理的: 它正在运行查询来显示这个信息,所以它当然是活动的。但
    是那个INACTIVE(不活动的)会话呢?那个会话要做什么?这就是AUTOTRACE 会话,它的任务是"监视"我们的实际会话,并报告它做了什么


    在SQL*Plus 中启用(打开)AUTOTRACE 时,如果我们执行DML 操作(INSERT、UPDATE、DELETE、SELECT和MERGE),SQL*Plus 会完成以下动作:

    (1)如果还不存在辅助会话[1],它会使用当前连接创建一个新会话。
    (2)要求这个新会话查询V$SESSTAT视图来记住实际会话(即运行DML的会话)的初始统计值。
    (3)在原会话中运行DML 操作。
    (4)DML 语句执行结束后,SQL*Plus会请求另外那个会话(即"监视"会话)再次查询V$SESSTAT,并生成前面所示的报告,显示出原会话(执
    行DML 的会话)的统计结果之差。

    如果关闭AUTOTRACE,SQL*Plus 会终止这个额外的会话,在V$SESSION 中将无法看到这个会话。你可能会问:"SQL*Plus 为什么要这样做
    ,为什么要另建一个额外的会话?"。原因是:如果使用同一个会话来监视内存使用,那执行监视本身也要使用内存。

    如果在同一个会话中观察统计结果,就会对统计结果造成影响(导致对统计结果的修改)。倘若SQL*Plus使用一个会话来报告所执行的I/O
    次数,网络上传输了多少字节,以及执行了多少次排序,那么查看这些详细信息的查询本身也会影响统计结果。这些查询可能自己也要排
    序、执行I/O 以及在网络上传输数据等(一般来说都会如此!)。因此,我们需要使用另一个会话来正确地测量。

    到目前为止,我们已经看到一条连接可以有一个或两个会话。现在,我们想使用SQL*Plus 来查看一条没有任何会话的连接。这很容易。
    在上例所用的同一个SQL*Plus 窗口中,只需键入一个"很容易误解"的命令即DISCONNECT:

    SCOTT@book> set autotrace off
    SCOTT@book> select username, sid, serial#, server,paddr, status from v$session where username='SCOTT';
    USERNAME                    SID    SERIAL# SERVER    PADDR            STATUS
    -------------------- ---------- ---------- --------- ---------------- --------
    SCOTT                       232         11 DEDICATED 00000000854F1758 ACTIVE

    SCOTT@book> disconnect
    Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options

    从技术上讲,这个命令应该叫DESTROY_ALL_SESSIONS 更合适,而不是DISCONNECT,因为我们并没有真正物理地断开连接。

    注意在SQL*Plus 中要真正地断开连接,应该执行"exit"命令,因为你必须退出才能完全撤销连接。不过,我们已经关闭了所有会话。

    使用另一个用户账户打开另一个会话,并查询原用户SCOTT。
    SYS@book> select username, sid, serial#, server,paddr, status from v$session where username='SCOTT';
    no rows selected

    可以看到,这个账户名下没有会话,但是仍有一个进程,相应地有一条物理连接(使用前面的ADDR值):

    SYS@book> column TRACEID noprint
    SYS@book> column TRACEFILE noprint
    SYS@book> select * from v$process where addr = hextoraw('00000000854F1758');
    ADDR                 PID SPID   PNAME  USERNAME                SERIAL# TERMINAL     PROGRAM                    B LATCHWAIT        LATCHSPIN        PGA_USED_MEM PGA_ALLOC_MEM PGA_FREEABLE_MEM PGA_MAX_MEM
    ---------------- ------- ------ ------ -------------------- ---------- ------------ -------------------------- - ---------------- ---------------- ------------ ------------- ---------------- -----------
    00000000854F1758      21 47940         oracle                        6 UNKNOWN      oracle@gxqyydg4(TNS V1-V3)                                          6232670       9954798          1048576    11331054

    所以,这就有了一条没有相关会话的"连接"。可以使用SQL*Plus 的CONNECT 命令(这个命令的名字也起得不恰当),在这个现有的进程中
    创建一个新会话(CONNECT命令叫CREATE_SESSION更合适):

    SCOTT@book> connect scott/book
    Connected.
    SCOTT@book> @ &r/spid
           SID    SERIAL# SPID       PID  P_SERIAL# C50
    ---------- ---------- ------ ------- ---------- --------------------------------------------------
           232         13 47974       21          7 alter system kill session '232,13' immediate;

    SCOTT@book> select username, sid, serial#, server,paddr, status from v$session where username='SCOTT';
    USERNAME                    SID    SERIAL# SERVER    PADDR            STATUS
    -------------------- ---------- ---------- --------- ---------------- --------
    SCOTT                       232         13 DEDICATED 00000000854F1758 ACTIVE

    可以注意到,PADDR 还是一样的,所以我们还是在使用同一条物理连接,但是(可能)有一个不同的SID。我说"可能有",是因为也许还会
    分配同样的SID,这取决于在我们注销时是否有别人登录,以及我们原来的SID 是否可用。

    到此为止,这些测试都是用一条专用服务器连接执行的,所以PADDR 正是专用服务器进程的进程地址。

    --注意进程号SPID,SERIAL#都发生了变化。

    --理解这些基本概念很重要。这样就非常好理解连接与会话。
    论坛徽章:
    0
    7#
    发表于 2018-1-5 09:18 | 只看该作者
    当一个会话执行了disconnect, 数据库认为会话信息不存在,服务进程自然要销毁。
    但是连接还是存在的,因为是disconnect是对数据库而言的disconnect。

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    -海子街镇论坛,海子街镇社区 - bbs-tbh.bwp888.com
    DTCC2018购票6.8折优惠进行时

    中国数据库技术大会是国内数据库及大数据领域规模最大、最受欢迎的技术交流盛会。 2018年5月10-12日,第九届中国数据库技术大会将如约而至。本届大会以“数领先机•智赢未来”为主题,设定2大主会场及20个技术专场,邀请来自国内外互联网、金融、教育等行业百余位技术专家,共同探讨Oracle、MySQL、NoSQL、大数据等领域的前瞻性热点话题与技术。
    ----------------------------------------
    优惠时间:2018-06-19前

    报名链接>>
    城隍庙论坛 南城区街道论坛 松山市政公园论坛 浔阳论坛 彭阳县论坛
    石桥铺论坛 三府湾论坛 耒阳市论坛 彭山县论坛 寒亭区论坛
    电子杂志 虎吧 老博客 读书频道 积分竞拍 文本模式 帮助
      IT博客
      ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
    CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
    京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
      
    快速回复 返回顶部 返回列表
    横口论坛 鲅鱼圈区论坛 万宁市论坛 红山区论坛 润州区论坛
    吉安论坛 鄂城区论坛 淮南市论坛 惠阳区论坛 芦淞区论坛