oracle表被锁了;解锁;释放session

http://linjia828.itpub.net/post/35280/405967

http://space.itpub.net/10435225/viewspace-114443

一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库。但是shutdown immediate又怕可能进程杀不掉会一直停留在shutdown immediate,直接shutdown abort又怕损坏数据库。 
现在提供一种方法解决这种问题,那就是在ORACLE中杀不掉的,在OS一级再杀。 

一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库。但是shutdown immediate又怕可能进程杀不掉会一直停留在shutdown immediate,直接shutdown abort又怕损坏数据库。 
现在提供一种方法解决这种问题,那就是在ORACLE中杀不掉的,在OS一级再杀。 

1.下面的语句用来查询哪些对象被锁: 
SELECT S.USERNAME,S.OSUSER,S.SID,S.SERIAL#,P.SPID FROM V$SESSION S,V$PROCESS 
P WHERE S.PADDR=P.ADDR AND S.USERNAME IS NOT NULL; 

2.下面的语句用来杀死一个进程: 
alter system kill session 'sid,serial#'; 

【注】以上两步,可以通过Oracle的管理控制台来执行。 
如果出现题目的错误,可以 
select a.spid,b.sid,b.serial#,b.username from v$process a,v$session b where a.addr=b.paddr and b.status='KILLED' ; 

3.如果利用上面的命令杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在os一级再杀死相应的进程(线程),首先执行下面的语句获得进程(线程)号: 
select spid, osuser, s.program from v$session s,v$process p where 
s.paddr=p.addr and s.sid=33 (33就是上面的sid) 

4.在OS上杀死这个进程(线程): 
1)在unix上,用root身份执行命令: 
#kill -9 12345(即第3步查询出的spid) 
2)在windows(unix也适用)用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为: 
orakill sid thread 
其中: 
sid:表示要杀死的进程属于的实例名 
thread:是要杀掉的线程号,即第3步查询出的spid。 
例:c:>orakill orcl 12345
 
Ps:这里要注意的是kill OS进程是在服务端操作,而不是你程序所在客户机。

########################################################################

http://www.cnblogs.com/marklch/archive/2008/03/21/1116403.html

--查出所有被锁住的表
select b.owner TABLEOWNER, b.object_name TABLENAME, c.OSUSER LOCKBY, c.USERNAME LOGINID, c.sid SID, c.SERIAL# SERIAL
from v$locked_object a,dba_objects b, v$session c 
where b.object_id = a.object_id AND a.SESSION_ID =c.sid;
--通过SID, SERIAL解锁 
--
alter system kill session 'SID, SERIAL';

http://blog.csdn.net/lizhongstu/article/details/8782809

 

Oracle中查看一个表是否被锁住

 

 

SELECT OBJECT_NAME,SESSION_ID SID,MACHINE,VS.MODULE, 'ALTER SYSTEM KILL SESSION '''||SESSION_ID|| ', '||SERIAL#|| '''; ' KILL_SESSION,VS.STATUS,VS.ACTION,SERIAL#,ORACLE_USERNAME,OS_USER_NAME
FROM V$LOCKED_OBJECT VO, V$SESSION VS, ALL_OBJECTS AO 
WHERE VO.SESSION_ID = VS.SID AND AO.OBJECT_ID = VO.OBJECT_ID AND NVL(VS.ACTION, ' ') <> 'Service Management ' ORDER BY OBJECT_NAME,MACHINE,VS.MODULE;

 

 

 

这段代码 可以找到,非系统锁的表,并给出 KILL SESSION语句。可以查到是那台机器,有什么程序锁的表

 

 

 

--查出所有被锁住的表
select b.owner TABLEOWNER, b.object_name TABLENAME, c.OSUSER LOCKBY,

c.USERNAME LOGINID, c.sid SID, c.SERIAL# SERIAL
from v$locked_object a,dba_objects b, v$session c 
where b.object_id = a.object_id AND a.SESSION_ID =c.sid;
--通过SID, SERIAL解锁 
--alter system kill session 'SID, SERIAL';

 

 

 


oracle ORA-14452错误处理  临时表被锁
create global temporary table on commit preserve rows 用于会话相关,
也就在事务结束后truncate data in the temporary table,但如果在会话未结束时要

修改temporary table就会出现错误:
ORA-14452: attempt to create, alter or drop an index on temporary table

already in use
经查,该错误的解释为:
Cause: An attempt was made to create, alter or drop an index on temporary

table which is already in use.
Action: All the sessions using the session-specific temporary table have to

truncate table and all the transactions using transaction specific

temporary table have to end their transactions.


处理步骤:
1、先从user_objects中查询到该表的object_id:
select object_id from user_objects where object_name=upper

('TMP_365100930');


2、根据查到的object_id知道使用该表的session:
select * from v$lock where id1=&object_id;


