Oracle查鎖表的實現(xiàn)(史上最全)
Oracle分兩種鎖,一種是DDL鎖,一種是DML鎖。
一、Oracle DDL鎖的解鎖(dba_ddl_locks視圖)
1.1、查表的DDL鎖的詳情(kill session腳本、表名、執(zhí)行鎖表的SQL等)
查DDL鎖的數(shù)據(jù)字典,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鎖的詳情的查詢結(jié)果如下圖所示:
1.2、解鎖表的DDL鎖
有兩種方式可以解鎖表的DDL鎖。
- 一是:執(zhí)行kill session腳本。
- 二是:調(diào)用tzq_server_pkg包的kill_session存過執(zhí)行殺會話kill session。
1.2.1、解鎖表的DDL鎖 - 1、執(zhí)行kill session腳本
Ⅰ、打開命令窗口
Ⅱ、執(zhí)行上面生成好的kill session腳本
alter system kill session '314,93,@1' immediate;
1.2.2、解鎖表的DDL鎖 - 2、調(diào)用tzq_server_pkg包的kill_session存過執(zhí)行殺會話kill session。
tzq_server_pkg包的代碼詳見博客:Oracle解鎖表、包、用戶、殺會話、停job
打開命令行窗口,執(zhí)行下面命令:
set serveroutput on execute sys.tzq_server_pkg.kill_session(6335,15519);
二、Oracle DML鎖的解鎖(gv$locked_object視圖)
2.1、查表的DML鎖的詳情(kill session腳本、表名、執(zhí)行鎖表的SQL等)
查DML鎖的數(shù)據(jù)字典,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鎖的詳情的查詢結(jié)果如下圖所示:
2.2、解鎖表的DML鎖
有兩種方式可以解鎖表的DML鎖。
- 一是:執(zhí)行kill session腳本。
- 二是:調(diào)用tzq_server_pkg包的kill_session存過執(zhí)行殺會話kill session。
2.2.1、解鎖表的DML鎖 - 1、執(zhí)行kill session腳本
Ⅰ、打開命令窗口
Ⅱ、執(zhí)行上面生成好的kill session腳本
alter system kill session '314,93,@1' immediate;
2.2.2、解鎖表的DML鎖 - 2、調(diào)用tzq_server_pkg包的kill_session存過執(zhí)行殺會話kill session。
tzq_server_pkg包的代碼詳見博客:Oracle解鎖表、包、用戶、殺會話、停job
打開命令行窗口,執(zhí)行下面命令:
set serveroutput on execute sys.tzq_server_pkg.kill_session(6335,15519);
三、附錄
3.1、根據(jù)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查詢鎖定表的會話信息,可以執(zhí)行下面的SQL來進(jìn)行查詢:
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、用戶名、機(jī)器名、鎖模式、鎖定類型以及鎖定對象的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%' ;
查詢結(jié)果如下圖:
到此這篇關(guān)于Oracle查鎖表的實現(xiàn)(史上最全)的文章就介紹到這了,更多相關(guān)Oracle查鎖表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Oracle數(shù)據(jù)庫使用 listagg去重刪除重復(fù)數(shù)據(jù)的方法匯總
文章介紹了在Oracle數(shù)據(jù)庫中使用LISTAGG和XMLAGG函數(shù)進(jìn)行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLOB類型處理大字符串、以及根據(jù)具體需求選擇合適的方法,感興趣的朋友跟隨小編一起看看吧2025-01-01ORACLE數(shù)據(jù)庫逐步解決ORA-12541、ORA-01034和ORA-27101、ORA-00119和ORA0013
這篇文章主要介紹了ORACLE數(shù)據(jù)庫逐步解決ORA-12541、ORA-01034和ORA-27101、ORA-00119和ORA00132過程的相關(guān)步驟,需要的朋友可以參考下2020-04-04關(guān)于Oracle數(shù)據(jù)庫dbLink的創(chuàng)建和使用詳解
這篇文章主要介紹了關(guān)于Oracle數(shù)據(jù)庫dbLink的創(chuàng)建和使用詳解,Oracle的數(shù)據(jù)庫鏈路dbLink是一種允許在兩個不同的數(shù)據(jù)庫實例之間進(jìn)行通信和數(shù)據(jù)交換的功能,它可以讓你在一個數(shù)據(jù)庫中訪問另一個數(shù)據(jù)庫的對象和數(shù)據(jù),需要的朋友可以參考下2023-08-08Oracle停止數(shù)據(jù)泵導(dǎo)入數(shù)據(jù)的方法詳解
Oracle數(shù)據(jù)庫在使用的過程中常常會遇到這樣或那樣的問題,而這些問題常常又使我們感到很困惑,下面這篇文章主要給大家介紹了關(guān)于Oracle停止數(shù)據(jù)泵導(dǎo)入數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2022-06-06