
文/毛思平



公司某系统双十一凌晨出现大面积阻塞、数据库HANG住的情况,数据库主要等待事件为“library cache lock”,阻塞发生18分钟后数据库自动恢复,41分钟后业务全面恢复。
经分析数据库日志发现,该系统每天凌晨0点后,数据库偶尔会有不同程度阻塞,由于阻塞持续时间较短且在线交易少因此未被发现。
该系统为24小时联机交易系统,凌晨0点有跑批,业务反馈为避免双十一业务峰值,特意调整跑批时间,但数据库阻塞依然发生。


经分析,造成该事件主要原因是双十一业务陡增的情况下数据库间隔分区表自动创建分区导致。由于创建表分区操作会清除并重建SQL执行计划和访问路径,且该操作串行使用library cache,使用过程会产生成library cache lock。
由于联机交易事务突增从而导致创建表分区与联机交易访问存在冲突,造成部分表的访问游标失效,引发更多的library cache lock竞争,从而影响联机交易性能,最终造成大量业务阻塞。
什么是间隔分区表?间隔分区表是Oracle 11.1引入的功能,当用户向该类型分区表中插入数据时,若插入的数据值不在分区字段已有值内,则数据库自动为该表创建一个以该值为分区值的分区,然后将数据插入该分区。
间隔分区作为范围分区的扩展,实现了数据库分区的自动化,为避免以往DBA手动编写繁琐的存储过程、定期或不定期实施拆分分区操作带来便利。
间隔分区表建表语法如下:
create table table_name(...)Partition by range (column_name)Interval ( ... ) [store in (tablespace1,tablespace2 ...)](Parttition partition1 values less than (...) [tablespace1],Parttition partition2 values less than (...) [tablespace2]);


为规避业务高峰期间隔分区造成数据阻塞,通过提前往该类分区表中插入一条数据,实现分区表预分区。
例如:按月进行间隔分区的表,通过定时任务在每年12月30日,提前插入时间为未来1年每月1号的数据共12条,当完成分区创建后删除该数据。
按日分区类似,向该间隔分区表插入未来全年每一日数据,待数据插入完后删除该数据达到提前分区的目的,避免创建表分区造成数据库阻塞。


1、系统运维过程中任何小的问题,若不及时发现解决,当大业务并发来临时,该问题可能被无限放大,最终演变成生产事故,造成业务损失。因此日常系统维护需要做好巡检,不放过任何小问题,潜在问题,防患于未然。
2、任何技术手段为我们带来便利同时,我们要充分把握其特点和潜在的不足,要充分了解其特性,预防特定场景下产生的不良影响,防微杜渐。

完

顾问:许国平 李湘宜
赵晓玲 张刚
总编:孙鹏晖
美编:孙鹏晖

长按二维码,关注我们吧!

-本文为“数风云”第13期文章;
-转载本公众号文章请联系我们;
-欢迎来稿:请按“题目-作者”格式命名发送到sunpenghui@abchina.com。




