当前位置:首页>开发>正文

查看Oracle中是否有锁表的sql oracle 怎么查看数据被锁

2023-06-28 18:18:16 互联网 未知 开发

 查看Oracle中是否有锁表的sql oracle 怎么查看数据被锁

查看Oracle中是否有锁表的sql

查出锁定表的session的sid,serial#,os_user_name, machine name, terminal和执行的语句    
  SELECT l.session_id sid,
  s.serial#, l.locked_mode,
  l.oracle_username, s.user#,
  l.os_user_name,s.machine,
  s.terminal, a.action ,a.sql_text
  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#

oracle 怎么查看数据被锁

1.创建测试表,如下图。
createtabletest_lock(idnumber,valuevarchar2(200))

2.执行append语句;并且不做提交,insert/* append*/intotest_lockvalues(1,1)如下图。

3.再次执行清表语句,truncatetabletest_lock报锁表错误,如下图。

4.查看锁表语句,发现被锁表
selectb.object_name,t.*
fromv$locked_objectt,user_objectsb
wheret.object_id=b.object_id


注意事项:
简化数据:可以将复杂的查询创建为其他人可以使用的视图,而不必了解复杂的业务或逻辑关系。这简化并掩盖了视图用户数据的复杂性。



表结构设计的补充:在设计的系统才刚刚开始,大部分的程序直接访问数据表结构,但是随着业务的变化,系统更新,等等,引起了一些表结构不适用,这次修改系统的表结构太大,开发成本较高的影响。
这个时候可以创建一个视图来补充表结构设计,降低开发成本。程序可以通过查询视图直接获得它想要的数据。



添加安全性:视图可以向用户显示表中的指定字段,而不是向用户显示表中的所有字段。在实际开发中,视图通常作为提供数据的一种方式提供,并将只读权限提供给第三方以供查询使用。

oracle怎样查看死锁的表?

查看被锁的表:
select p.spid,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
解锁:
alter system kill session 146(其中146为锁住的进程号)

oracle中如何查询表被锁定状态

SELECT object_name, machine, s.sid, s.serial# 
FROM gv$locked_object l, dba_objects o, gv$session s 
WHERE l.object_id = o.object_id 
AND l.session_id = s.sid如果没有结果就是没有被锁定的,如果查询有结果,就说明此表被锁了。如图:

如何查询及解决锁表进程问题

查看锁表进程SQL语句1:
select sess.sid,
sess.serial#,
lo.oracle_username,
lo.os_user_name,
ao.object_name,
lo.locked_mode
from v$locked_object lo,
dba_objects ao,
v$session sess
where ao.object_id = lo.object_id and lo.session_id = sess.sid
杀掉锁表进程:
alter system kill session sid,serial#
如有记录则表示有lock,记录下SID和serial# ,将二者连接起来,就可以kill。如下:
alter system kill session 1458,15829
【注】以上两步,可以通过Oracle的管理控制台来执行。
3.如果利用上面的命令杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在os一级再杀死相应的进程(线程),首先执行下面的语句获得进程(线程)号: select spid, osuser, s.program from v$session s,v$process p where s.paddr=p.addr and s.sid=24 (24是上面的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

查看oracle锁的表名

下面3个语句是我经常使用来解决oracle锁问题的 -- 注意你的用户有没有权限问题
1. 查看被锁的表
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

2. 查看是哪个进程锁的
SELECT sid, serial#, username, osuser FROM v$session where osuser = tangpj

3. 杀掉这个进程 alter system kill session sid,serial#

最新文章