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

安全生产季 | 如何玩转分区表?

数风云 2020-09-29
156
点击“数风云”关注我们吧

文/毛思平


为进一步做好信息系统安全生产,近期对过去三年发生的数据库使用问题进行了一次全面分析回顾,现将其中比较典型的案例分享给大家。希望大家通过这些典型案例举一反三,夯实数据库知识体系,提高数据库开发管理水平,规避类似问题发生,提升应用系统生产安全稳定性。



业务场景


公司某系统双十一凌晨出现大面积阻塞、数据库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。



文章转载自数风云,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论