`

查询oracle数据库进程锁

 
阅读更多
DECLARE

    TYPE my_session_t IS TABLE OF v$SESSION%ROWTYPE;

    lock_others_session my_session_t;

    be_locked_session my_session_t;

    ls_output varchar2(255) :='';

    TYPE lock_others_t IS TABLE OF v$lock%ROWTYPE;

    lock_others lock_others_t;

    be_locked lock_others_t;

 BEGIN

    SELECT * BULK COLLECT INTO  lock_others FROM v$lock WHERE block=1;

    IF  lock_others.COUNT<1 THEN

        DBMS_OUTPUT.PUT_LINE('目前数据库中没有被其他进程锁住的进程!');

    ELSE

        DBMS_OUTPUT.PUT_LINE('目前数据库中共有' || TO_CHAR( lock_others.COUNT) || '个进程锁住别的进程!');  

        DBMS_OUTPUT.PUT_LINE('');

        FOR i IN 1 ..  lock_others.COUNT

        LOOP

            SELECT * BULK COLLECT INTO lock_others_session FROM v$session WHERE sid=lock_others(i).sid;

            DBMS_OUTPUT.PUT_LINE('-----------------------------------------------------------------------------------------------------------------');

            DBMS_OUTPUT.PUT_LINE('第' || i || '个锁的进程信息:');

            ls_output := 'SID为' || lock_others_session(1).sid;

            ls_output := ls_output || '  ,登陆ORACLE帐号为 ' || lock_others_session(1).username;

            ls_output := ls_output || '  ,登陆操作系统帐号为 ' || lock_others_session(1).osuser;

            ls_output := ls_output || '  ,计算机名为 ' || lock_others_session(1).machine || ' ,';

            DBMS_OUTPUT.PUT_LINE( ls_output);

            ls_output := ' 正在进行的操作为 ' || TO_NCHAR(lock_others_session(1).action); --使用TO_NCHAR来防止出现ORA-29275异常

            ls_output := ls_output || ' 正在运行的模块为 ' || lock_others_session(1).module;

            DBMS_OUTPUT.PUT_LINE( ls_output);

            BEGIN

                SELECT sql_text INTO ls_output FROM v$sqltext 

                WHERE hashvalue=lock_others_session(1).sql_hash_value and piece=0;

                ls_output := '准备执行的SQL语句为 ' || ls_output; --使用TO_NCHAR来防止出现ORA-29275异常

                DBMS_OUTPUT.PUT_LINE( ls_output);

            EXCEPTION

                WHEN OTHERS THEN

                NULL;

            END;

            DBMS_OUTPUT.PUT_LINE('如果要杀掉该锁,请执行语句: ALTER SYSTEM KILL SESSION ''' 

            || lock_others_session(1).sid || ',' || lock_others_session(1).serial# || ''';');

            SELECT * BULK COLLECT INTO be_locked FROM v$lock WHERE id1=lock_others(i).id1 and id2= lock_others(i).id2 and request > 0;

            DBMS_OUTPUT.PUT_LINE('');

            DBMS_OUTPUT.PUT_LINE('锁住了如下' || TO_CHAR(be_locked.COUNT) || '个进程:');

            FOR j IN 1 .. be_locked.COUNT

            LOOP

                SELECT * BULK COLLECT INTO be_locked_session FROM v$session 

                WHERE sid=be_locked(j).sid;

                DBMS_OUTPUT.PUT_LINE('***********************************************');

                DBMS_OUTPUT.PUT_LINE('第' || j || '个被锁住的进程信息:');

                ls_output := 'SID为' || be_locked_session(1).sid;

                ls_output := ls_output || '  ,登陆ORACLE帐号为 ' || be_locked_session(1).username;

                ls_output := ls_output || '  ,登陆操作系统帐号为 ' || be_locked_session(1).osuser;

                ls_output := ls_output || '  ,计算机名为 ' || be_locked_session(1).machine || ' ,';

                DBMS_OUTPUT.PUT_LINE( ls_output);

                ls_output := ' 正在进行的操作为 ' || TO_NCHAR(be_locked_session(1).action) || ' ,'; --使用TO_NCHAR来防止出现ORA-29275异常

                ls_output := ls_output || ' 正在运行的模块为 ' || be_locked_session(1).module || ' ,';

                DBMS_OUTPUT.PUT_LINE( ls_output);               

                BEGIN

                    SELECT sql_text INTO ls_output FROM v$sqltext 

                    WHERE hashvalue=be_locked_session(1).sql_hash_value and piece=0;

                    ls_output := '正在执行的SQL语句为 ' || ls_output; --使用TO_NCHAR来防止出现ORA-29275异常

                    DBMS_OUTPUT.PUT_LINE( ls_output);

                EXCEPTION

                    WHEN OTHERS THEN

                        NULL;

                END;

            END LOOP;

            DBMS_OUTPUT.PUT_LINE('-----------------------------------------------------------------------------------------------------------------');

            DBMS_OUTPUT.PUT_LINE('');

        END LOOP;

    END IF;

EXCEPTION

    WHEN OTHERS THEN --通用显示错误信息

        DBMS_OUTPUT.PUT_LINE(SQLERRM ((-1) * SQLCODE));

END;

 

 

 

感谢原创。。。。

分享到:
评论

相关推荐

    oracle数据库 详细课件

    Oracle数据库是全球最广泛使用的商业关系型数据库管理系统之一,它由甲骨文公司(Oracle Corporation)开发和维护。本详细课件将引导你逐步了解Oracle数据库的基础知识,为你的入门之旅提供全面指导。 1. **Oracle...

    oracle数据库调优配置

    ### Oracle数据库调优配置:两种方案详解 在企业级应用中,Oracle数据库因其稳定性和高效性而被广泛采用。然而,随着数据量的急剧增长和业务需求的不断变化,优化Oracle数据库性能成为确保系统高效运行的关键。本文...

    Oracle数据库维护手册

    《Oracle数据库维护手册》是为相关技术人员提供的一份详尽指南,涵盖了Oracle数据库日常运行维护的各个方面。手册的目的是帮助运维人员高效、准确地管理Oracle数据库系统,确保其稳定、安全运行。 2.1 数据库启动与...

    ORACLE 数据库入门.ppt

    - **实例(Instance)**:实例是由SGA和一组后台进程组成的,是Oracle数据库运行的基础。启动Oracle数据库前必须先启动实例,实例可以比喻为汽车的引擎,驱动数据库的运行。 - **后台进程**:Oracle包含多个后台...

    oracle数据库中的锁机制

    ### Oracle数据库中的锁机制 #### 引言 在Oracle数据库中,锁机制是确保数据一致性和并发控制的关键组件。本文将深入探讨Oracle数据库中的锁如何工作,以及它们在多用户环境中如何防止数据冲突,保障事务的正确...

    oracle数据库使用经验word

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其在企业级应用中占据着重要的地位。这份"oracle数据库使用经验word"文档集成了作者在Oracle数据库使用过程中的学习和实践经验,涵盖了Oracle的基础知识、...

    从一条select语句看oracle数据库查询原理

    "从一条select语句看oracle数据库查询原理" Oracle数据库查询原理是Oracle数据库的核心机制之一,从一条select语句我们可以了解到Oracle数据库的查询过程,从客户端到服务器端的整个过程。这篇文章将一步步地解释...

    oracle 检测数据库是否有对象被锁的脚本

    在Oracle数据库管理中,了解如何检测对象被锁的情况至关重要,因为锁定可能会导致数据一致性问题,影响系统的正常运行。本文将详细介绍如何使用提供的脚本`ckobject_lock.sh`和`ckobject_lock.sql`来监控和检测...

    Oracle查询用户锁表

    LOCK 表明该进程锁住了某个资源,而 WAIT 表明该进程正在等待某个资源。 四、释放锁资源 当诊断出锁的状态后,可以根据情况选择释放锁资源的方法。如果发现该阻塞其他用户进程的进程是正常操作中,可以通知该用户...

    Oracle数据库常见维护问题手册-精典

    ### Oracle数据库常见维护问题手册-精典 #### 数据库基础 **数据库启动方式** Oracle数据库启动通常通过`SQL*Plus`工具来进行。首先确保已经安装并配置了正确的Oracle客户端环境,然后通过以下命令来启动数据库:...

    检查Oracle数据库被锁的对象的sql语句

    在Oracle数据库管理中,了解如何检查被锁定的对象是至关重要的,因为这直接影响到数据库的性能和可用性。本文将深入探讨两个SQL查询语句,它们分别用于检查数据库表和pkg包是否被锁定,以及如何通过这些查询来识别并...

    Oracle强制释放锁的命令

    ,其中 sid 和 serial# 是查询数据库引发的锁相关信息的结果。例如,使用以下命令查询锁相关信息: select username,object_name,machine,s.sid,s.serial#,logon_time from v$locked_object l,dba_objects o ,v$...

    ORACLe数据库管理员教程

    Oracle数据库管理员教程是一个针对初学者的基础教程,旨在帮助学习者掌握Oracle数据库系统的基本管理和维护技能。Oracle数据库是全球广泛使用的数据库管理系统,尤其在企业级应用中占据重要地位。本教程将涵盖以下几...

    oracle数据库闩锁锁定与并发专题.doc

    在这个专题中,我们主要探讨的是Oracle数据库中的闩锁(Latch)和锁定(Lock)机制,这两种机制都是为了实现并发操作的串行化,防止数据的破坏。 首先,串行化是数据库管理系统中确保数据安全的重要原则,即使在多...

    Oracle数据库性能优化实务闩锁及闩锁优化.ppt

    闩锁是一种机制,用于保护Oracle数据库的核心内存结构,防止多个进程同时访问核心内存引起的冲突和死锁。 在Oracle数据库中,闩锁是通过LATCH(Latch)来实现的。LATCH是一种轻量级的锁机制,用于保护Oracle数据库...

    ORACLE数据库入门1.ppt

    本课程主要介绍了ORACLE数据库的基本概念和结构,包括ORACLE数据库的体系结构、内存结构、实例、会话、事务、后台进程、SQL语句执行过程等。 一、Oracle 体系结构 ORACLE数据库的体系结构主要包括物理结构和逻辑...

    oracle数据库期末考试试题及答案.docx

    以上是Oracle数据库期末考试中的部分题目及其解析,这些问题涵盖了Oracle数据库的基本概念和技术,包括内存结构、数据字典、表空间管理、监听服务、SQL语言特性以及锁和并发控制等内容,是理解和掌握Oracle数据库的重要...

    如何解决Oracle杀死死锁进程

    Oracle 杀死死锁进程是数据库管理员经常遇到的问题,本文将介绍解决 Oracle 杀死死锁进程的方法。 在 Oracle 中,死锁是指两个或多个会话在等待对方释放资源,从而导致互相阻塞的情况。死锁可能会导致数据库性能...

Global site tag (gtag.js) - Google Analytics