壹 、用dba权限的用户查看数据库都有如何锁,此时的风貌是那条语句一直在执行

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

① 、用dba权限的用户查看数据库都有如何锁

*  0:none 
  1:null 空 
  2:Row-S 行共享(OdysseyS):共享表锁 
  3:Row-X 行专用(凯雷德X):用于行的改动 
  4:Share 共享锁(S):阻止其余DML操作 
  5:S/Row-X 共享行专用(S奇骏X):阻止别的业务操作 
  6:exclusive 专用(X):独立访问使用 
   
数字越大锁级别越高, 影响的操作越多。 
一般的查询语句如select … from … ;是自愧不及2的锁,
有时会在v$locked_object出现。 
   
  select … from … for update; 是2的锁。 
   
当对话使用for update子串打开2个游标时, 
怀有再次回到集中的数目行都将处于行级(Row-X)独占式锁定, 
任何对象只可以查询这一个数量行,不可能开始展览update、delete或select…for
update操作。 
   
  insert / update / delete … ; 是3的锁。 
   
  没有commit之前插入同样的一条记录会没有影响, 
  因为后多少个3的锁会一直等候上一个3的锁,
大家务必自由掉上三个才能继承做事。 
   
  创制索引的时候也会发生3,4级别的锁。 
   
  locked_mode为2,3,4不影响DML(insert,delete,update,select)操作, 
  但DDL(alter,drop等)操作会指示ora-00054荒谬。 
   
  有主外键约束时 update / delete … ; 或许会生出4,5的锁。 
   
  DDL语句时是6的锁。 
   
  以DBA角色, 查看当前数据Curry锁的情形能够用如下SQL语句:*

Action: No action is required for the session to be killed, but further
executions of the ALTER SYSTEM KILL SESSION command on this session may
cause the session to be killed sooner.

ps -ef|grep spid

一对ORACLE中的进度被杀掉后,状态被置为”killed”,不过锁定的能源相当短日子不自由,有时实在不能够,只能重启数据库。现在提供一种方法化解那种难点,那便是在ORACLE中杀不掉的,在OS拔尖再杀。

–查出oracle当前的被锁对象
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#;

 

  即使出现了锁的难题, 有个别DML操作恐怕等待很久没有反应。 
   
  当您使用的是向来连接数据库的法子, 
  也并非用OS系统命令 $kill process_num 或者 $kill -9
process_num来终止用户连接, 
  因为二个用户进度大概发生一个上述的锁,
杀OS进度并无法彻底清除锁的题材。 
   
  记得在数据库级别用alter system kill session
‘sid,serial#’;杀掉不健康的锁。

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;

死锁的规律:当对于数据库有个别表的某一列做立异或删除等操作,执行完成后该条语句不提交,另一条对于这一列数据做革新操作的言语在推行的时候就会处于等候情状,此时的光景是那条语句一直在执行,但一向没有实行成功,也从没报错。

select sql_text from v$session a,v$sqltext_with_newlines b   where
DECODE(a.sql_hash_value, 0, prev_hash_value,
sql_hash_value)=b.hash_value   and a.sid=&sid order by piece;

 

1.底下的语句用来查询哪些对象被锁:

select username,lockwait,status,machine,program from v$session where sid
in
(select session_id from v$locked_object)

查出来的sql,如: begin :id :=
sys.dbms_transaction.local_transaction_id; end;

里面spid是这几个进度的长河号,kill掉这些Oracle进度

2.上面的语句用来杀死贰个进度: alter system kill session ‘24,111’;
(当中24,1拾叁分头是上面查询出的sid,serial#)

 

如:testuser 339 13545 二〇一〇-3-5 17:40:05
知道被锁的用户testuser,sid为339,serial#为13545

–查询什么SQL引起的锁表
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#;

当某些数据库用户在数据库中插入、更新、删除叁个表的数目,或然扩充一个表的主键时照旧表的目录时,平时会并发ora-00054:resource
busy and acquire with nowait specified那样的荒唐。

 

alter session set events ‘immediate trace name flush_cache level 1’;

倘若还不能缓解:

Cause: The session specified in an ALTER SYSTEM KILL SESSION command
cannot be killed immediately (because it is rolling back or blocked on a
network operation), but it has been marked for kill. This means it will
be killed as soon as possible after its current uninterruptible
operation is done.

Oracle里锁有以下二种方式: 

4.在OS上杀死那么些进度(线程):
1)在unix上,用root身份执行命令: #kill -9
12345(即第一步查询出的spid)
2)在windows(unix也适用)用orakill杀死线程,
orakill是oracle提供的三个可执行命令,语法为: orakill sid thread
其中:
sid:表示要干掉的历程属于的实例名
thread:是要杀死的线程号,即第①步查询出的spid。
例:c:>orakill orcl 12345

当事情得到行锁后,此业务也将活动获得该行的表锁(共享锁),以制止别的工作举行DDL语句影响记录行的更新。事务也得以在进行进程中得到共享锁或排它锁,唯有当事情展现采取LOCK
TABLE语句展现的定义几个排它锁时,事务才会博得表上的排它锁,也可采纳LOCK
TABLE突显的定义1个表级的共享锁
,所以行锁的时候小编还的拿个表锁,免得别的人该了本身的表结构依旧去除了本人的表。

重在是因为有事情正在执行(或许业务已经被锁),全体导致执行不成功。

  select object_id,session_id,locked_mode from v$locked_object;

肆 、那样就足以实施其它的作业sql语句了

 

kill -9 12345

里头sid用死锁的sid替换: exit

如扩展表的主键: alter table test   add constraint PK_test primary key
(test_NO);

 

 

–释放SESSION SQL:
–alter system kill session ‘sid, serial#’;
如:  ALTER system kill session ’23, 1647′;

http://www.cnblogs.com/chuanzifan/archive/2012/05/26/2519695.html

 

ORA-00031: session marked for kill

 

2、依据sid查看具体的sql语句,如果sql不重要,可以kill

  alter system kill session ‘sid,serial#’;

 

–kill掉当前的锁对象能够为
alter system kill session ‘sid, s.serial#‘;

【注】以上两步,能够由此Oracle的管控台来执行。

–查询死锁,并可以看出死锁的机器是那一台

结果不详

  若是有一劳永逸现身的一列,恐怕是从未自由的锁。 
   
  大家能够用上面SQL语句杀掉长期并未自由非不奇怪的锁:

ORA-00031: session marked for kill

select pro.spid from v$session ses,v$process pro where ses.sid=XX and
ses.paddr=pro.addr;

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

锁表查询SQL
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;

若提示:ORA-00030: User session ID does not exist

3.比方使用方面的指令杀死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)

3、kill该事务 alter system kill session ‘339,13545’;

相关文章