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

[经验分享] Oracle 彻底 kill session-Oracle之路

[复制链接]

尚未签到

发表于 2018-9-14 09:00:55 | 显示全部楼层 |阅读模式
  kill session 是DBA经常碰到的事情之一。如果kill 掉了不该kill 的session,则具有破坏性,因此尽可能的避免这样的错误发生。同时也应当注意,
  如果kill 的session属于Oracle 后台进程,则容易导致数据库实例宕机。
  通常情况下,并不需要从操作系统级别杀掉Oracle会话进程,但并非总是如此,下面的描述中给出了在Oracle级别杀掉会话以及操作系统级别杀掉进程。
  一、获得需要kill session的信息(使用V$SESSION 和 GV$SESSION视图)
  SET LINESIZE 180
  COLUMN spid FORMAT A10
  COLUMN username FORMAT A10
  COLUMN program FORMAT A40
  SELECT s.inst_id,
  s.sid,
  s.serial#,
  p.spid,
  s.username,
  s.program,
  s.paddr,
  s.STATUS
  FROM   gv$session s
  JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
  WHERE  s.type != 'BACKGROUND';
  INST_ID        SID    SERIAL# SPID       USERNAME   PROGRAM                                       PADDR    STATUS
  ---------- ---------- ---------- ---------- ---------- --------------------------------------------- -------- --------
  1        146         23 27573      TEST       sqlplus@oracle10g (TNS V1-V3)                 4C621950 INACTIVE
  1        160         17 27610      SYS        sqlplus@oracle10g (TNS V1-V3)                 4C624174 ACTIVE
  1        144         42 27641      SCOTT      sqlplus@oracle10g (TNS V1-V3)                 4C624730 INACTIVE
  二、使用ALTER SYSTEM KILL SESSION 命令实现
  语法:

  SQL>>
  SQL>>  对于RAC环境下的kill session ,需要搞清楚需要kill 的session 位于哪个节点,可以查询GV$SESSION视图获得。
  kill session 的时候仅仅是将会话杀掉。在有些时候,由于较大的事务或需要运行较长的SQL语句将导致需要kill的session并不能立即杀掉。对于这种情
  况将收到 "marked for kill"提示(如下),一旦会话当前事务或操作完成,该会话被立即杀掉。
  alter system kill session '4730,39171'
  *
  ERROR at line 1:
  ORA-00031: session marked for kill
  在下面的操作中将杀掉会话146,144

  sys@AUSTIN>>
  System>
  sys@AUSTIN>>
  System>  sys@AUSTIN> select inst_id,saddr,sid,serial#,paddr,username,status,program from gv$session where username is not null;
  INST_ID SADDR           SID    SERIAL# PADDR    USERNAME   STATUS   PROGRAM
  ---------- -------- ---------- ---------- -------- ---------- -------- ---------------------------------------------
  1 4C70BF04        144         42 4C6545A0 SCOTT      KILLED   sqlplus@oracle10g (TNS V1-V3)
  1 4C70E6B4        146         23 4C6545A0 TEST       KILLED   sqlplus@oracle10g (TNS V1-V3)
  1 4C71FC84        160         17 4C624174 SYS        ACTIVE   sqlplus@oracle10g (TNS V1-V3)
  注意:在查询中可以看到被杀掉的会话的PADDR地址发生了变化,参照查询结果中的红色字体。如果多个session被kill 掉,则多个session的PADDR
  被改为相同的进程地址。
  通过下面的语句来找回被kill 掉的ADDR先前的地址
  SELECT s.username,s.status,
  x.ADDR,x.KSLLAPSC,x.KSLLAPSN,x.KSLLASPO,x.KSLLID1R,x.KSLLRTYP,
  decode(bitand (x.ksuprflg,2),0,null,1)
  FROM x$ksupr x,v$session s
  WHERE s.paddr(+)=x.addr
  and bitand(ksspaflg,1)!=0;
  USERNAME   STATUS   ADDR       KSLLAPSC   KSLLAPSN KSLLASPO       KSLLID1R KS D
  ---------- -------- -------- ---------- ---------- ------------ ---------- -- -
  ACTIVE   4C623BB8         99          4 27468               275 EV 1
  ACTIVE   4C623040          9         24 27444                 0    1
  ACTIVE   4C622A84        101          4 27480               274 EV 1
  ACTIVE   4C6224C8          1         48 27450                 0    1
  ACTIVE   4C621F0C          1         48 27450                 0    1
  ACTIVE   4C6235FC          2          4 27468                 0    1
  SYS        ACTIVE   4C624174          2         15 27442                 0
  ACTIVE   4C62081C          1         48 27440                 0    1
  ACTIVE   4C621394          1         48 27440                 0    1
  ACTIVE   4C620DD8         11         24 27476                 0    1
  ACTIVE   4C61F6E8         15          4 27610                 0    1
  ACTIVE   4C620260        222         24 27450                 0    1
  ACTIVE   4C61FCA4          7         25 27573                 0    1
  ACTIVE   4C61F12C          6         25 27573                 0    1
  ACTIVE   4C61EB70          4         24 27458                 0    1
  ACTIVE   4C61E5B4          1         48 27440                 0    1
  ACTIVE   4C61DFF8          2         24 27444                 0    1
  4C624730          0          0                       0
  4C621950          0          0                       0
  4C61DA3C          0          0                       0
  或者根据下面的语句来获得发生变化的addr
  sys@AUSTIN> select p.addr from v$process p where pid  1
  2  minus
  3  select s.paddr from v$session s;
  ADDR
  --------
  4C621950
  4C624730
  三、在操作系统级别杀掉会话
  寻找会话对应的操作系统的进程ID
  sys@AUSTIN> select SPID from  v$process where ADDR in ('4C621950','4C624730') ;
  SPID
  ----------
  27573
  27641
  使用kill 命令来杀掉操作系统级别进程ID
  kill session -9 27573
  kill session -9 27641
  四、获得当前会话的SID
  SQL> select userenv('sid') from dual;
  USERENV('SID')
  --------------
  627
  五、多个会话需要kill 的处理办法
  1.根据给定的SID(用户名)查找需要杀掉会话的信息,包括位于哪一个实例
  set linesize 160
  col program format a35
  col username format a18
  select inst_id,saddr,sid,serial#,paddr,username,status,program from gv$session
  where sid in ('2731','2734','2720','2678','2685')
  and username='CTICUST'
  order by inst_id;
  INST_ID SADDR                   SID    SERIAL# PADDR            USERNAME           STATUS   PROGRAM
  ---------- ---------------- ---------- ---------- ---------------- ------------------ -------- ---------------------------
  1 00000003DAF8F870       2678       8265 00000003DBC6CA08 MSS4USR            INACTIVE JDBC Thin Client
  1 00000003DAF98E48       2685         83 00000003DBC08510 MSS4USR            ACTIVE   JDBC Thin Client
  1 00000003DAFC7B80       2720          5 00000003DBBEDA20 MSS4USR            INACTIVE JDBC Thin Client
  1 00000003DAFD66F8       2731          3 00000003DBBE9AE0 SYS                ACTIVE  racgimon@svdg0028(TNS V1-V3)
  1 00000003DAFDA730       2734         15 00000003DBBEC268 MSS4USR            INACTIVE JDBC Thin Client
  2 00000003DAFD66F8       2731          1 00000003DBBE92F8                    ACTIVE   oracle@svdg0029 (ARC0)
  上面的查询中有一个SID为2731的位于节点2上。
  也可以通过下面的方式来获得RAC的节点信息,便于确定需要kill 的session究竟位于哪一个节点。
  set linesize 160
  col HOST_NAME format a25
  SQL> select INSTANCE_NUMBER,INSTANCE_NAME,HOST_NAME,VERSION,STATUS from gv$instance order by 1;
  INSTANCE_NUMBER INSTANCE_NAME    HOST_NAME                 VERSION           STATUS
  --------------- ---------------- ------------------------- ----------------- ------------
  1 O02WMT1A         svd0051                  10.2.0.4.0        OPEN
  2 O02WMT1B         svd0052                  10.2.0.4.0        OPEN
  3 O02WMT1C         svd0053                  10.2.0.4.0        OPEN
  2.使用下面查询来生成kill session 的语句
  select 'alter system kill session '''|| sid ||',' ||SERIAL# ||''''||';'  from  gv$session
  where sid in ('2731','2734','2720','2678','2685')
  order by inst_id;
  获得下列kill session的语句,根据要求由于此次需要杀掉的session全部位于节点1,因此登录到节点节点1执行下面的语句
  alter system kill session '2678,8265';
  alter system kill session '2685,83';
  alter system kill session '2720,5';
  alter system kill session '2731,3';
  alter system kill session '2734,15';
  alter system kill session '2731,1';    --此条命令不需要执行,该session位于节点2。
  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-581854-1-1.html 上篇帖子: 利用Oracle VPD实现行级安全保护(一) 下篇帖子: 导入导出 Oracle 分区表数据
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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