博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
锁_rac环境kill锁表会话后出现killed状态(解决)
阅读量:6005 次
发布时间:2019-06-20

本文共 3532 字,大约阅读时间需要 11 分钟。

原创作品,出自 “深蓝的blog” 博客,深蓝的blog:

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

 

环境:

操作系统:CentOS 6.4 64BIT

数据库:Oracle RAC 11.2.0.4 R2 64bit

 

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

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

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

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

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

[sql]   
 
  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]   
 
  1. select * from gv$session wheresid=1228;  

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

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

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

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

在信息中找到spid。

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

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

 

转载地址:http://xgsmx.baihongyu.com/

你可能感兴趣的文章
(原創) 如何設計一個數位相框? (SOC) (Quartus II) (SOPC Builder) (Nios II) (TRDB-LTM) (DE2-70)...
查看>>
/etc/profile文件内容
查看>>
量词 匹配优先与忽略优先
查看>>
一页纸IT项目管理:大道至简的实用管理沟通工具
查看>>
汽车知识:车内异味的清除方法
查看>>
IE6 7下绝对定位引发浮动元素神秘消失
查看>>
浏览器的回流和重绘及其优化方式
查看>>
Eclipse基金会发布Eclipse Photon IDE
查看>>
JavaScript 设计模式
查看>>
Java EE供应商和伦敦Java用户组宣布新的MicroProfile
查看>>
PostgreSQL中的大容量空间探索时间序列数据存储
查看>>
敏捷制造:并不是你想像的矛盾体
查看>>
jQuery选择器和事件
查看>>
十、syslog日志与loganalyzer日志管理
查看>>
Python多进程并发写入PostgreSQL数据表
查看>>
mysql 优化
查看>>
2.4 salt grains与pillar jinja的模板
查看>>
MySQL主从(介绍,配置主机,配置从机,测试主从同步)
查看>>
不同版本的outlook客户端配置Office 365 exchange online帐户需要安装的补丁
查看>>
Java服务器-resin
查看>>