1. 程式人生 > 其它 >Oracle 資料庫鎖表問題及相關解決方法

Oracle 資料庫鎖表問題及相關解決方法

Oracle 資料庫鎖表問題及相關解決方法

問題描述:

  • 今天在公司執行服務的時候,需要查詢300多萬的資料,再進行排序之後放到kafka的訊息佇列中,供flink進行消費。在伺服器上直接執行後,服務報錯,顯示記憶體超出java的堆疊記憶體。導致服務停止。在反過來進行資料庫表的插入時,資料庫表操作的進度條直接和卡死了一樣,直接不動。(此時意識到會不會有事務在報錯的時候未提交之類的問題,並沒有意識到資料庫的鎖表)。

  • 在操作了好幾次還是不行後,一氣之下準備刪表重建,咦??
    drop table 之後資料庫報錯了:

ORA-00054: 資源正忙, 但指定以 NOWAIT 方式獲取資源, 或者超時失效

好傢伙!心中默唸(什麼傻逼玩意兒,刪都刪不掉...)---我還沒意識到鎖表了

在經過百度之後,才發現是鎖表了。回到剛才的問題描述,是對錶的操作短時間內太過快速和頻繁而導致的資料庫鎖表。即由於其他Session已經對目標表做了操作,並且已經有排他鎖在表上了,所以新的Session無法再對錶進行DDL操作。

解決方法

  1. 找出是哪個會話鎖住了哪張表

    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 表名。
  1. 找出引發鎖的會話

    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# 是我們需要用到的會話序列號。

  2. 殺掉會話

    命令格式為:alter system kill session 'sid,serial#'
    比如:
    alter system kill session '115,7355';

在執行完成後,會發現資料庫表的鎖已經解除,可以正常進行相關的增刪改查操作了