Oracle Undo Tablespace 使用率暴涨案例分析

案例说明:

客户XXX数据库是4节点Oracle RAC架构,节点1监控undo tablespace使用率超过阈值告警,并且还在快速增长,经检查发现,一事务在对物化视图执行delete时,长时间未完成,导致undo表空间被占用,使用率快速增长。

数据库版本:12.1.2.0

一、查看undo空间使用率

通过以下脚本查看undo表空间使用率,发现undo tablespace存储空间在短时间内快速增长,使用率达到90%以上:

二、执行表空间扩容

如下所示,执行以下脚本对undo tablespace进行扩容,从100G扩容到200G,但undo tablespace的使用率仍在快速增长:

三、查看当前事务对undo段占用信息

如下所示,通过以下脚本查询当前事务占用undo段的信息,并获取事务对应的SQL_ID:

图1: 事务占用undo段信息

四、查看数据库告警日志

如下所示,在数据库的alert日志中出现ORA-01555故障:

图2: 告警日志信息

数据库undo _retention 配置:

如下所示,数据库undo_retention为14400分钟,说明当前在undo中有大量expired的undo数据占用undo表空间

图3:undo retention配置信息

查看undo表空间使用信息:

如下所示,当前事务已经占用大量undo段空间(Active):

图4:undo 段使用信息

五、获取SQL执行计划

如下所示,依据前面获取的事务对应的SQL_ID ,查询具体执行的sql文本:

六、查看S QL 执行计划

如下所示,当前占用undo tablespace的事务是delete操作,执行对物化视图的删除操作

图5:事务所执行SQL执行计划信息

七、查看物化视图D DL 语句

如下所示,delete语句涉及的物化视图有多张表的查询构建,现场测试目前物化视图的刷新效率非常低,长达几个小时:

图6: 物化视图定义信息

八、查看物化视图对应表的统计分析信息

如下所示,对物化视图对应的表,查询其统计分析结果,和实际的表记录的行数对比,判断是否是因为表统计分析有误,导致物化视图对应表的查询执行计划异常:

1 、查看表统计分析结果

2、查看表实际记录行数

如下所示,对物化视图对应表,查看实际的表记录行数;对比表统计分析后结果和表实际记录行数(通过对比查看,统计分析结果和表实际记录行数没有大的差别,排除因为统计分析有误导致的执行计划异常的问题):

图7: 表实际记录行数

九、根据告警异常信息查询M OS

如下截图所示,根据告警日志异常信息,查询MOS的相关处理建议:

图8:告警日志异常信息

图9: MOS建议解决方案

如上所示,Oracle建议对物化视图采用非原子性的方式执行refresh。

原子性刷新与非原子性刷新的区别(官方文档说明)

1)原子性刷新

在原子性刷新中,整个物化视图的刷新过程被视为一个单一的操作。如果刷新过程中发生错误,Oracle会回滚整个操作,确保物化视图的数据状态保持一致。这种方式保证了数据的一致性和完整性。

2)非原子性刷新

非原子性刷新允许在刷新过程中出现错误时只回滚部分数据更改。这意味着如果在刷新过程中某个部分失败,只有那部分会回滚,而其他成功刷新的部分则保留下来。这种方式可以提高性能,因为它减少了因单个错误导致的整个刷新操作的失败。

如何设置非原子性刷新

在Oracle中,可以通过DBMS_MVIEW包中的REFRESH过程来刷新物化视图,并通过指定method_opt参数来控制刷新的方式。对于非原子性刷新,你可以使用FAST或COMPLETE选项,但要注意的是,Oracle官方文档中并没有直接提及COMPLETE选项作为非原子性的明确标识。通常,使用FAST选项可以实现非原子性的快速刷新,而使用COMPLETE选项则会尝试进行更完整的刷新,但这不一定等同于非原子性(在某些情况下,COMPLETE也可以是原子性的)。

十、采用fast refresh方式重建物化视图

如下所示,重新定义后的物化视图的结构:

图10:物化视图定义

查看重新定义后物化视图刷新时间:

如下所示,物化视图最近的刷新时间为35分钟,恢复正常:

图11:物化视图刷新时间

十一、总结

本案例因为对物化视图执行delete操作导致的undo tablespace表空间使用率暴涨的问题,以重建物化视图解决,重建物化视图后,物化视图的刷新恢复正常,delete操作事务亦可以快速commit,事务的undo block不再长期占用undo tablespace。

对于物化视图刷新效率低,delete事务长期不能提交,还需要进一步分析其原因。

相关推荐
todoitbo6 分钟前
我用 TRAE 做了一个不一样的 MySQL MCP
数据库·mysql·adb·ai工具·mcp·trae·mysql-mcp
CodeJourney.18 分钟前
Python开发可视化音乐播放器教程(附代码)
数据库·人工智能·python
呆呆小金人28 分钟前
SQL入门:正则表达式-高效文本匹配全攻略
大数据·数据库·数据仓库·sql·数据库开发·etl·etl工程师
AI模块工坊35 分钟前
AAAI 2025 | 即插即用,川大Mesorch刷新SOTA,用「介观」Transformer架构终结图像造假
人工智能·深度学习·计算机视觉·架构·transformer
周杰伦_Jay37 分钟前
【OpenManus深度解析】MetaGPT团队打造的开源AI智能体框架,打破Manus闭源壁垒。包括架构分层、关键技术特点等内容
人工智能·深度学习·opencv·架构·开源
The Open Group43 分钟前
小企业的大架构:TOGAF®标准如何助力突破初创瓶颈
架构
白鲸开源2 小时前
(二)从分层架构到数据湖仓架构:数据仓库分层下的技术架构与举例
大数据·数据库·数据分析
好玩的Matlab(NCEPU)2 小时前
Redis vs RabbitMQ 对比总结
数据库·redis·rabbitmq
21号 12 小时前
16.MySQL 服务器配置与管理
服务器·数据库·mysql
我的offer在哪里2 小时前
MongoDB
数据库·mongodb