点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!
问题描述
某日业务发了一个Oracle的报错:无法按 2 扩展段 (在还原表空间 'UNDOTBS1' 中)。

什么是undotbs?
UNDOTBS1 是 Oracle 数据库中的一个表空间,用于存储撤销段(undo segments)。撤销段记录数据库修改操作的前状态,以便在事务回滚或数据库恢复时能够恢复数据。UNDOTBS1 是默认的撤销表空间,通常用于处理数据库事务的撤销数据。
因为Oracle在执行dml操作时的insert、update等操作都会将更改记录写入undo表空间中,相当于完成一个临时的备份,在你需要回滚的时候就可以从undo表空间中找数据,撤销之前的dml操作。
问题点:
这个报错一般是undo表空间满了会报错,但是当时登录数据库时undo根本还有很大的空间,为什么会报错?

解决思路
由于业务反馈问题时已经过了执行程序的时间段,询问业务后得到可以即时再跑一次程序的答复,于是可以一边跑一边观察数据库的状态。

2.1 问题分析
根据程序在跑的时候观察的数据库undo表空间涨幅情况来看,2个小时内预计undo使用率暴涨到接近100%,应该就是这个问题导致的。
图1:

图2:

注:图1和图2分别是我一个小时前后查询的结果。
可以看到1个小时内undo表空间上涨了百分之40左右,再联系业务所述程序一般会执行2个小时。
可以得出结论:2小时内undo表空间跑满所以导致报错ORA-30036。
2.2 解决方法
2.2.1 增加undo表空间容量
要增加 Oracle 数据库中的 undo 表空间(如 UNDOTBS1),可以通过以下步骤:
step1 增加数据文件大小
如果你只是需要增加现有数据文件的大小,可以执行以下 SQL 语句:
ALTER DATABASE DATAFILE '/path_to_your_datafile/undo01.dbf' RESIZE 2G;
这会将指定数据文件的大小调整为 2GB。
step2 添加新的数据文件
如果你需要添加一个新的数据文件来扩展 undo 表空间,可以执行:
ALTER TABLESPACE undotbs1 ADD DATAFILE '/path_to_your_datafile/undo02.dbf' SIZE 1G;
这会在 UNDOTBS1 表空间中添加一个新的数据文件,初始大小为 1GB。
step3 自动扩展数据文件
为了避免手动扩展,可以设置数据文件的自动扩展:
ALTER DATABASE DATAFILE '/path_to_your_datafile/undo01.dbf' AUTOEXTEND ON NEXT 100M MAXSIZE 2G;
这会让数据文件在需要时自动扩展,每次增加 100MB,最大到 2GB。
确保在执行这些操作之前备份数据并在维护窗口期间进行,以避免对生产环境造成影响。
2.2.2 脚本分段执行
Oracle 的 undo 表空间会自动清理。
撤销数据在事务完成后会被标记为可回收,系统会根据撤销保留策略和表空间的使用情况自动回收这些不再需要的空间。
此外,Oracle 会定期清理不再需要的撤销段,以确保表空间的有效利用和性能。
图3:

将脚本分段执行,在undo自动清理之后再执行后一段脚本就可以避免undo跑满了导致的报错,图3是2小时后截图的,可以看到空间已经回收了不少,足够执行后续dml操作了。
总 结
Oracle 数据库中的 undo 表空间扮演着至关重要的角色,确保事务的完整性和数据的一致性。
通过自动管理和回收机制,undo 表空间能够高效地处理并发事务和长时间运行的查询,维持系统的稳定性和性能。
合理配置撤销保留策略和空间管理设置,不仅能优化数据库操作,还能有效支持业务需求。掌握这些机制,将为数据库管理员在实际应用中提供强大的保障。

本文作者:刘博文(上海新炬中北团队)
本文来源:“IT那活儿”公众号





