• Oracle锁表处理


    最近系统连续出现好几次锁表,昨晚又发生一次锁表,11点钟跑到客户现场,进过跟踪发现导致这次锁表的机器和上一次是同一台,花了近半小时解锁。之后到科室找到那台机器看看情况,发现那台机器速度超慢,保存一份病历需要几十秒钟,原因应该就在这里了。

    分析原因:保存病历时发生超时,Nhibernate在发生超时时事务需要进行回滚,但是回滚的时候也发生了异常,没有回滚成功,导致了锁表。

    处理方法:a、先解决该机器速度慢的问题,配置太差的机器要求医院进行硬件升级;b、验证事务回滚的时候是否有可能发生回滚异常。

    先贴出现场处理死锁的步骤。

    另外:有时候通过PL/SQL执行kill session可能仍然无法解锁,此时需要登陆到Oracle服务器将进程kill掉才行。

    1、生成Kill Session语句

    select 'alter system kill session ''' || SID ||',' || SERIAL# || ''';' from

    (

    select distinct a.sid, a.Serial#, status, machine, LOCKWAIT, logon_time

      from v$session a, v$locked_object b

     where (a.status = 'ACTIVE' or a.status = 'INACTIVE')

       and a.sid = b.session_id

       and b.ORACLE_USERNAME='XYHISTEST'--加上用户名是避免把其他系统的会话也关闭,以免伤及无辜

    )

    2、批量执行第一步生成的语句

    alter system kill session 'sid,serial#';

    --alter system kill session '6976,33967';

    3、查询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# ;

    /*或者

    select s.SID, s.OSUSER, p.spid as OSPID, s.MACHINE, s.TERMINAL, s.PROGRAM

      from v$session s, v$process p

     where s.sid = 6  --session_id

       and s.paddr = p.addr;

    */

    4、查询是执行何sql语句导致锁表的

    select b.sql_text

      from v$session a, v$sql b

     where a.sid = 6 --session_id

       and a.SQL_ADDRESS = b.ADDRESS(+);

     /*--或者

    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#;

    */

     

  • 相关阅读:
    js中$
    js中 javascript:void(0) 用法详解
    Git关于pull,commit,push的总结
    k8s记录-docker-compose脚本参考
    k8s记录-docker部署mysql和nginx
    Linux记录-ssh批量双向无密码登录
    Linux记录-ssh无密码执行脚本
    Linux记录-一些常用操作
    k8s记录-Dockerfile详解
    k8s记录-kubectl常用命令
  • 原文地址:https://www.cnblogs.com/hangwq/p/3527969.html
Copyright © 2020-2023  润新知