Oracle数据库查找持有锁的SQL语句,而不是请求锁的SQL语句,原创

Oracle数据库查找持有锁的SQL语句,而不是请求锁的SQL语句

  1. 查找活动的事务以及活动事务关联的会话信息
select s.sid           会话ID,

        s.serial#      会话序列号,

        s.username     用户名,

        s.machine      主机名,

        s.module       程序名,

        t.addr         事务ID,

        t.status       事务状态,

        t.start_time   事务开启时间

   from v$session s, v$transaction t

  where t.addr = s.taddr

  order by t.start_time;

  

  1. 查找具体的锁表SQL根据事务包含的SQL数量可以分为以下两种方式
  • 事务中只有一个SQL语句,可以通过指定精确时间点来查找锁表SQL,准确度高

注意:SQL代码中的事务开始时间字段数据来源是来自事务视图(v$ transaction)中的事务开始时间

select s.sql_text                 sql代码,

       s.sql_id                   sql_ID,

       s.last_active_time         SQL最后执行时间,

       s.module                   程序名,

       s.parsing_schema_name      用户,

       s.service                  服务,

       s.action                   操作

  from v$sql s

 where s.last_active_time = to_date('2018/4/1 1:09:50', 'yyyy-mm-dd HH24:mi:ss')   --事务开启时间至今所有的SQL语句

   and s.parsing_schema_name = 'SYSTEM'          --执行SQL代码的用户

   and s.module = 'PL/SQL Developer'             --执行SQL代码的程序

   and trim(s.sql_text) not like 's%'             --过滤select语句

   and trim(s.sql_text) not like 'S%'             --过滤select语句

   and s.service  not like 'SYS$%'                --过滤数据库内部SQL

 order by s.last_active_time asc;                 --根据执行时间排序

  

  

  • 事务中包含多个SQL语句:可以通过指定时间范围,用户名,程序名等进行范围查找,准确度较低,

范围查找的弊端:因事务ID无法和SQL_ID没有关联字段,因此范围查会包括不同事务所发起SQL语句,需要根据需求进行二次过滤

select s.sql_text               sql代码,

       s.sql_id                      sql_ID,

       s.last_active_time      最后执行时间,

       s.module                      程序名,

       s.parsing_schema_name 用户名,

       s.service                        服务,

       s.action                         操作

  from v$sql s

 where (s.last_active_time between

       to_date('2018/4/1 1:09:50', 'yyyy-mm-dd HH24:mi:ss') and sysdate)

   and s.parsing_schema_name = 'SYSTEM'      --执行SQL代码的用户

   and s.module = 'PL/SQL Developer'           --执行SQL代码的程序

   and trim(s.sql_text) not like 's%'             --过滤select语句

   and trim(s.sql_text) not like 'S%'             --过滤select语句

   and s.service  not like 'SYS$%'              --过滤数据库内部SQL

 order by s.last_active_time asc;               --根据执行时间排序