- 浏览: 7975 次
- 性别:
- 来自: 深圳
最新评论
Oracle的锁表与解锁
select ls.osuser os_user_name, -- 操作系统/用户名
ls.username user_name, -- 数据库用户名
decode(ls.type, 'RW', 'Row wait enqueue lock', 'UL', 'User supplied lock')lock_type, --锁的类型
o.object_name object, --被锁住的对象名
decode(ls.lmode, 1, null, 2, 'Row Share', 3, 'Row Exclusive', 4, 'Share', 5, 'Share Row Exclusive', 6, 'Exclusive', null)lock_mode, --锁的模式
o.owner, --对象的拥有者
ls.sid, --会话标识符
ls.serial# serial_num, --会话序列号
ls.id1, ls.id2,
ls.paddr --会话对应的进程地址
from sys.dba_objects o, ( select s.osuser, s.username, l.type, s.paddr, l.lmode, s.sid, s.serial#, l.id1, l.id2
from v$session s, v$lock l
where s.sid = l.sid)ls
where o.object_id = ls.id1
and o.owner <> 'SYS'
order by o.owner, o.object_name;
SELECT /*+ rule */ s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser,
utl_inaddr.get_host_address AS host,
sys_context('USERENV', 'IP_ADDRESS') AS LOCAL
FROM v$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT Null
--kill session语句
alter system kill session '50,492';
当session是active的时候,alter system kill session 只是将session标识为killed或者pseudo状态,并不会释放session持有的资源,所以我们在执行完alter system kill session 后,看会话还是一直存在。这种情况下可以使用 immediate选项,强制立即Kill会话,如下:
alter system kill session '50,492' immediate;
--批量kill某个用户的session语句
SELECT /*+ rule */
'ALTER system kill session ''' || s.sid || ',' || s.serial# ||''';'
FROM v$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT Null
and osuser='fd';
--以下几个为相关表
SELECT * FROM v$lock;
SELECT * FROM v$sqlarea;
SELECT * FROM v$session;
SELECT * FROM v$process ;
SELECT * FROM v$locked_object;
SELECT * FROM all_objects;
SELECT * FROM v$session_wait;
--1.查出锁定object的session的信息以及被锁定的object名
SELECT l.session_id sid, s.serial#, l.locked_mode,l.oracle_username,
l.os_user_name,s.machine, s.terminal, o.object_name, s.logon_time
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
ORDER BY sid, s.serial# ;
--2.查出锁定表的session的sid, serial#,os_user_name, machine name, terminal和执行的语句
--比上面那段多出sql_text和action
SELECT l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#,
l.os_user_name,s.machine, s.terminal,a.sql_text, a.action
FROM v$sqlarea a,v$session s, v$locked_object l
WHERE l.session_id = s.sid
AND s.prev_sql_addr = a.address
ORDER BY sid, s.serial#;
--3.查出锁定表的sid, serial#,os_user_name, machine_name, terminal,锁的type,mode
SELECT s.sid, s.serial#, s.username, s.schemaname, s.osuser, s.process, s.machine,
s.terminal, s.logon_time, l.type
FROM v$session s, v$lock l
WHERE s.sid = l.sid
AND s.username IS NOT NULL
ORDER BY sid;
这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,
任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。
杀锁命令
alter system kill session 'sid,serial#'
SELECT /*+ rule */ s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM v$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL
如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待
以下的语句可以查询到谁锁了表,而谁在等待。
以上查询结果是一个树状结构,如果有子节点,则表示有等待发生。
如果想知道锁用了哪个回滚段,还可以关联到V$rollname,其中xidusn就是回滚段的USN
col user_name format a10
col owner format a10
col object_name format a10
col object_type format a10
SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#
FROM v$locked_object l,dba_objects o,v$session s
WHERE l.object_id=o.object_id
AND l.session_id=s.sid
ORDER BY o.object_id,xidusn DESC
select ls.osuser os_user_name, -- 操作系统/用户名
ls.username user_name, -- 数据库用户名
decode(ls.type, 'RW', 'Row wait enqueue lock', 'UL', 'User supplied lock')lock_type, --锁的类型
o.object_name object, --被锁住的对象名
decode(ls.lmode, 1, null, 2, 'Row Share', 3, 'Row Exclusive', 4, 'Share', 5, 'Share Row Exclusive', 6, 'Exclusive', null)lock_mode, --锁的模式
o.owner, --对象的拥有者
ls.sid, --会话标识符
ls.serial# serial_num, --会话序列号
ls.id1, ls.id2,
ls.paddr --会话对应的进程地址
from sys.dba_objects o, ( select s.osuser, s.username, l.type, s.paddr, l.lmode, s.sid, s.serial#, l.id1, l.id2
from v$session s, v$lock l
where s.sid = l.sid)ls
where o.object_id = ls.id1
and o.owner <> 'SYS'
order by o.owner, o.object_name;
SELECT /*+ rule */ s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser,
utl_inaddr.get_host_address AS host,
sys_context('USERENV', 'IP_ADDRESS') AS LOCAL
FROM v$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT Null
--kill session语句
alter system kill session '50,492';
当session是active的时候,alter system kill session 只是将session标识为killed或者pseudo状态,并不会释放session持有的资源,所以我们在执行完alter system kill session 后,看会话还是一直存在。这种情况下可以使用 immediate选项,强制立即Kill会话,如下:
alter system kill session '50,492' immediate;
--批量kill某个用户的session语句
SELECT /*+ rule */
'ALTER system kill session ''' || s.sid || ',' || s.serial# ||''';'
FROM v$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT Null
and osuser='fd';
--以下几个为相关表
SELECT * FROM v$lock;
SELECT * FROM v$sqlarea;
SELECT * FROM v$session;
SELECT * FROM v$process ;
SELECT * FROM v$locked_object;
SELECT * FROM all_objects;
SELECT * FROM v$session_wait;
--1.查出锁定object的session的信息以及被锁定的object名
SELECT l.session_id sid, s.serial#, l.locked_mode,l.oracle_username,
l.os_user_name,s.machine, s.terminal, o.object_name, s.logon_time
FROM v$locked_object l, all_objects o, v$session s
WHERE l.object_id = o.object_id
AND l.session_id = s.sid
ORDER BY sid, s.serial# ;
--2.查出锁定表的session的sid, serial#,os_user_name, machine name, terminal和执行的语句
--比上面那段多出sql_text和action
SELECT l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#,
l.os_user_name,s.machine, s.terminal,a.sql_text, a.action
FROM v$sqlarea a,v$session s, v$locked_object l
WHERE l.session_id = s.sid
AND s.prev_sql_addr = a.address
ORDER BY sid, s.serial#;
--3.查出锁定表的sid, serial#,os_user_name, machine_name, terminal,锁的type,mode
SELECT s.sid, s.serial#, s.username, s.schemaname, s.osuser, s.process, s.machine,
s.terminal, s.logon_time, l.type
FROM v$session s, v$lock l
WHERE s.sid = l.sid
AND s.username IS NOT NULL
ORDER BY sid;
这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,
任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。
杀锁命令
alter system kill session 'sid,serial#'
SELECT /*+ rule */ s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM v$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL
如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待
以下的语句可以查询到谁锁了表,而谁在等待。
以上查询结果是一个树状结构,如果有子节点,则表示有等待发生。
如果想知道锁用了哪个回滚段,还可以关联到V$rollname,其中xidusn就是回滚段的USN
col user_name format a10
col owner format a10
col object_name format a10
col object_type format a10
SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#
FROM v$locked_object l,dba_objects o,v$session s
WHERE l.object_id=o.object_id
AND l.session_id=s.sid
ORDER BY o.object_id,xidusn DESC
发表评论
-
Oracle学习的知识点
2015-10-22 10:02 0Oracle学习的知识点 1、SQL、PL/SQL 2、Or ... -
索引讲解
2015-10-22 09:54 01.1 索引概念 索引是对 ... -
修改oracle为归档模式
2015-10-20 20:29 0修改oracle为归档模式 1,查看是否为归档模式 SQL ... -
SQLPLUS下显示CLOB中的内容
2015-10-20 20:29 0SQLPLUS下显示CLOB中的内容 create tabl ... -
捕捉批量写入错误信息-定位到某行
2015-10-20 20:29 0insert into select 批量加载出错解决方案 ... -
使用索引搜索字段为空的记录
2015-10-20 20:28 0使用索引搜索字段为空的记录 昨天下午时发现监控告警,数据库的 ... -
Oracle体系结构详细图解
2015-10-20 20:28 0Oracle体系结构详细图解 ... -
关于shared pool的深入探讨
2015-10-20 20:28 0关于shared pool的深入探讨(一) 关于shared ... -
表与索引的分析及索引重建(compute statistics,rebuild)
2015-10-20 20:27 0表与索引的分析及索引重建(compute statistics ... -
kill session会话不释放的问题
2015-10-20 20:26 0kill session会话不释放的问题 一般情况下,在杀一 ... -
动态性能视图 - v$mystat,v$sesstat,v$statname
2015-10-20 20:26 0动态性能视图 - v$mystat,v$sesstat,v$s ... -
Oracle直接路径加载--append的深度解析
2015-10-20 20:25 0Oracle直接路径加载--append的深度解析 ㈠ 直接 ... -
Oracle insert /*+ APPEND */原理解析
2015-10-20 20:25 0Oracle insert /*+ APPEND */原理解析 ... -
数据库容灾及数据中心(DC)解决方案
2015-10-20 20:25 0第一章 需求分析 1.1 系 ... -
数据库在线备份原理
2015-10-20 20:24 0Oracle数据库在线备份原理 1前言 本文从ORA ... -
DBMS_COMPARISON 数据对比
2015-10-20 20:24 0DBMS_COMPARISON 数据对比 参考: http: ... -
exp :EXP-00091 以及sqlplus乱码
2015-10-20 20:24 0exp :EXP-00091 以及sqlplus乱码 對一個 ... -
全文检索数据库环境配置
2015-10-20 20:23 0Oracle全文检索 1、检查O7_DICTIONARY_A ... -
IOT(Index Organized Table)简述
2015-10-20 20:23 0IOT(Index Organized Table)简述 对 ... -
45个非常有用的 Oracle 查询语句
2015-10-20 20:22 045个非常有用的 Oracle 查 ...
相关推荐
oracle锁表和解锁语句示例。
orale检查锁表,以及对表进行解锁的方式说明
数据库死锁的概念, 所谓死锁,是指两个会话,每个会话都持有另外一个会话想要的资源,因争夺资源而造成...对于锁死的会话,我们可以直接删掉该会话,等事物回滚完成,也可以找出锁死进程的spid,从服务器中删掉该进程。
oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁oracle解锁,死锁
oracle 解锁表,可以用此字句,对表进行解锁,但是要有相应的权限
oracle查询锁表和解锁。oracle在操作的过程中经常会遇到锁表的情况,一般能够用kill命令消除。
oracle解锁语句,常用解锁语句,经过测试实用;oracle解锁语句,常用解锁语句,经过测试实用。
Oracle数据库操作中,我们有时会用到锁表查询以及解锁和kill进程等操作,那么这些操作是怎么实现的呢?
B.SESSION_ID 锁表SESSION_ID, B.ORACLE_USERNAME 锁表用户名, decode(D.type, 'XR', 'NULL', 'RS', 'SS(Row-S)', 'CF', 'SS(Row-S)', 'TM', 'TABLE LOCK', 'PW', 'TABLE LOCK', 'TO', 'TABLE LOCK',...
ORACLE解除锁表,能够让被锁的表,强制解锁。
Oracle的锁表与解锁—oracle培训[参考].pdf
select object_name,session_id,os_user_name,Oracle_username,process,locked_mode,status from v$locked_object l, all_objects a where l.object_id=a.object_id;
针对oracle数据库 解锁方法 ,个人使用 希望大家能够有所帮助
如果你在用oracle数据中某个表时,突然不用了,有可能是某人把你的表给锁住了,现在说说在不知道谁锁的情况下,如何去解锁…… 文档中有详细说明……
锁表查看与解除 --查看锁表情况 select object_name,machine,s.sid,s.serial# from v$locked_object l,dba_objects o ,v$session s where l.object_id = o.object_id and l.session_id=s.sid;
oracle 查看锁表sql 及如何解锁,多给点分,为了下载别的资料。大家相互学习相互进步
ORACLE解锁方法的一点资料分享。
解锁oracle对象
ORACLE 如何查询被锁定表及如何解锁释放session