暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

oracle Exadata x5和数据库故障事件报告

原创 杨凯同学 2023-09-13
567

1.故障描述

在2023年9月05日上午客户反应,应用系统响应特别慢,之后查看数据库的性能视图
发现存在大量的等待事件,很多DML语句无法正常运行,等待时间特别长。

image.png

2. 问题定位

oracle Exadata x5一体机层面排查结果:

经过对一体机的运行状态进行排查,发现其中一台cell节点(cel02)与整个集群的环境存在延时,时间延时超过6个小时
而且发现cel02节点基本hang主了

数据库层面排查结果:

(1)数据库的运行情况,经过对每个表空间的使用情况进行检测,发现UNDOTBS1表空间,处于100%的使用率,并且一直没有释放。

image.png

(2)大量的UNDO Segment处于OFFLINE状态。

image.png

3.故障处理思路

经过和应用维护人员确认,在出现性能问题之前,应用维护人员对数据库进行了大量的手工执行的UPDATE和DELETE操作。
操作的表均为大日志表,每张表都超过了500G。
执行一段时间后仍未成功,随后进行了kill操作。
这样造成了数据库中的UNDO表空间特别繁忙,必然会导致undo回滚,占用了大量的UNDO表空间,对UNDO段进行了污染。

其中一个存储节点(cel02)存在时间延时,Oracle的运行机制为了保证数据的一致性,
所以前台应用对数据库的读写操作,无法正常地在此节点上进行。原有的高冗余配置无法发挥其效果。致使数据库的正常读写受阻。

4.故障处理过程

基于上面的数据库表象和处理思路,首先采取的处理方式为:

1)Exadata层面
对存cel02存储节点进行重启,从而使其与整个集群的时间进行同步。
于是,于2023年09月05日晚 08:00对其进行了重启操作。在cel02节点重启之后,时间恢复正常。
但是数据库存储底层存在rebalance重平衡任务。出现这个任务是正常的。
因为在cel02时间不一致的情况下,数据库将不会对其进行读写,从而在重启之前的读写只针对于cel01和cel03,
待cel02重启后,需要将更新的数据在cel02上进行同步,对数据进行重新分布。
为了使得此rebalance任务可以在最短时间内完成。
采取了将oracle Exadata x5运行的数据库全部停止,保证没有新的读写在进行。在进行了约6个小时的rebalance,存储节点的数据重平衡基本完成。随后将数据库启动,进行性能验证,发现数据库的性能有所改善,但相比往常的性能指标,仍然是比较验证迟缓。

2)数据库层面:
查看undo 回滚需要600多小时的时间
select  undoblockstotal "Total", undoblocksdone "Done", undoblockstotal-undoblocksdone  
"ToDo",decode(cputime,0,'unknown',to_char(sysdate+(((undoblockstotal-undoblocksdone)  
/ (undoblocksdone / cputime)) / 86400),'yyyy-mm-dd hh24:mi:ss'))  
 "Estimated time to complete",to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')  from v$fast_start_transactions;
回滚默认开启并行会导致数据库和系统负载很高,于是需要提前处理下,设置参数_fast_start_parallel_rollback_关掉UNDO并行。
alter system set fast_start_parallel_rollback=false;
重启后查看回滚时间,还是需要很长时间

只能放大招:
尝试truncate这几张表
经过和应用方确认后,这几张表可以直接删除,于是手工对这几张大日志表进行了truncate删除了,随后数据库性能立马恢复正常。

5.故障解决总结

通过此次故障的处理,对数据库的手工执行的update、delete大表操作,应该分割删除,下面是我日常删除大表的存储过程。
create table t_jindu(id int,name varchar2(60),sum int);
declare 
i int; --定义变量
v_count int; --定义变量
v_loop int; --定义变量
begin 
select count(*) into v_count from 表名 where insert_time<=to_date('20230630 00:00:00','yyyymmdd hh24:mi:ss') ; --计算表
select ceil(v_count/5000) into v_loop from dual; --计算需要循环次数
i:=1; --为i赋值
while i<=v_loop loop --循环退出条件
delete from 表名 where insert_time<=to_date('20230630 00:00:00','yyyymmdd hh24:mi:ss') and rownum<5000;
insert into t_jindu values(i,'表名',v_loop); --记录删除次数进度
commit; --提交
i:=i+1; --i依次加1
end loop;
EXCEPTION 
WHEN OTHERS THEN
ROLLBACK; --有问题回滚
end;
/ 
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论