zoukankan      html  css  js  c++  java
  • 有关Kill Session问题的讨论(旧文初发)

    今天在群里和MECKEY讨论KILL SESSIONS的问题,结果群里出先了两派,一是我和大家都同意先试着KILL SESSION然后再KILL SPID,二是MECKEY坚持说应该先KILL SPID,然后再KILL SESSION,并且还真找出了一个英文文档,说是从METALINK上下的,下面就是这段资料,虽然这段资料和MECKEY的说法不完全一样,但也有参考价值,共同参考:
    Solution Description:
    ====================

    As part of its responsibilities, PMON cleans up old process connections -
    connections where the parent process terminated abnormally, connections that
    have been unintentionally interrupted (as with network failures), and
    connections that Oracle has terminated due to an internal problem.  

    Remember, connection information is stored in the views V$SESSION and
    V$PROCESS.  As part of this cleanup, PMON willonly rollback a certain number
    of transactions for a given connection.  This number is determined by the
    CLEANUP_ROLLBACK_ENTRIES parameter in the INIT.ORA file.  For example, if a
    process goes rogue and generates, say, 1000 uncommitted updates to the
    database, it will rollback CLEANUP_ROLLBACK_ENTRIES transactions each time its
    periodic timer expires.  By default, this value is 20.  

    This means that it will rollback 20 updates each wake-up period.  At the rate
    of 20 each time, and a wake-up period of 60 seconds (at 3 seconds, it cleans
    up the connections latches and at 60 it cleans up the remaining stuff),  it
    could take PMON as long as 50 minutes to rollback all of the entries.  
    Meanwhile, all of the locks the remaining updates hold are still in effect,
    preventing other users from updating those rows.  

    Since PMON has other database maintenance responsibilities, it takes even
    longer to get through all 1000 of the updates.  So, to help PMON (not to
    mention yourself) get through the updates as quickly as possible, you can add
    this parameter to your INIT.ORA file.  As with anything, this must be handled
    carefully.  By allowing PMON to rollback more updates each time around its
    processing loop, it will take longer to get around to working on its other
    responsibilities - i.e. processing other users requests.  So, there is a
    performance consideration.

    How does this relate to killing a session?  If you were to kill a process
    (using alter system kill session) similar to theone in the above example,
    Oracle will keep the connection information around until ALL of the updates
    made through the connection have been cleaned up - i.e. until all outstanding
    transactions performed by the rogue process has been cleaned up.  This is done
    to maintain the relationship between the creator and the manipulated data (we
    don't want to rollback the wrong information).  If Oracle can cleanup a
    connection quicker, then the connection information can be removed from the
    V$SESSION and V$PROCESS tables sooner.

    PLEASE NOTE:
    ============

    If you must kill a session and want the connection information to go away
    (without bouncing your instance), the order of events is important.  Since
    Oracle has a mechanism for dead connection detection and connection cleanup,
    make this happen first - i.e. kill the users process first.  Then, wait for 3
    to 4 minutes beyond the dead connection detection value and query V$SESSION
    for the connection information.  

    If the information is still there,  query the V$LOCK table to see if the
    connection has any outstanding locks (PMON hasn't finished cleaning up the
    users information) with the following query: SELECT COUNT(*) FROM V$LOCK WHERE
    SID='sid', where 'sid' is the sid identified in V$SESSION for the connection.  
    This count will be WAY more than the number of actual updates (an insert
    generates two locks -one DML andone for the transaction).  

    The point is if this is a nonzero value, PMON hasn't finished rolling back the
    users updates.  If you perform this query again after a few minutes (PMON has
    had at least a couple of iterations to clean up the users data), you should
    see the count getting smaller.  If the value isn't getting smaller, the next
    step is to user ALTER SYSTEM KILL SESSION to delete the connection at the
    database level.  Perform the same steps again - query V$SESSION, then V$LOCK,
    and see if progress is being made in removing the connection information.  

    If the count from V$LOCK is zero and the users connection information has not
    gone away, then theonLY way this information will be removed is be taking the
    instance down.

    ANOTHER NOTE:

    If the session is first killed with ALTER SYSTEM KILL SESSION and the
    corresponding users process does not terminate normally, then the killed
    session will continue to appear in V$SESSION during the life of the instance.  
    The reason for this is that the session state object cannot be cleaned out
    until the associated user process clears the pointer to it.  Since the session
    abnormally aborted, this will not happen.
              
    Reference documentation:
    Oracle & Mysql & Postgresql & MSSQL 调优 & 优化
    ----------------------------------------------------------
    《高性能SQL调优精要与案例解析》
    blog1:http://www.cnblogs.com/lhdz_bj
    blog2:http://blog.itpub.net/8484829
    blog3:http://blog.csdn.net/tuning_optmization
  • 相关阅读:
    洛谷 P1074 靶形数独 Label:search 不会
    TYVJ P3522 &&洛谷 P1135 奇怪的电梯 Label:bfs
    洛谷 P1160 队列安排 Label:链表 数据结构
    uestc 1073 秋实大哥与线段树 Label:线段树
    TYVJ P3407 佳佳的魔法照片 Label:语文很重要 语文很重要 语文很重要
    TYVJ P1103 多项式输出 Label:模拟 有点儿坑
    A+B Problem 详细解答 (转载)
    如何批量修改文件名
    c++ 在windows下获取时间和计算时间差的几种方法总结
    SQL Server 2008在Windows 10上不支持
  • 原文地址:https://www.cnblogs.com/lhdz_bj/p/2056833.html
Copyright © 2011-2022 走看看