锁_rac环境kill锁表会话后出现killed状态(解决)
2016-11-14 22:34
302 查看
原创作品,出自 “深蓝的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
SELECT
A.OWNER, --OBJECT所属用户
A.OBJECT_NAME, --OBJECT名称
B.XIDUSN,
B.XIDSLOT,
B.XIDSQN,
B.SESSION_ID, --锁表用户的session
B.ORACLE_USERNAME, --锁表用户的Oracle用户名
B.OS_USER_NAME, --锁表用户的操作系统登陆用户名
B.PROCESS,
B.LOCKED_MODE,
C.MACHINE, --锁表用户的计算机名称
C.STATUS, --锁表状态
C.SERVER,
C.SID,
C.SERIAL#,
C.PROGRAM --锁表用户所用的数据库管理工具
FROM
ALL_OBJECTS A,
GV$LOCKED_OBJECT B,
SYS.GV_$SESSION C
WHERE
A.OBJECT_ID = B.OBJECT_ID
AND B.PROCESS = C.PROCESS
--AND C.STATUS='ACTIVE'
ORDERBY1,2
在查询结果中,锁定到需要解锁的表的会话信息,如下:
于是,尝试查询锁表的用户,如下:
注意:这里是rac环境,需要查询gv$类视图。
[sql] view plain copy
SELECT
A.OWNER, --OBJECT所属用户
A.OBJECT_NAME, --OBJECT名称
B.XIDUSN,
B.XIDSLOT,
B.XIDSQN,
B.SESSION_ID, --锁表用户的session
B.ORACLE_USERNAME, --锁表用户的Oracle用户名
B.OS_USER_NAME, --锁表用户的操作系统登陆用户名
B.PROCESS,
B.LOCKED_MODE,
C.MACHINE, --锁表用户的计算机名称
C.STATUS, --锁表状态
C.SERVER,
C.SID,
C.SERIAL#,
C.PROGRAM --锁表用户所用的数据库管理工具
FROM
ALL_OBJECTS A,
GV$LOCKED_OBJECT B,
SYS.GV_$SESSION C
WHERE
A.OBJECT_ID = B.OBJECT_ID
AND B.PROCESS = C.PROCESS --AND C.STATUS='ACTIVE'
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
SELECT
A.OWNER,
A.OBJECT_NAME, --OBJECT名称(表名)
B.XIDUSN,
B.XIDSLOT,
B.XIDSQN,
B.SESSION_ID, --锁表用户的session
B.ORACLE_USERNAME,
B.OS_USER_NAME, --锁表用户的操作系统登陆用户名
B.PROCESS,
B.LOCKED_MODE,
C.MACHINE, --锁表用户的计算机名称(例如:WORKGROUP\hyl)
C.STATUS, --锁表状态
C.SERVER,
C.SID,
C.SERIAL#,
C.PROGRAM --锁表用户所用的数据库管理工具(例如:developer.exe)
FROM
ALL_OBJECTS A,
GV$LOCKED_OBJECT B,
SYS.GV_$SESSION C
WHERE
A.OBJECT_ID = B.OBJECT_ID
AND B.PROCESS = C.PROCESS
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
SELECT
A.OWNER, --OBJECT所属用户
A.OBJECT_NAME, --OBJECT名称
B.XIDUSN,
B.XIDSLOT,
B.XIDSQN,
B.SESSION_ID, --锁表用户的session
B.ORACLE_USERNAME, --锁表用户的Oracle用户名
B.OS_USER_NAME, --锁表用户的操作系统登陆用户名
B.PROCESS,
B.LOCKED_MODE,
C.MACHINE, --锁表用户的计算机名称
C.STATUS, --锁表状态
C.SERVER,
C.SID,
C.SERIAL#,
C.PROGRAM --锁表用户所用的数据库管理工具
FROM
ALL_OBJECTS A,
GV$LOCKED_OBJECT B,
SYS.GV_$SESSION C
WHERE
A.OBJECT_ID = B.OBJECT_ID
AND B.PROCESS = C.PROCESS
AND C.STATUS='ACTIVE'
ORDERBY1,2;
查询gv$session视图,查看会话属于哪个实例:
[sql] view plain copy
select * from gv$session wheresid=1228;
杀掉集群环境下的某个会话:
[sql] view plain copy
altersystemkillsession'1228,42549,@实例序号';
查询会话对应的系统进程号:
[sql] view plain copy
select * from gv$session where sid='会话id';
select * from gv$process where addr='addr信息';
在信息中找到spid。
到操作系统下,kill掉进程(oracle用户下):
[plain] view plain copy
$ kill -9 进程号即spid
rac生产库杀掉锁表会话出现killed状态处理
环境:
操作系统:CentOS 6.4 64BIT
数据库:Oracle RAC 11.2.0.4 R2 64bit
在某项目中,进行大数据抽取任务时,抽取出现错误,需要对大表进行重新抽取。于是取消insert操作,然后执行truncate操作。
如下,报错了,提示资源正忙,判断应该是之前的操作没有完全取消,出现了锁等待。
于是,尝试查询锁表的用户,如下:
注意:这里是rac环境,需要查询gv$类视图。
[sql] view plain copy
SELECT
A.OWNER, --OBJECT所属用户
A.OBJECT_NAME, --OBJECT名称
B.XIDUSN,
B.XIDSLOT,
B.XIDSQN,
B.SESSION_ID, --锁表用户的session
B.ORACLE_USERNAME, --锁表用户的Oracle用户名
B.OS_USER_NAME, --锁表用户的操作系统登陆用户名
B.PROCESS,
B.LOCKED_MODE,
C.MACHINE, --锁表用户的计算机名称
C.STATUS, --锁表状态
C.SERVER,
C.SID,
C.SERIAL#,
C.PROGRAM --锁表用户所用的数据库管理工具
FROM
ALL_OBJECTS A,
GV$LOCKED_OBJECT B,
SYS.GV_$SESSION C
WHERE
A.OBJECT_ID = B.OBJECT_ID
AND B.PROCESS = C.PROCESS
--AND C.STATUS='ACTIVE'
ORDERBY1,2
在查询结果中,锁定到需要解锁的表的会话信息,如下:
于是,尝试查询锁表的用户,如下:
注意:这里是rac环境,需要查询gv$类视图。
[sql] view plain copy
SELECT
A.OWNER, --OBJECT所属用户
A.OBJECT_NAME, --OBJECT名称
B.XIDUSN,
B.XIDSLOT,
B.XIDSQN,
B.SESSION_ID, --锁表用户的session
B.ORACLE_USERNAME, --锁表用户的Oracle用户名
B.OS_USER_NAME, --锁表用户的操作系统登陆用户名
B.PROCESS,
B.LOCKED_MODE,
C.MACHINE, --锁表用户的计算机名称
C.STATUS, --锁表状态
C.SERVER,
C.SID,
C.SERIAL#,
C.PROGRAM --锁表用户所用的数据库管理工具
FROM
ALL_OBJECTS A,
GV$LOCKED_OBJECT B,
SYS.GV_$SESSION C
WHERE
A.OBJECT_ID = B.OBJECT_ID
AND B.PROCESS = C.PROCESS --AND C.STATUS='ACTIVE'
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
SELECT
A.OWNER,
A.OBJECT_NAME, --OBJECT名称(表名)
B.XIDUSN,
B.XIDSLOT,
B.XIDSQN,
B.SESSION_ID, --锁表用户的session
B.ORACLE_USERNAME,
B.OS_USER_NAME, --锁表用户的操作系统登陆用户名
B.PROCESS,
B.LOCKED_MODE,
C.MACHINE, --锁表用户的计算机名称(例如:WORKGROUP\hyl)
C.STATUS, --锁表状态
C.SERVER,
C.SID,
C.SERIAL#,
C.PROGRAM --锁表用户所用的数据库管理工具(例如:developer.exe)
FROM
ALL_OBJECTS A,
GV$LOCKED_OBJECT B,
SYS.GV_$SESSION C
WHERE
A.OBJECT_ID = B.OBJECT_ID
AND B.PROCESS = C.PROCESS
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
SELECT
A.OWNER, --OBJECT所属用户
A.OBJECT_NAME, --OBJECT名称
B.XIDUSN,
B.XIDSLOT,
B.XIDSQN,
B.SESSION_ID, --锁表用户的session
B.ORACLE_USERNAME, --锁表用户的Oracle用户名
B.OS_USER_NAME, --锁表用户的操作系统登陆用户名
B.PROCESS,
B.LOCKED_MODE,
C.MACHINE, --锁表用户的计算机名称
C.STATUS, --锁表状态
C.SERVER,
C.SID,
C.SERIAL#,
C.PROGRAM --锁表用户所用的数据库管理工具
FROM
ALL_OBJECTS A,
GV$LOCKED_OBJECT B,
SYS.GV_$SESSION C
WHERE
A.OBJECT_ID = B.OBJECT_ID
AND B.PROCESS = C.PROCESS
AND C.STATUS='ACTIVE'
ORDERBY1,2;
查询gv$session视图,查看会话属于哪个实例:
[sql] view plain copy
select * from gv$session wheresid=1228;
杀掉集群环境下的某个会话:
[sql] view plain copy
altersystemkillsession'1228,42549,@实例序号';
查询会话对应的系统进程号:
[sql] view plain copy
select * from gv$session where sid='会话id';
select * from gv$process where addr='addr信息';
在信息中找到spid。
到操作系统下,kill掉进程(oracle用户下):
[plain] view plain copy
$ kill -9 进程号即spid
相关文章推荐
- 锁_rac环境kill锁表会话后出现killed状态(解决)
- SQL Server会话KILL不掉,一直处于KILLED /ROLLBACK状态情形浅析
- RAC环境出现ora-12545解决
- 关于oracle10g登录em后出现“数据库状态当前不可用”解决方法
- 在WSUS 3.0的环境中,部分客户机没有向WSUS服务器更新状态,该如何解决?
- 转 windows 环境下 mysql 数据库的升级以及 出现问题的解决 Communication link failure: Bad handshake
- ASP.NET 无法向会话状态服务器发出会话状态请求 错误的解决方法
- 无法向会话状态服务器发出会话状态请求 错误的解决方法
- Moss 2007 创建工作流: 该表单无法显示,因为会话状态不可用 解决方法
- RAC中资源状态不正常解决
- win2k环境下基于JBOSS的J2EE开发实践----之三、有状态会话 Bean的开发及多种调用有状态会话Bean方法的实现
- 无法向会话状态服务器发出会话状态请求 没有启动 ASP.NET State service错误的解决方法
- ASP在Win2003和IIS6的环境下出现乱码问题的解决
- .Net环境水晶报表在98下发布,出现"不能加载报表..."问题的解决
- 出现"会话状态已创建一个会话ID,但由于响应已被应用程序刷新而无法保存它" 解决方案
- 无法向会话状态服务器发出会话状态请求 错误的解决方法
- linux环境sqlplus中使用backspace键出现乱码的解决方法
- MSSQL删除字段时出现 服务器: 消息 5074,级别 16,状态 1,行 1 的解决办法
- [3/04]域环境中出现“终结点不可用”的解决方法
- struts hibernate spring 环境配置时出现 HTTP Status 404 Servlet action is not available (解决方法)