前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Oracle中执行truncate操作出现hang

Oracle中执行truncate操作出现hang

作者头像
bisal
发布于 2021-11-08 02:58:34
发布于 2021-11-08 02:58:34
69500
代码可运行
举报
运行总次数:0
代码可运行

同事说某套Oracle中有一张94G容量的表需要清空,用delete删除的,但是一直卡着。

这个能理解,因为delete是DML操作,事务控制的,在删除的时候,会写入redo、undo等日志,为了能做回滚,或者异常恢复,删除的数据越多,消耗的资源越高,等待时间越久,因此不建议对大量数据的删除使用delete,应该用批量操作,分多个事务执行,分散资源消耗。

针对这个需求,是清空这张表,不用备份,所以应该用truncate,他是DDL操作,不会像delete这种消耗太多的资源。

于是开始执行truncate,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
truncate table test;

此时提示错误,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

他的意思是存在未提交的事务,truncate不能获得锁资源,可以用如下SQL找出锁住的表对象,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select b.owner,b.object_name,a.session_id,a.locked_mode 
from v$locked_object a,dba_objects b 
where b.object_id = a.object_id;

可以用如下SQL找出引起锁住的会话,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select b.username,b.sid,b.serial#,logon_time 
from v$locked_object a,v$session b 
where a.session_id = b.sid order by b.logon_time;

有了这个sid和serial#,可以看下他正在执行的是什么SQL,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select distinct c.spid,b.sid,b.username,a.module,a.hash_value,sql_text 
from v$sql a,v$session b,v$process c
where a.hash_value=b.sql_hash_value and a.address=b.sql_address 
and b.paddr=c.addr and b.sid=&sid and b.serial#=&serial;

针对这个案例,看到阻塞会话正执行的是delete,module显示是dbeaver,这正是刚刚同事执行出现hang且未做提交的SQL,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
delete from test where 1=1;

确认可删除会话,执行如下SQL,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
alter system kill session 'sid,serial#';

此时再次执行,但是一直是hang住的,等了好几分钟,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
truncate table test;

正常来讲,truncate应该执行很快,执行慢,说明有等待,看下等的是什么,等待的是"enq: RO - fast object reuse",

图中显示,session_id=196是truncate,正在阻塞的是session_id=770,他对应的是后台进程CKPT,即检查点进程,

MOS这篇文章《Resolving Issues Where 'enq: RO - fast object reuse' Contention Seen During Drop or Truncate Operations (Doc ID 1475659.1)》,介绍了下enq: RO - fast object reuse这个等待事件,

The RO enqueue known as "Multiple object resue" enqueue, is used to synchronise operations between foreground process and a background process such as DBWR or CKPT. It is typically used when dropping objects or truncating tables. Following is the sequence of events When a truncate/drop occurs: 1. Foreground process acquires the "RO" enqueue in exclusive mode 2. Cross instance calls (or one call if it is a single object) are issued ("CI" enqueue is acquired) 3. CKPT processes on each of instances requests the DBWR to write the dirty buffers to the disk and invalidate all the clean buffers. 4. After DBWR completes writing all blocks, the foreground process releases the RO enqueue.

大致意思是RO队列是用来同步前台进程(执行truncate、drop等操作)和后台进程操作(DBWR、CKPT)的,这个队列的等待会特别发生在drop删除对象和truncate表的时候。

而且和RO等待以及truncate执行慢相关的bug还是不少的,

在查资料的过程中,truncate竟然跑完了,14:56-15:15,大约20分钟。这套库很忙,频繁的写入,日志切换很频繁,可能会引起DBWR进程的等待,而执行truncate需要做Checkpoint,同样会等待DBWR,怀疑有无可能这些并发的操作,导致RO等待队列变长,作为临时解决,清除缓存,或者重启数据库,或许可行,当然不排除bug存在的可能。

找机会重现问题,我们再做讨论。

参考资料,

http://www.dboracle.com/archivers/enq-ro-fast-object-reuse%E9%97%AE%E9%A2%98%E5%A4%84%E7%90%86.html