3、在从v$session视图中查到该session的SID和SERIAL#:
select * from v$session where sid=181;


4、杀掉这些进程:
alter system kill session SID,SERIAL#;

 

http://blog.chinaunix.net/uid-10941534-id-3499567.html

 

一、查看有哪些表被锁住
select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;

select b.username,b.sid,b.serial#,logon_time from v$locked_object a,v$session b where a.session_id = b.sid order  by b.logon_time;

杀进程中的会话
alter system kill session 'sid,serial#';e.galter system kill session '29,5497'; 
如果有ora-00031错误,则在后面加immediate;
alter system kill session '29,5497' immediate;


二、如何杀死oracle死锁进程
1.查哪个过程被锁:
  查V$DB_OBJECT_CACHE视图:
  SELECT * FROM V$DB_OBJECT_CACHE A  WHERE A.OWNER='GSEOPROD' AND A.LOCKS != '0';

  2. 查是哪一个SID,通过SID可知道是哪个SESSION:
  查V$ACCESS视图:
  SELECT * FROM V$ACCESS WHERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名';
  3. 查出SID和SERIAL#:
  查V$SESSION视图:
  SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='刚才查到的SID';
  查V$PROCESS视图:
  SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的PADDR';
  4. 杀进程:
  (1)先杀ORACLE进程:
  ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';
  (2)再杀操作系统进程:
  KILL -9 刚才查出的SPID或ORAKILL 刚才查出的SID 刚才查出的SPID。

 

http://ddandyy.iteye.com/blog/127614

查看被锁的表 

select   p.spid,a.serial#, c.object_name,b.session_id,b.oracle_username,b.os_user_name   from   v$process   p,v$session   a,   v$locked_object   b,all_objects   c   where   p.addr=a.paddr   and   a.process=b.process   and   c.object_id=b.object_id   




查看连接的进程 

SELECT sid, serial#, username, osuser FROM v$session; 




杀掉进程 

alter   system     kill   session   'sid,serial#'; 

http://lvmlvy.iteye.com/blog/1668020

 

oracle 出现不能查询sql时候, 表被锁住解决方法 
.select object_name as 对象名称,s.sid,s.serial#,p.spid as 系统进程号 
from v$locked_object l , dba_objects o , v$session s , v$process p 
where l.object_id=o.object_id and l.session_id=s.sid and s.paddr=p.addr; 




alter system kill session 's.sid,s.serial#' 

http://blog.163.com/z_rx/blog/static/27636376200952112536112/

 

 

由于各种原因,Oracle 中经常会出现表被锁定的现象,使的操作无法进行。

查看被锁的表: 
select p.spid,c.object_name,b.session_id,a.serial#,b.oracle_username,b.os_user_name from v$process pv$session a, v$locked_object b,all_objects c where p.addr=a.paddr and a.process=b.process and c.object_id=b.object_id ;

解锁: 
alter system kill session 'b.session_id,a.serial#';
或 在系统层面终止进程:
[Windows]  ntsd -c q -p p.spid
[Linux]        ps -ef|grep p.spid


第一、与表锁有关的系统视图:

A : v$lock

SQL> desc v$lock;
名称                                      是否为空? 类型
----------------------------------------- -------- ----------------------------
ADDR                                                     RAW(4)
KADDR                                                   RAW(4)
SID                                                         NUMBER
TYPE                                                      VARCHAR2(2)
ID1                                                         NUMBER
ID2                                                         NUMBER
LMODE                                                  NUMBER
REQUEST                                             NUMBER
CTIME                                                   NUMBER
BLOCK                                                  NUMBER

该视图说明当前锁定的所有对象,锁定都的SID号,锁定类型等信息;

B: v$locked_object

SQL> desc v$locked_object;
名称                                      是否为空? 类型
----------------------------------------- -------- ----------------------------
XIDUSN                                                    NUMBER
XIDSLOT                                                 NUMBER
XIDSQN                                                   NUMBER
OBJECT_ID                                             NUMBER
SESSION_ID                                            NUMBER
ORACLE_USERNAME                             VARCHAR2(30)
OS_USER_NAME                                    VARCHAR2(30)
PROCESS                                               VARCHAR2(12)
LOCKED_MODE                                      NUMBER

用以详细的描述了当前锁定对象的详细信息,OBJECT_ID 为对象ID,SESSION_ID为当前登录用户Session号,ORACLE_USERNAME 为Oracle的用户名,OS_USER_NAME 为操作系统用户名等等。

针对以上两个系统视图,相应的有两种查询当前表锁的方法:

SQL> select all_objects.object_name,
S.SID,
s.serial#,
s.osuser,
s.PROGRAM,
s.machine,
s.CLIENT_INFO
from v$lock k, v$session s, ALL_OBJECTS
where k.SID = s.SID
and k.TYPE IN ('TX', 'TM')
and k.id1 = all_objects.object_id;

 

