• oracle 锁表的处理。


    最近系统每天经常锁表,进程杀死后,很快再次锁住这个表。

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

    另外:有时候通过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'--加上用户名是避免把其他系统的会话也关闭,以免伤及无辜

    );

    或者

    /*
    select sess.sid,
    sess.serial#,
    lo.oracle_username,
    lo.os_user_name,
    ao.object_name,
    lo.locked_mode,
    sql.sql_text,
    'alter system kill session ''' || SID ||',' || SERIAL# || ''';'

    from v$locked_object lo,
    dba_objects ao,
    v$session sess,
    v$sql sql
    where ao.object_id = lo.object_id and lo.session_id = sess.sid and sql.ADDRESS(+)= sess.SQL_ADDRESS;

    -- 这个sql查询结果包含了sid, serial#,可以用来kill 被锁死的session。

    -- sql_text 字段可以知道导致死锁的sql。

    --最后一个字段是直接可以执行的杀死进程的sql语句。

    */

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

    alter system kill session 'sid,serial#';

    --alter system kill session '3656,755';

    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 = 5864--session_id

       and s.paddr = p.addr;

    */

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

    select b.sql_text

      from v$session a, v$sql b

     where a.sid =589 --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#;

    */

  • 相关阅读:
    学习总结------用JDBC连接MySQL
    MySQL基础语法------增删改查
    2、一、Introduction(入门):1、Application Fundamentals(应用程序基础)
    1、一、Introduction(入门): 0、Introduction to Android(引进到Android)
    小算法:合并两个有序数组,合并之后仍然有序
    小算法:求一个数的乘方
    标准SQL资料整理
    Android 4.0以上BlurMaskFilter效果无效
    Android反编译工具介绍与简单实用方法
    数据结构和算法笔记1 算法的定义,特性,设计要求
  • 原文地址:https://www.cnblogs.com/gaochsh/p/5435306.html
Copyright © 2020-2023  润新知