https://www.cnblogs.com/callmemax/p/5958571.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/11/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
python函数的参数
对于power(x)函数,参数x就是一个位置参数,当我们调用power(x)函数时,必须传入有且仅有一个参数x
py3study
2020/01/06
9600
浅析Python函数的参数
Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。
Go进阶者
2021/03/08
5110
浅析Python函数的参数
Python函数的参数
定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道传递正确的参数,以及函数就返回什么样的值就够了,函数内部的复杂逻辑被封装起来了,调用者无须了解。
小破孩的梦想空间
2020/04/23
1.2K0
Python 函数的参数
power(x,n),x和n就是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数x和n。
py3study
2020/01/13
1.2K0
【Python】002-Python函数
在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后在缩进块中编写函数体,函数的返回值用return语句返回;
訾博ZiBo
2025/01/06
410
【Python】002-Python函数
Python函数参数之全面讲解
Python函数参数 Python函数参数 本文主要介绍Python的函数参数,各种形式的参数。建议动手试试,可以加深理解。 函数参数 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂的逻辑被封装起来,调用者无需了解。 Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以
1846122963
2018/03/09
1.4K0
python基础----函数参数
本文介绍了Python函数的参数传递方式,包括直接传入、默认参数、可变参数和关键字参数。直接传入是指将参数作为函数的参数直接传递给函数;默认参数是指在函数定义时,为参数指定一个默认值;可变参数是指在函数定义时,为参数指定一个可接受任意数量的参数;关键字参数是指在函数调用时,使用关键字参数来传递参数。
GavinZhou
2018/01/02
5580
【Python】8“函数的参数“
按函数参数顺序传入参数,这样的参数就叫做位置参数。Java的函数中,规定调用者必须按形式参数顺序依次传入参数,这样也可以看做是位置。 案例(幂运算):
肓己
2021/08/12
3660
Python基础笔记3
要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数。可以直接从Python的官方网站查看文档:
py3study
2020/01/03
3720
谈一谈|如何利用函数的各种参数
Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。
算法与编程之美
2020/07/14
4230
Python 函数
定义函数 在 Python 中,定义一个函数要使用 def 语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用 return 语句返回。 我们以自定义一个求绝对值的 my_abs 函数为例: 12345 def my_abs(x): if x >= 0: return x else: return -x 如果没有 return 语句,函数执行完毕后也会返回结果,只是结果为 None。 return None 可以简写为
一份执着✘
2018/06/04
1.4K0
Python学习笔记(三)——函数
本文是廖雪峰的Python教程的笔记,主要是摘抄一些重点。所以我把他划分到转载里。侵删。
蛮三刀酱
2019/09/10
5850
Python学习笔记(二)·函数
当代码出现有规律的重复的时候,你就需要当心了,每次写3.14 * x * x不仅很麻烦,而且,如果要把3.14改成3.14159265359的时候,得全部替换。
公爵
2022/09/28
1.7K0
Python学习笔记(二)·函数
【AICAMP —— Python】入门系列!(3. Python函数编程)
Python与其它编程语言一样,可以直接调用我们写好的函数,或者已经实现的函数。如我们可以使用系统自带的函数,求一个数的绝对值,使用abs函数,对其传入参数,得到输出。
灿视学长
2021/05/28
5110
人人都能学会的python编程教程12:函数的参数
Python的函数定义非常简单,也非常灵活。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。
JKXQJ
2018/04/18
8706
人人都能学会的python编程教程12:函数的参数
Python学习 Day 4 函数 切片 迭代 列表生成式 生成器
TypeError: my_abs() takes exactly 1argument (2 given)#参数个数不对
统计学家
2019/04/10
3870
7-函数
当存在多个默认参数的时候,调用的时候,既可以按顺序提供默认参数,比如调用enroll('Bob', 'M', 7),意思是,除了name,gender这两个参数外,最后1个参数应用在参数age上,city参数由于没有提供,仍然使用默认值。
用户3106371
2019/03/11
7530
7-函数
Python参数类型以及常见的坑
这个输出的结果应该是意料之中,现在我们这时候再调用Book()方法,看看会发生什么:
py3study
2020/01/07
1.3K0
Python 3.6学习笔记(一)
可以看到,注释以#开头,python的变量不需要任何前缀,行结束不需要结束符号,非常符合我们自然语言的阅读和书写习惯。当语句以:结尾时,缩紧的语句视为代码块。
大江小浪
2018/07/24
4670
Python 基础知识学习
这里只列举一些Python与Java和JavaScript不一样的地方,如果你有任何语言基础,相信看完这篇文章就可以轻松写Python程序。
李振
2021/11/26
4880
Python 基础知识学习
相关推荐
python函数的参数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档