http://www.blogjava.net/alex/archive/2006/08/21/64895.html

 

 

key words: 锁表 解锁
查询sql:
SELECT A.OWNER,
A.
OBJECT_NAME,
B.XIDUSN,
B.XIDSLOT,
B.XIDSQN,
B.SESSION_ID,
B.ORACLE_USERNAME, 
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,
V$LOCKED_OBJECT B,
SYS.GV_$SESSION C 
WHERE ( A.OBJECT_ID = B.OBJECT_ID )
AND (B.PROCESS = C.PROCESS )
ORDER BY 1,2 

释放session Sql:
alter system kill session 'sid, serial#'

alter system kill session '379, 21132'
alter system kill session '374, 6938'
 
http://space.itpub.net/15725751/viewspace-624722
 

我们在操作数据库的时候,有时候会由于操作不当引起数据库表被锁定,这么我们经常不知所措,不知怎么给这些表解锁,在pl/sql Developer工具的的菜单“tools”里面的“sessions”可以查询现在存在的会话,但是我们很难找到那个会话被锁定了,想找到所以被锁的会话就更难了,下面这叫查询语句可以查询出所以被锁的会话。如下:

1、查看被锁的表:

 

SELECT p.spid,

       c.object_name,

       b.session_id,

       a.serial#,

       b.oracle_username,

       b.os_user_name

  FROM v$process p, v$session a, v$locked_object b, all_objects c

 WHERE p.addr = a.paddr

   AND a.process = b.process

   AND c.object_id = b.object_id;

 

解锁: 
alter system kill session 'b.session_id,a.serial#';
或 在系统层面终止进程:
[Windows]  ntsd -c q -p p.spid
[Linux]        ps -ef|grep p.spid

2、查询当前表锁的方法:

 

SELECT all_objects.object_name,

       s.sid,

       s.serial#,

       s.osuser,

       s.program,

       s.machine,

       s.client_info

  FROM v$lock k, v$session s, all_objects

 WHERE k.sid = s.sid

   AND k.TYPE IN ('TX', 'TM')

   AND k.id1 = all_objects.object_id;

 

v$locked_object:用以详细的描述了当前锁定对象的详细信息,OBJECT_ID 为对象ID,SESSION_ID为当前登录用户Session号,ORACLE_USERNAME 为Oracle的用户名,OS_USER_NAME为操作系统用户名等

v$lock:该视图说明当前锁定的所有对象,锁定SID号,锁定类型等信息;

3、查询锁

 

--存在锁请求,即被阻塞

SELECT sn.username,

       m.sid,

       sn.serial#,

       m.TYPE,

       decode(m.lmode,

              0,

              'None',

              1,

              'Null',

              2,

              'Row Share',

              3,

              'Row Excl.',

              4,

              'Share',

              5,

              'S/Row Excl.',

              6,

              'Exclusive',

              lmode,

              ltrim(to_char(lmode, '990'))) lmode,

       decode(m.request,

              0,

              'None',

              1,

              'Null',

              2,

              'Row Share',

              3,

              'Row Excl.',

              4,

              'Share',

              5,

              'S/Row Excl.',

              6,

              'Exclusive',

              request,

              ltrim(to_char(m.request, '990'))) request,

       m.id1,

       m.id2

  FROM v$session sn, v$lock m

 WHERE sn.sid = m.sid

   AND m.request != 0

 ORDER BY id1, id2, m.request

--不存在锁请求,但是锁定的对象被其他会话请求锁定

SELECT sn.username,

       m.sid,

       sn.serial#,

       m.TYPE,

       decode(m.lmode,

              0,

              'None',

              1,

              'Null',

              2,

              'Row Share',

              3,

              'Row Excl.',

              4,

              'Share',

              5,

              'S/Row Excl.',

              6,

              'Exclusive',

              lmode,

              ltrim(to_char(lmode, '990'))) lmode,

       decode(m.request,

              0,

              'None',

              1,

              'Null',

              2,

              'Row Share',

              3,

              'Row Excl.',

              4,

              'Share',

              5,

              'S/Row Excl.',

              6,

              'Exclusive',

              request,

              ltrim(to_char(m.request, '990'))) request,

       m.id1,

       m.id2

  FROM v$session sn, v$lock m

 WHERE sn.sid = m.sid

   AND m.request = 0

   AND m.lmode != 4

   AND (id1, id2) IN (SELECT s.id1, s.id2

                        FROM v$lock s

                       WHERE request != 0

                         AND s.id1 = m.id1

                         AND s.id2 = m.id2)

 ORDER BY id1, id2, m.request

 

 

 
 
posted @ 2013-11-07 17:48  陳聽溪  阅读(3300)  评论(0)    收藏  举报