Oracle 資料庫鎖表問題及相關解決方法
阿新 • • 發佈:2022-12-09
Oracle 資料庫鎖表問題及相關解決方法
問題描述:
-
今天在公司執行服務的時候,需要查詢300多萬的資料,再進行排序之後放到kafka的訊息佇列中,供flink進行消費。在伺服器上直接執行後,服務報錯,顯示記憶體超出java的堆疊記憶體。導致服務停止。在反過來進行資料庫表的插入時,資料庫表操作的進度條直接和卡死了一樣,直接不動。(此時意識到會不會有事務在報錯的時候未提交之類的問題,並沒有意識到資料庫的鎖表)。
-
在操作了好幾次還是不行後,一氣之下準備刪表重建,咦??
drop table 之後資料庫報錯了:
ORA-00054: 資源正忙, 但指定以 NOWAIT 方式獲取資源, 或者超時失效
好傢伙!心中默唸(什麼傻逼玩意兒,刪都刪不掉...)---我還沒意識到鎖表了
在經過百度之後,才發現是鎖表了。回到剛才的問題描述,是對錶的操作短時間內太過快速和頻繁而導致的資料庫鎖表。即由於其他Session已經對目標表做了操作,並且已經有排他鎖在表上了,所以新的Session無法再對錶進行DDL操作。
解決方法
- 找出是哪個會話鎖住了哪張表
select l.session_id,o.owner,o.object_name from v$locked_object l,dba_objects o where l.object_id=o.object_id;
- session_id 為會話 ID。
- object_name 表名。
-
找出引發鎖的會話
select s.username,s.sid,s.serial#,s.logon_time from v$locked_object l,v$session s where l.session_id=s.sid order by s.logon_time;
其中的
serial#
是我們需要用到的會話序列號。 -
殺掉會話
命令格式為:alter system kill session 'sid,serial#'
比如:alter system kill session '115,7355';
在執行完成後,會發現資料庫表的鎖已經解除,可以正常進行相關的增刪改查操作了