原创作品,出自 “深蓝的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$类视图。

  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,                  --锁表用户的计算机名称(例如:WORKGROUP\hyl)
  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. select * from gv$process where addr='addr信息';

在信息中找到spid。

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

  1. $ kill -9 进程号即spid

锁_rac环境kill锁表会话后出现killed状态(解决)的更多相关文章

  1. MySQL 全局锁、表级锁、行级锁,你搞清楚了吗?

    大家好,我是小林. 最近重新补充了<MySQL 有哪些锁>文章内容: 增加记录锁.间隙锁.net-key 锁 增加插入意向锁 增加自增锁为 innodb_autoinc_lock_mode ...

  2. MySQL学习笔记(五):MySQL表级锁和行级锁

    一:概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  3. MySQL表级锁和行级锁

    一:概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  4. MySQL锁(表锁,行锁,共享锁,排它锁,间隙锁)使用详解

    锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是协调多个进程或县城并发访问某一资源的一种机制.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一 ...

  5. MySQL行级锁、表级锁、页级锁详细介绍

    原文链接:http://www.jb51.net/article/50047.htm 页级:引擎 BDB.表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行行级:引擎 INNODB , ...

  6. Mysql 的表级锁和行级锁

    表级锁 MySQL表级锁分为读锁和写锁. 读锁 用法:LOCK TABLE table_name [ AS alias_name ] READ 释放锁使用UNLOCK tables.可以为表使用别名, ...

  7. Mysql的表级锁和行级锁

    表级锁 MySQL表级锁分为读锁和写锁. 读锁 用法:LOCK TABLE table_name [ AS alias_name ] READ 释放锁使用UNLOCK tables.可以为表使用别名, ...

  8. mysql--->innodb引擎什么时候表锁什么时候行锁?

    mysql innodb引擎什么时候表锁什么时候行锁? InnoDB基于索引的行锁 InnoDB行锁是通过索引上的索引项来实现的,这一点MySQL与Oracle不同,后者是通过在数据中对相应数据行加锁 ...

  9. 【问答分享第一弹】MySQL锁总结:MySQL行锁、表锁、排他锁、共享锁的特点

    大家好,我是小于哥哈.前几天能分享了第一期面试题,MySQL 中有哪几种锁 和 这些锁各有哪些特点 ,这道面试题是经常会被问到的一个面试题,大家反馈的都挺不错的.今天特此来总结一下. 首发于公众号[终 ...

随机推荐

  1. 一篇介绍jquery很好的

    本文基于jQuery1.7.1版本,是对官方API的整理和总结,完整的官方API见http://api.jquery.com/browser/ 0.总述 jQuery框架提供了很多方法,但大致上可以分 ...

  2. mysql 为某一数据库下所有表中添加相同字段

    BEGIN  DECLARE s_tablename VARCHAR(100);  /*显示表的数据库中的所有表 SELECT table_name FROM information_schema.t ...

  3. 转载:node.js socket.io

    本文转自:http://www.xiaocai.name/post/cf1f9_7b6507  学习node.js socket.io 使用 用node.js(socket.io)实现数据实时推送 在 ...

  4. HDU 1693 Eat the Trees

    第一道(可能也是最后一道)插头dp.... 总算是领略了它的魅力... #include<iostream> #include<cstdio> #include<cstr ...

  5. Redis - string类型操作

    以个人信息为例操作string类型 设置操作: set:     set key value            创建key-value名值对 setnx:      setnx key value ...

  6. GIT之二 基础篇(1)

    GIT基础 取得项目的 Git 仓库 有两种取得 Git 项目仓库的方法.第一种是在现存的目录下,通过导入所有文件来创建新的 Git 仓库.第二种是从已有的 Git 仓库克隆出一个新的镜像仓库来. 在 ...

  7. Entityframework更新数据和插入数据

    public bool UpdateEmloyeeInfo(EmployeInfo employeInfo) { bool flg = false; try { using (UserManageDB ...

  8. WCF服务端行为的一些设置

    [ServiceBehavior( InstanceContextMode = InstanceContextMode.Single,   //表示所有的请求都用一个服务实例来处理 Concurren ...

  9. 【OpenGL】法线变换详解(Normal Transform)[转]

    http://blog.csdn.net/xiajun07061225/article/details/7762711 在图形学中,同样的一个模型视图变换矩阵可以用来变换点.线.多边形以及其它几何体, ...

  10. sprint计划会议

    会议召开时间表 日期 时间 内容 05/09 21:00-22:00 讨论题目(未果) 05/10 21:00-21:30 确定题目(网络助手) 05/13 21:00-21:45 讨论软件页面设计 ...