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 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
第一、与表锁有关的系统视图:
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
查询sql:
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 '379, 21132'
alter system kill session '374, 6938'
我们在操作数据库的时候,有时候会由于操作不当引起数据库表被锁定,这么我们经常不知所措,不知怎么给这些表解锁,在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
|