壹 、用dba权限的用户查看数据库都有如何锁,但直接从未执行成功

 

当某些数据库用户在数据库中插入、更新、删除一个表的数据,大概扩大二个表的主键时依旧表的目录时,常常会出现ora-00054:resource
busy and acquire with nowait specified那样的失实。

死锁的法则:当对于数据库有些表的某一列做立异或删除等操作,执行达成后该条语句不付出,另一条对于这一列数据做立异操作的话语在推行的时候就会处在等候状态,此时的场景是那条语句一向在履行,但一向尚未实施成功,也从没报错。

珍视是因为有工作正在履行(或然业务已经被锁),全数导致执行不成功。

Oracle里锁有以下二种格局: 

一 、用dba权限的用户查看数据库都有啥样锁

*  0:none 
  1:null 空 
  2:Row-S 行共享(KugaS):共享表锁 
  3:Row-X 行专用(LANDX):用于行的修改 
  4:Share 共享锁(S):阻止其他DML操作 
  5:S/Row-X 共享行专用(S奥迪Q3X):阻止其他事情操作 
  6:exclusive 专用(X):独立访问使用 
   
数字越大锁级别越高, 影响的操作越多。 
诚如的询问语句如select … from … ;是低于2的锁,
有时会在v$locked_object出现。 
   
  select … from … for update; 是2的锁。 
   
当对话使用for update子串打开叁个游标时, 
装有再次来到集中的多少行都将远在行级(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语句:*

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;

  select object_id,session_id,locked_mode from v$locked_object;

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

  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;

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

  假若有深切出现的一列,或然是从未有过自由的锁。 
   
  我们得以用下边SQL语句杀掉长时间没有自由非平常的锁:

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;

  alter system kill session ‘sid,serial#’;

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

  假设现身了锁的难题, 有些DML操作大概等待很久没有反应。 
   
  当你接纳的是一贯连接数据库的方法, 
  也并非用OS系统命令 $kill process_num 或者 $kill -9
process_num来终止用户连接, 
  因为二个用户进度只怕发生三个之上的锁,
杀OS进程并无法彻底清除锁的难点。 
   
  记得在数据库级别用alter system kill session
‘sid,serial#’;杀掉不健康的锁。

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

当事情获得行锁后,此业务也将自动获得该行的表锁(共享锁),以预防其余事情进行DDL语句影响记录行的立异。事务也能够在开展进程中取得共享锁或排它锁,唯有当事情展现应用LOCK
TABLE语句突显的定义3个排它锁时,事务才会获得表上的排它锁,也可应用LOCK
TABLE展现的定义一个表级的共享锁
,所以行锁的时候小编还的拿个表锁,免得其余人该了本身的表结构依然去除了自家的表。

肆 、那样就能够推行此外的事务sql语句了

 

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

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

 

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

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

 

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

–查出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#;

结果不详

 

ORA-00031: session marked for kill

–查询什么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#;

局地ORACLE中的进度被杀掉后,状态被置为”killed”,可是锁定的财富十分长日子不自由,有时实在无法,只可以重启数据库。未来提供一种艺术消除那种题材,那正是在ORACLE中杀不掉的,在OS一流再杀。

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

 

 

1.上边包车型大巴语句用来询问哪些对象被锁:

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

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 username,lockwait,status,machine,program from v$session where sid
in
(select session_id from v$locked_object)

2.底下的语句用来杀死二个进程: alter system kill session ‘24,111’;
(在那之中24,111各自是地点查询出的sid,serial#)

 

【注】以上两步,可以通过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)

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

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

内部sid用死锁的sid替换: exit

ORA-00031: session marked for kill

ps -ef|grep spid

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.

中间spid是那些进度的进程号,kill掉那几个Oracle进程

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.

 

 

kill -9 12345

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

相关文章