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';

在执行完成后,会发现数据库表的锁已经解除,可以正常进行相关的增删改查操作了

posted on 2022-12-09 17:07  ApeJ  阅读(1157)  评论(0编辑  收藏  举报