zoukankan      html  css  js  c++  java
  • 锁_rac环境kill锁表会话后出现killed状态(解决)

    原创作品,出自 “深蓝的blog” 博客,深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/46876961

    rac生产库杀掉锁表会话出现killed状态处理

     

    环境:

    操作系统:CentOS 6.4 64BIT

    数据库:Oracle RAC 11.2.0.4 R2 64bit

     

           在某项目中,进行大数据抽取任务时,抽取出现错误,需要对大表进行重新抽取。于是取消insert操作,然后执行truncate操作。

    如下,报错了,提示资源正忙,判断应该是之前的操作没有完全取消,出现了锁等待。

    于是,尝试查询锁表的用户,如下:

    注意:这里是rac环境,需要查询gv$类视图。

    [sql] view plain copy
     
    1. SELECT  
    2.   A.OWNER,                        --OBJECT所属用户  
    3.   A.OBJECT_NAME,                  --OBJECT名称  
    4.   B.XIDUSN,  
    5.   B.XIDSLOT,  
    6.   B.XIDSQN,  
    7.   B.SESSION_ID,                   --锁表用户的session  
    8.   B.ORACLE_USERNAME,              --锁表用户的Oracle用户名  
    9.   B.OS_USER_NAME,                 --锁表用户的操作系统登陆用户名  
    10.   B.PROCESS,  
    11.   B.LOCKED_MODE,   
    12.   C.MACHINE,                      --锁表用户的计算机名称  
    13.   C.STATUS,                       --锁表状态  
    14.   C.SERVER,  
    15.   C.SID,  
    16.   C.SERIAL#,  
    17.   C.PROGRAM                       --锁表用户所用的数据库管理工具  
    18. FROM  
    19.   ALL_OBJECTS A,  
    20.   GV$LOCKED_OBJECT B,  
    21.   SYS.GV_$SESSION C   
    22. WHERE  
    23.   A.OBJECT_ID = B.OBJECT_ID  
    24.   AND B.PROCESS = C.PROCESS   
    25. --AND C.STATUS='ACTIVE'  
    26. ORDERBY1,2  

    在查询结果中,锁定到需要解锁的表的会话信息,如下:

    于是,尝试查询锁表的用户,如下:

    注意:这里是rac环境,需要查询gv$类视图。

    [sql] view plain copy
     
    1. SELECT  
    2.   A.OWNER,                        --OBJECT所属用户  
    3.   A.OBJECT_NAME,                  --OBJECT名称  
    4.   B.XIDUSN,  
    5.   B.XIDSLOT,  
    6.   B.XIDSQN,  
    7.   B.SESSION_ID,                   --锁表用户的session  
    8.   B.ORACLE_USERNAME,              --锁表用户的Oracle用户名  
    9.   B.OS_USER_NAME,                 --锁表用户的操作系统登陆用户名  
    10.   B.PROCESS,  
    11.   B.LOCKED_MODE,   
    12.   C.MACHINE,                      --锁表用户的计算机名称  
    13.   C.STATUS,                       --锁表状态  
    14.   C.SERVER,  
    15.   C.SID,  
    16.   C.SERIAL#,  
    17.   C.PROGRAM                       --锁表用户所用的数据库管理工具  
    18. FROM  
    19.   ALL_OBJECTS A,  
    20.   GV$LOCKED_OBJECT B,  
    21.   SYS.GV_$SESSION C   
    22. WHERE  
    23.   A.OBJECT_ID = B.OBJECT_ID  
    24.   AND B.PROCESS = C.PROCESS --AND C.STATUS='ACTIVE'  
    25. ORDER BY 1,2  

    在查询结果中,锁定到需要解锁的表的会话信息,如下:

    尝试将这个会话kill掉。

    查询该会话属于哪个实例,如下:

    select   *  from   gv$session  where  sid=1228

    --查看到,这是实例2的session

    把这个session杀掉

    例:alter system kill session 'sid, serial#, @ inst_id '

    alter system kill session '1228, 42549, @2 '

     

    提示,这个会话被标记为kill状态。

    说明这个会话没有被完全杀掉。我们再来查查看。

    [sql] view plain copy
     
    1. SELECT  
    2.   A.OWNER,                           
    3.   A.OBJECT_NAME,                  --OBJECT名称(表名)  
    4.   B.XIDUSN,  
    5.   B.XIDSLOT,  
    6.   B.XIDSQN,  
    7.   B.SESSION_ID,                     --锁表用户的session  
    8.   B.ORACLE_USERNAME,                
    9.   B.OS_USER_NAME,                 --锁表用户的操作系统登陆用户名  
    10.   B.PROCESS,  
    11.   B.LOCKED_MODE,   
    12.   C.MACHINE,                  --锁表用户的计算机名称(例如:WORKGROUPhyl)  
    13.   C.STATUS,                    --锁表状态  
    14.   C.SERVER,  
    15.   C.SID,  
    16.   C.SERIAL#,  
    17.   C.PROGRAM                  --锁表用户所用的数据库管理工具(例如:developer.exe)  
    18. FROM  
    19.   ALL_OBJECTS A,  
    20.   GV$LOCKED_OBJECT B,  
    21.   SYS.GV_$SESSION C   
    22. WHERE  
    23.   A.OBJECT_ID = B.OBJECT_ID  
    24.   AND B.PROCESS = C.PROCESS   
    25. ORDER BY 1,2  

     

    看到该会话的状态是killed。

    下面尝试在操作系统下,杀掉进程。

    通过gv$session视图查看到sid(sid为1228)对应的addr。

    再通过addr到gv$process视图中,查看到session的spid,最后到操作系统下kill掉这个进程。如下,查看到了这个session的spid,

    select   *  from   gv$process   where   addr = 'addr信息' ;

    如下:

    到操作系统下,查看一下这个进程,如下:

    [oracle@xzxtdb2 ~]$ ps  -ef |grep  71941

    oracle   36647 36545  0 16:27 pts/1    00:00:00 grep 71941

    oracle   71941     1 41 Jul09 ?        09:34:55 oraclexzxt2 (LOCAL=NO)

    杀掉71941这个进程,如下:

    [oracle@xzxtdb2 ~]$ kill  -9  71941

    [oracle@xzxtdb2 ~]$ ps  -ef |grep 71941

    oracle   36687 36545  0 16:28 pts/1    00:00:00 grep 71941

    --这条信息是grep本身

    用下面这条指令再发起查询,更清晰的显示出来,如下:

    [oracle@xzxtdb2 ~]$ ps -ef |grep 71941|grep -v grep

    无信息

    说明spid为71941的session已经被kill掉了。

     

    再次truncate表,成功。

    truncate table  tb_表名 ;

     

    小结:

             在rac下kill锁表会话时,需要注意查看会话归于于哪个实例,然后再对其kill。如果无法在sqlplus下杀掉,尝试到操作系统下对其kill。

             顺序指令如下:

    查询rac下活动的锁表会话信息:

    [sql] view plain copy
     
    1. SELECT  
    2.   A.OWNER,                        --OBJECT所属用户  
    3.   A.OBJECT_NAME,                  --OBJECT名称  
    4.   B.XIDUSN,  
    5.   B.XIDSLOT,  
    6.   B.XIDSQN,  
    7.   B.SESSION_ID,                   --锁表用户的session  
    8.   B.ORACLE_USERNAME,              --锁表用户的Oracle用户名  
    9.   B.OS_USER_NAME,                 --锁表用户的操作系统登陆用户名  
    10.   B.PROCESS,  
    11.   B.LOCKED_MODE,   
    12.   C.MACHINE,                      --锁表用户的计算机名称  
    13.   C.STATUS,                       --锁表状态  
    14.   C.SERVER,  
    15.   C.SID,  
    16.   C.SERIAL#,  
    17.   C.PROGRAM                       --锁表用户所用的数据库管理工具  
    18. FROM  
    19.   ALL_OBJECTS A,  
    20.   GV$LOCKED_OBJECT B,  
    21.   SYS.GV_$SESSION C   
    22. WHERE  
    23.   A.OBJECT_ID = B.OBJECT_ID  
    24.   AND B.PROCESS = C.PROCESS   
    25. AND C.STATUS='ACTIVE'  
    26. ORDERBY1,2;  

    查询gv$session视图,查看会话属于哪个实例:

    [sql] view plain copy
     
    1. select * from gv$session wheresid=1228;  

    杀掉集群环境下的某个会话:

    [sql] view plain copy
     
    1. altersystemkillsession'1228,42549,@实例序号';  

    查询会话对应的系统进程号:

    [sql] view plain copy
     
    1. select * from gv$session where sid='会话id';  
    2.   
    3. select * from gv$process where addr='addr信息';  

    在信息中找到spid。

    到操作系统下,kill掉进程(oracle用户下):

    [plain] view plain copy
     
    1. $ kill -9 进程号即spid   

     

  • 相关阅读:
    ORACLE 查看进程数,已执行任务数, 剩余任务数,删除指定任务
    ORACLE 收集统计整个用户数据
    解决Hystrix dashboard Turbine 一直 Loading…… 及其他坑
    利用 Maven 构造 Spring Cloud 微服务架构 模块使用 spring Boot构建
    AES加解密
    JAVA POI XSSFWorkbook导出扩展名为xlsx的Excel,附带weblogic 项目导出Excel文件错误的解决方案
    JAVA 文件的上传下载
    shell启停服务脚本模板
    JAVA 设计模式之 原型模式详解
    JAVA 设计模式之 工厂模式详解
  • 原文地址:https://www.cnblogs.com/andy6/p/6063792.html
Copyright © 2011-2022 走看看