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

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

    环境:

    操作系统:CentOS 6.4 64BIT

    数据库:Oracle RAC 11.2.0.4 R2 64bit

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

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

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

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

    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$类视图。

    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状态。

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

    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下活动的锁表会话信息:

    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视图,查看会话属于哪个实例:

    1. select * from gv$session wheresid=1228;

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

    1. altersystemkillsession'1228,42549,@实例序号';

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

    1. select * from gv$session where sid='会话id';

    2.

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

    在信息中找到spid。

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

    1. $ kill -9 进程号即spid

  • 相关阅读:
    YTU 2481: 01字串
    smarty的自定义函数
    $_SERVER['SCRIPT_FLENAME']与__FILE__
    pdo中query()与prepare().execute()
    pdo中bindParam()与bindValue的区别
    pdo简介--错误与错误处理
    pdo的三个预定义类,PDO PDOStatement PDOException
    根目录 上级目录 当前目录
    反射机制(转)
    log4j 日志配置
  • 原文地址:https://www.cnblogs.com/chendian0/p/14085122.html
Copyright © 2011-2022 走看看