Oracle查锁表的实现(史上最全)

 更新时间:2023年12月14日 15:35:21   作者:Tzq@2018  
Oracle提供几种不同的方式来查看锁表,本文主要介绍了Oracle查锁表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

Oracle分两种锁,一种是DDL锁,一种是DML锁。

一、Oracle DDL锁的解锁(dba_ddl_locks视图)

1.1、查表的DDL锁的详情(kill session脚本、表名、执行锁表的SQL等)

查DDL锁的数据字典,SQL如下:

SELECT DISTINCT 'alter system kill session ''' || s.sid || ',' || s.serial# || ',@' ||
                s.inst_id || ''' immediate;' AS kill_session_scripts
               ,s.sql_id
               ,a.sql_text
               ,s.sid
               ,s.serial#
  FROM dba_ddl_locks l
      ,gv$session    s
      ,gv$sqlarea     a
 WHERE 1 = 1
   AND l.session_id = s.sid
   AND s.sql_id = a.sql_id
   AND lower(a.sql_text) NOT LIKE '%alter system kill session %'
-- AND l.owner IN ('TZQ','LOG')
;

查表的DDL锁的详情的查询结果如下图所示:

在这里插入图片描述

1.2、解锁表的DDL锁

有两种方式可以解锁表的DDL锁。

  • 一是:执行kill session脚本。
  • 二是:调用tzq_server_pkg包的kill_session存过执行杀会话kill session。

1.2.1、解锁表的DDL锁 - 1、执行kill session脚本

Ⅰ、打开命令窗口

在这里插入图片描述

Ⅱ、执行上面生成好的kill session脚本

alter system kill session '314,93,@1' immediate;

在这里插入图片描述

1.2.2、解锁表的DDL锁 - 2、调用tzq_server_pkg包的kill_session存过执行杀会话kill session。

tzq_server_pkg包的代码详见博客:Oracle解锁表、包、用户、杀会话、停job

打开命令行窗口,执行下面命令:

set serveroutput on
execute sys.tzq_server_pkg.kill_session(6335,15519);

二、Oracle DML锁的解锁(gv$locked_object视图)

2.1、查表的DML锁的详情(kill session脚本、表名、执行锁表的SQL等)

查DML锁的数据字典,SQL如下:

SELECT DISTINCT 'alter system kill session ''' || s.sid || ',' || s.serial# || ',@' ||
                s.inst_id || ''' immediate;' AS kill_session_scripts
               ,o.owner
               ,o.object_name
               ,s.sql_id
               ,a.sql_text
               ,s.sid
               ,s.serial#
  FROM gv$locked_object l
      ,dba_objects      o
      ,gv$session       s
      ,gv$sqlarea        a
 WHERE l.object_id = o.object_id
   AND l.session_id = s.sid
   AND l.inst_id = s.inst_id
   AND s.sql_id = a.sql_id
   -- AND o.owner IN ('TZQ','LOG')
;

查表的DML锁的详情的查询结果如下图所示:

在这里插入图片描述

2.2、解锁表的DML锁

有两种方式可以解锁表的DML锁。

  • 一是:执行kill session脚本。
  • 二是:调用tzq_server_pkg包的kill_session存过执行杀会话kill session。

2.2.1、解锁表的DML锁 - 1、执行kill session脚本

Ⅰ、打开命令窗口

在这里插入图片描述

Ⅱ、执行上面生成好的kill session脚本

alter system kill session '314,93,@1' immediate;

在这里插入图片描述

2.2.2、解锁表的DML锁 - 2、调用tzq_server_pkg包的kill_session存过执行杀会话kill session。

tzq_server_pkg包的代码详见博客:Oracle解锁表、包、用户、杀会话、停job

打开命令行窗口,执行下面命令:

set serveroutput on
execute sys.tzq_server_pkg.kill_session(6335,15519);

三、附录

3.1、根据sid查sql_text(gv$session、gv$sqlarea)

SELECT s.sid
      ,s.serial#
      ,s.sql_id
      ,s.sql_hash_value
      ,s.username
      ,a.sql_text
  FROM gv$session s
  LEFT JOIN gv$sqlarea a
    ON s.sql_id = a.sql_id
 WHERE s.sql_id IS NOT NULL
   AND a.sql_text NOT LIKE '%AND a.sql_text NOT LIKE %'
 ;

在这里插入图片描述

3.2、查锁表的详情(dba_locks视图)

SELECT DISTINCT 'alter system kill session ''' || s.sid || ',' || s.serial# || ',@' ||
                s.inst_id || ''' immediate;' AS kill_session_scripts
      ,l.session_id
      ,s.serial#
      ,l.lock_TYPE
      ,l.mode_held
      ,l.mode_requested
      ,CASE
         WHEN o1.object_name IS NOT NULL
           THEN o1.owner||'.'||o1.object_name
         ELSE NULL
       END AS id1_object_name
      ,CASE
         WHEN o2.object_name IS NOT NULL
           THEN o2.owner||'.'||o2.object_name
         ELSE NULL
       END AS id2_object_name
      ,l.last_convert
      ,l.blocking_others
      ,a.SQL_TEXT
  FROM dba_locks l
  LEFT JOIN dba_objects o1
    ON l.lock_id1 = o1.OBJECT_ID
  LEFT JOIN dba_objects o2
    ON l.lock_id2 = o2.OBJECT_ID
  LEFT JOIN gv$session s
    ON l.session_id = s.SID
  LEFT JOIN v$sqlarea a
    ON s.sql_id = a.sql_id
 WHERE 1=1
   AND a.SQL_TEXT IS NOT NULL
   AND (o1.owner IN ('TZQ','LOG') OR
        o2.owner IN ('TZQ','LOG'))
;

在这里插入图片描述

3.3、Oracle查询锁定表的会话信息(gv$session、gv$process、gv$sqlarea)

Oracle查询锁定表的会话信息,可以执行下面的SQL来进行查询:

SELECT s.sid
      ,s.serial#
      ,p.spid
      ,s.username
      ,s.osuser
      ,s.program
      ,s.module
      ,s.action
      ,s.logon_time
      ,s.type
      ,a.sql_text
  FROM gv$session s
      ,gv$process p
      ,gv$sqlarea a
 WHERE s.paddr = p.addr
   AND s.sql_id = a.sql_id
   AND s.status = 'ACTIVE'
   AND s.username IS NOT NULL
   AND s.type != 'BACKGROUND'
   AND a.sql_text NOT LIKE '%gv$sqlarea a%'
 ORDER BY s.logon_time DESC;

在这里插入图片描述

3.4、gv$lock视图

此查询将返回被锁定的表的会话ID、用户名、机器名、锁模式、锁定类型以及锁定对象的ID等信息。请注意,如果有多个锁定类型,则此查询可能会返回多行。

SELECT s.sid
      ,s.serial#
      ,s.username
      ,s.osuser
      ,s.machine
      ,l.type
      ,l.block
      ,l.id1
      ,l.id2
      ,a.SQL_TEXT
      ,CASE
         WHEN o1.object_name IS NOT NULL
           THEN o1.owner||'.'||o1.object_name
         ELSE NULL
       END AS id1_object_name
      ,CASE
         WHEN o2.object_name IS NOT NULL
           THEN o2.owner||'.'||o2.object_name
         ELSE NULL
       END AS id2_object_name
  FROM gv$session s
      ,gv$lock    l
      ,gv$sqlarea a
      ,dba_objects o1
      ,dba_objects o2
 WHERE s.sid = l.sid
   AND s.sql_id = a.sql_id
   AND l.id1 = o1.OBJECT_ID(+)
   AND l.id2 = o2.OBJECT_ID(+)
   AND a.SQL_TEXT NOT LIKE '%,gv$sqlarea a%'
;

查询结果如下图:

在这里插入图片描述

在这里插入图片描述

到此这篇关于Oracle查锁表的实现(史上最全)的文章就介绍到这了,更多相关Oracle查锁表内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家! 

相关文章

  • Oracle表空间管理和用户管理介绍

    Oracle表空间管理和用户管理介绍

    大家好,本篇文章主要讲的是Oracle表空间管理和用户管理介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Oracle数据库服务器修改操作系统时间的注意事项详解

    Oracle数据库服务器修改操作系统时间的注意事项详解

    在本篇文章里小编给大家整理的是一篇关于Oracle数据库服务器修改操作系统时间的注意事项详解,需要的朋友们可以参考下。
    2020-03-03
  • Oracle数据库中的控制文件管理以及常用参数设置

    Oracle数据库中的控制文件管理以及常用参数设置

    这篇文章主要介绍了Oracle数据库中的控制文件管理以及常用参数设置方法,包括控制文件不一致问题的解决方法以及隐藏参数等技巧,需要的朋友可以参考下
    2015-12-12
  • oracle临时表空间无法释放的解决办法

    oracle临时表空间无法释放的解决办法

    Oracle临时表空间主要是用于数据库较大的临时排序用,在PGA分配的工作区空间不足以容纳排序数据时使用临时表空间,但是容易遇到oracle临时表空间无法释放的问题,所以本文给大家介绍了oracle临时表空间无法释放的解决办法,需要的朋友可以参考下
    2024-03-03
  • Oracle使用fy_recover_data恢复truncate删除的数据

    Oracle使用fy_recover_data恢复truncate删除的数据

    这篇文章主要介绍了Oracle使用fy_recover_data恢复truncate删除的数据,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • oracle中的ID号实现自增长的方法

    oracle中的ID号实现自增长的方法

    这篇文章主要介绍了oracle中的ID号如何实现自增长,利用序列产生主键值,需要的朋友可以参考下
    2014-05-05
  • SQL PLUS基本命令的使用方法示例

    SQL PLUS基本命令的使用方法示例

    这篇文章主要给大家介绍了关于SQL PLUS基本命令的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • oracle中decode函数的使用方法

    oracle中decode函数的使用方法

    这篇文章主要介绍了oracle中decode函数的使用方法,需要的朋友可以参考下
    2014-03-03
  • Oracle数据库自定义类型type的用法详解

    Oracle数据库自定义类型type的用法详解

    这篇文章主要介绍了Oracle数据库自定义类型type的用法详解,Oracle?数据库的概念和其它数据库不一样,这里的数据库是一个操作系统只有一个库,可以看作是?Oracle?就只有一个大数据库,需要的朋友可以参考下
    2023-07-07
  • Oracle 11g 新特性 Flashback Data Archive 使用实例

    Oracle 11g 新特性 Flashback Data Archive 使用实例

    这篇文章主要介绍了Oracle 11g 新特性 Flashback Data Archive 使用实例,Flashback Data Archive 的主要作用是在它的有效期内将保存事务改变的信息,需要的朋友可以参考下
    2014-07-07

最新评论

?


http://www.vxiaotou.com