Archive

Posts Tagged ‘lock’

关于Oracle几种锁管理的汇总

March 8th, 2009 No comments

Oracle里锁有以下几种模式:
    0:none
    1:null 空
    2:Row-S 行共享(RS):共享表锁,sub share
    3:Row-X 行独占(RX):用于行的修改,sub exclusive
    4:Share 共享锁(S):阻止其他DML操作,share
    5:S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive
    6:exclusive 独占(X):独立访问使用,exclusive
   
    数字越大锁级别越高, 影响的操作越多。
   
    1级锁有:Select,有时会在v$locked_object出现。
    2级锁有:Select for update,Lock For Update,Lock Row Share
    select for update当对话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询这些数据行,不能进行update、delete或select for update操作。
    3级锁有:Insert, Update, Delete, Lock Row Exclusive
    没有commit之前插入同样的一条记录会没有反应, 因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。
    4级锁有:Create Index, Lock Share
    locked_mode为2,3,4不影响DML(insert,delete,update,select)操作, 但DDL(alter,drop等)操作会提示ora-00054错误。
    00054, 00000, “resource busy and acquire with NOWAIT specified”
    // *Cause: Resource interested is busy.
    // *Action: Retry if necessary.
    5级锁有:Lock Share Row Exclusive
    具体来讲有主外键约束时update / delete … ; 可能会产生4,5的锁。
    6级锁有:Alter table, Drop table, Drop Index, Truncate table, Lock Exclusive
   
    以DBA角色, 查看当前数据库里锁的情况可以用如下SQL语句:

col owner for a12
    col object_name for a16
    select b.owner,b.object_name,l.session_id,l.locked_mode
    from v$locked_object l, dba_objects b
    where b.object_id=l.object_id

    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语句杀掉长期没有释放非正常的锁:
   
    alter system kill session ‘sid,serial#’;
   
    如果出现了锁的问题, 某个DML操作可能等待很久没有反应。
   
    当你采用的是直接连接数据库的方式,也不要用OS系统命令 $kill process_num 或者 $kill -9 process_num来终止用户连接,因为一个用户进程可能产生一个以上的锁, 杀OS进程并不能彻底清除锁的问题。

Categories: lock Tags:

通过几个步骤有效关闭Oracle死锁进程,和释放状态为killed的session

March 8th, 2009 No comments

有效关闭Oracle死锁进程的具体步骤:

  1.查哪个过程被锁

  查V$DB_OBJECT_CACHE视图:

  SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER=’过程的所属用户’ AND LOCKS!=’0′;

 

V$DB_OBJECT_CACHE

This view displays database objects that are cached in the library cache. Objects include tables, indexes, clusters, synonym definitions, PL/SQL procedures and packages, and triggers.

Column Datatype Description
OWNER VARCHAR2(64) Owner of the object
NAME VARCHAR2(1000) Name of the object
DB_LINK VARCHAR2(64) Database link name, if any
NAMESPACE VARCHAR2(28) Library cache namespace of the object: TABLE/PROCEDURE, BODY, TRIGGER, INDEX, CLUSTER, OBJECT
TYPE VARCHAR2(28) Type of the object: INDEX, TABLE, CLUSTER, VIEW, SET, SYNONYM, SEQUENCE, PROCEDURE, FUNCTION, PACKAGE, PACKAGE BODY, TRIGGER, CLASS, OBJECT, USER, DBLINK
SHARABLE_MEM NUMBER Amount of sharable memory in the shared pool consumed by the object
LOADS NUMBER Number of times the object has been loaded. This count also increases when an object has been invalidated.
EXECUTIONS NUMBER Not usedSee Also: “V$SQLAREA” to see actual execution counts
LOCKS NUMBER Number of users currently locking this object
PINS NUMBER Number of users currently pinning this object
KEPT VARCHAR2(3) (YES | NO) Depends on whether this object has been “kept” (permanently pinned in memory) with the PL/SQL procedure DBMS_SHARED_POOL.KEEP
CHILD_LATCH NUMBER Child latch number that is protecting the object
INVALIDATIONS NUMBER Total number of times objects in the namespace were marked invalid because a dependent object was modified

 

  2. 查是哪一个SID,通过SID可知道是哪个SESSION

  查V$Access视图:

  SELECT * FROM V$ACCESS WHERE OWNER=’过程的所属用户’ AND NAME=’刚才查到的过程名’;

 

