rac锁案例

环境:一套4节点rac环境
模拟:   instance4对表t进行锁定
       instance1对表t进行更新,需要获取实例4中的锁,然后处于等待状态。
           
此时,dba连接上instance2后,开始分析进行干涉。

instance 4,   session 1:

  1. SQL> conn / as sysdba
  2. Connected.
  3. SQL> select instance_name from v$instance;
  4. INSTANCE_NAME
  5. ----------------
  6. kevin4
  7. SQL> conn kevin
  8. Enter password:
  9. Connected.
  10. SQL> create table t (id number primary key,name varchar2(10));
  11. SQL> insert into t values (1,'kevin');
  12. SQL> insert into t values (2,'wind');
  13. SQL> commit;
  14. SQL> select * from t;
  15.         ID NAME
  16. ---------- ----------
  17.          1 kevin
  18.          2 wind
  19. SQL> select * from t for update; --锁表
  20.         ID NAME
  21. ---------- ----------
  22.          1 kevin
  23.          2 wind
  24. SQL>

instance 1, session 1:

  1. SQL> conn / as sysdba
  2. Connected.
  3. SQL> select instance_name from v$instance;

  4. INSTANCE_NAME
  5. ----------------
  6. kevin1

  7. SQL> conn kevin
  8. Enter password:
  9. Connected.
  10. SQL> select * from t;

  11.         ID NAME
  12. ---------- ----------
  13.          1 kevin
  14.          2 wind

  15. SQL> update t set name='chunfeng' where id=2;       --此更新操作会处于挂起,要等待实例4的锁。
  16.                                                                            

instance 2, session1:

发现该问题后,dba登陆系统开始排查。

  1. SQL> conn / as sysdba
  2. Connected.
  3. SQL> select instance_name from v$instance;

  4. INSTANCE_NAME
  5. ----------------
  6. kevin2

  7. SQL> select s.sid,s.serial#,s.event,q.sql_text
  8.   2 from v$session s,v$sql q
  9.   3 where s.sql_id=q.sql_id
  10.   4 and q.sql_text like 'update t set%';

  11. no rows selected

  12. SQL> 2
  13.   2* from v$session s,v$sql q
  14. SQL> c/v$session/gv$session/
  15. SQL> c/v$sql/gv$sql/
  16. SQL> l
  17.   1 select s.sid,s.serial#,s.event,q.sql_text
  18.   2 from gv$session s,gv$sql q
  19.   3 where s.sql_id=q.sql_id
  20.   4* and q.sql_text like 'update t set%'
  21. SQL> set linesize 200
  22. SQL> col event for a50
  23. SQL> col sql_text for a70
  24. SQL> /

  25. SID      SERIAL#   EVENT                            SQL_TEXT
  26. -------- --------- -------------------------------- ----------------------------------------------------------------------
  27.    54           11 enq: TX - row lock contention    update t set name='chunfeng' where id=2
说明:根据执行语句,找到等待锁的session。

  1. SQL> select sid,inst_id,blocking_instance,blocking_session from gv$session where sid=54;

  2.    SID   INST_ID  BLOCKING_INSTANCE      BLOCKING_SESSION
  3. ------ ---------- ---------------------- --------------------------
  4.     54          1                  4                  34
  5.     54          2
说明,根据查询出的结果可知,实例1中sid为54的session在等待实例4中sid为34session的锁。
深入查询以下:
  1. SQL> select type,id1,id2,lmode,request from gv$lock where sid=54;

  2. TY          ID1         ID2           LMODE       REQUEST
  3. ----- ------------- ------------- ----------- ---------------
  4. TM           87477     0               3              0
  5. AE             100     0               4              0
  6. TX         2162702    27               0              6

  7. SQL> select inst_id,sid,type,lmode,request from gv$lock where id1=2162702 and id2=27;

  8. INST_ID            SID     TY    LMODE     REQUEST
  9. ---------- ------------- ---- ---------- -------------
  10.          1         54      TX      0           6
  11.          4         34      TX      6           0
可以清楚的看到,实例4持有,实例1 请求。

  1. SQL> select sid,serial# from gv$session where inst_id=4 and sid=34;

  2.      SID      SERIAL#
  3. ---------- ----------
  4.       34        13

  5. SQL> alter system kill session '34,13,@4';        --kill掉实例4中sid为34,serial为13的会话,11g及以后的版本可以用该语法。

  6. System altered.

  7. SQL>
根据实际情况判断是否立即kill掉该session.如果不,可以通过paddr与v$process中addr绑定,在v$process查寻到,连接机器名,应用名,用户等信息做进一步定位。

会话34,13kill后,instance1中session1得到锁后执行成功。
  1. SQL> update t set name='chunfeng' where id=2;

  2. 1 row updated.

  3. SQL>

感悟:
        单实例与rac多实例,处理上思路一样,但是会增加一些集群特性,比如kill session需要指定kill哪一个实例的,不然很可能kill错了,而单实例不需要考虑这个问题。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30223222/viewspace-2136867/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30223222/viewspace-2136867/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值