V$ACCESS

V$ACCESS displays information about locks that are currently imposed on library cache objects. The locks are imposed to ensure that they are not aged out of the library cache while they are required for SQL execution.

Column Datatype Description
SID NUMBER Session number that is accessing an object
OWNER VARCHAR2(64) Owner of the object
OBJECT VARCHAR2(1000) Name of the object
TYPE VARCHAR2(24) Type identifier for the object

 

  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)。

 

在日常的学习和工作中,我们经常会遇到一个问题是:在Oracle中,状态已被置为”killed“的进程长时间锁定系统资源,不释放,有一个比重启数据库更好的方法,就是在操作系统级强行杀掉那些进程。

 

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

 

col object_name for a30
col machine for a20
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;

 

 

V$LOCKED_OBJECT

This view lists all locks acquired by every transaction on the system. It shows which sessions are holding DML locks (that is, TM-type enqueues) on what objects and in what mode.

Column Datatype Description
XIDUSN NUMBER Undo segment number
XIDSLOT NUMBER Slot number
XIDSQN NUMBER Sequence number
OBJECT_ID NUMBER Object ID being locked
SESSION_ID NUMBER Session ID
ORACLE_USERNAME VARCHAR2(30) Oracle user name
OS_USER_NAME VARCHAR2(30) OS user name
PROCESS VARCHAR2(12) OS process ID
LOCKED_MODE NUMBER Lock mode

2.下面的语句用来杀死一个进程:

 

alter system kill session '42,21993';
(其中24,111分别是上面查询出的sid,serial#)

 

 

 

可以用如下查询批量得到上面类似的语句:

 

select 'alter system kill session '''   ||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

 

;

 

3.如果利用上面的命令杀死一个进程后,进程状态被置为 “killed”, 但是锁定的资源很长时间没有被释放,那么可以在os一级再杀死相应的进程(线程),首先获得进程(线程)号:

 

select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=#sid; (#sid是上面的sid)

 

4.在操作系统中杀掉相应的进程(线程):

(1)在Linux上,用root身份执行命令:

kill -9 12345(12345是第3步查询出的spid)

(2)在Windows 用orakill杀死线程,orakill是oracle提供的一个可执行命令,语法为:orakill sid thread

其中:

sid:表示要杀死的进程属于的实例名

thread:是要杀掉的线程号,即第3步查询出的spid。

例:c:>orakill orcl 12345

注:可以写一个组合查询的存储过程来自动执行上述四步操作,方便地杀光所有不自动释放资源的进程,但一般情况下不推荐这样做,毕竟在系统中用root用户kill进程本身就是有一定的风险的!

查找holder的操作

February 6th, 2009 No comments

工作中经常遇到锁的问题,但是具体holder到底做了那些操作比较困难,这里给出一个使用logmnr查找holder操作的过程
查找holder做过那些操作
SELECT decode(request,0,’holder:’,'waiter:’)||sid sid,id1,id2,lmode,request,type

FROM v$lock

WHERE (id1,id2,type) IN

(SELECT id1,id2,type

FROM v$lock

WHERE request>0)

ORDER BY id1,request;
SID ID1 ID2 LMODE REQUEST TYPE

holder:143 65542 1645 6 0 TX

waiter:139 65542 1645 0 6 TX

waiter:142 65542 1645 0 6 TX

waiter:144 65542 1645 0 6 TX
假设出现了上述锁,针对这种情况,做下列操作
SQL> select group#,thread#,status from v$Log;
GROUP# THREAD# STATUS

———- ———- —————-

1 1 CURRENT

2 1 INACTIVE

3 1 ACTIVE

SQL> alter system switch logfile;

SQL> select group#,thread#,status from v$Log;
GROUP# THREAD# STATUS

———- ———- —————-

1 1 ACTIVE

2 1 CURRENT

3 1 INACTIVE
SQL> archive log list;

Database log mode Archive Mode

Automatic archival Enabled

Archive destination c:archstdchicago

Oldest online log sequence 318

Next log sequence to archive 320

Current log sequence 320

 

EXECUTE DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => ‘C:archchicagoARC00319_0664534646.001′,OPTIONS => dbms_logmnr.NEW);

execute DBMS_LOGMNR.START_LOGMNR(options =>dbms_logmnr.dict_from_online_catalog);

create table system.test_logmnr as select * from v$logmnr_contents;

execute DBMS_LOGMNR.END_LOGMNR;
select * from system.test_logmnr t where t.session# =143;

SCN CSCN TIMESTAMP COMMIT_TIMESTAMP THREAD# LOG_ID XIDUSN XIDSLT XIDSQN PXIDUSN PXIDSLT PXIDSQN RBASQN RBABLK RBABYTE UBAFIL UBABLK UBAREC UBASQN ABS_FILE# REL_FILE# DATA_BLK# DATA_OBJ# DATA_OBJD# SEG_OWNER SEG_NAME TABLE_NAME SEG_TYPE SEG_TYPE_NAME TABLE_SPACE ROW_ID SESSION# SERIAL# USERNAME SESSION_INFO TX_NAME ROLLBACK OPERATION OPERATION_CODE SQL_REDO SQL_UNDO RS_ID SEQUENCE# SSN CSF INFO STATUS REDO_VALUE UNDO_VALUE SQL_COLUMN_TYPE SQL_COLUMN_NAME REDO_LENGTH REDO_OFFSET UNDO_LENGTH UNDO_OFFSET DATA_OBJV# SAFE_RESUME_SCN XID PXID AUDIT_SESSIONID

4198405 2009-1-7 17:33:52 1 319 1 6 1645 1 6 1645 319 1569 16 2 0 0 0 0 0 0 0 0 0 AAAAAAAAAAAAAAAAAA 143 55 TEST login_username=TEST client_info= OS_username=pepeli-cnpepeli Machine_name=CN-ORACLEpepeli-cn OS_terminal=pepeli-cn OS_process_id=4324:3100 OS_program_name=plsqldev.exe 0 START 6 set transaction read write; 0x00013f.00000621.0010 1 0 0 0 4396 4397 0 0 0 0 0 010006006D060000 010006006D060000 461199

4198405 2009-1-7 17:33:52 1 319 1 6 1645 1 6 1645 319 1569 16 2 0 0 0 2 4 20 52197 52197 TEST PERSON PERSON 2 TABLE USERS AAAMvlAAEAAAAAUAAA 143 55 TEST login_username=TEST client_info= OS_username=pepeli-cnpepeli Machine_name=CN-ORACLEpepeli-cn OS_terminal=pepeli-cn OS_process_id=4324:3100 OS_program_name=plsqldev.exe 0 UPDATE 3 update “TEST”.”PERSON” set “ID” = ’201′ where “ID” = ’1′ and “NAME” = ‘aa’ and ROWID = ‘AAAMvlAAEAAAAAUAAA’; update “TEST”.”PERSON” set “ID” = ’1′ where “ID” = ’201′ and “NAME” = ‘aa’ and ROWID = ‘AAAMvlAAEAAAAAUAAA’; 0x00013f.00000621.0010 1 0 0 0 4398 4399 0 0 0 0 1 010006006D060000 010006006D060000 461199

Categories: lock, oracle Tags: , ,

Videos, Slideshows and Podcasts by Cincopa Wordpress Plugin