快捷搜索:

DBA在系统设计、开发中的重要性

许多利用系统的机能或稳定性并不抱负,这在系统上线后不久就徐徐变为棘手的问题,造成这些问题的缘故原由,每每表现了一点:开拓设计这些系统的人,对数据库本身不是很懂得!而DBA又不懂得营业!这就导致了很多原先可以避免的问题孕育发生;另一方面,跟着数据库自我调剂、治理的能力赓续加强,而利用又每每是系统机能最大年夜的杀手,以是,DBA的事情范畴,从只认真数据库办事器掩护,慢慢走向治理利用系统的设计、开拓,是一定的趋势!

一、 现阶段DBA对系统机能及稳定性所做的调剂事情

今朝DBA对系统机能的调剂事情大年夜致是这么几个方面:

1、 在硬件层面进行调优,这平日便是直接费钱,买设备、扩容。

2、 在DB层面进行调优,比如调剂初始化参数,调剂数据库物理布局。

3、 对利用的SQL进行优化,比如在数据库阐发statspack,调剂Top SQL。

4、 只有异常少数的,平日是对系统稳定要求较高的一些公司的利用,才会在新的利用上线前,让DBA对sql进行充分的审核与评估。

问题:在利用系统的阐发、设计、开拓阶段,就今朝环境看,很少有DBA介入,而利用系统上线或者开拓事情基础停止后,DBA所能做的调优事情着实是很有限的。

二、 许多利用系统的机能或稳定性仍不抱负

许多利用系统的机能并不抱负,或者系统数据会呈现一些难以重现的稀罕的差错,这些问题(尤其是机能问题)无意偶尔并不是在系统初期就会表现出来,然则跟着系统的运行、数据的增多而慢慢变得难以办理,给系统后期的功能扩展和用户应用上带来了不少麻烦,造成这些问题的缘故原由,每每表现了一点:开拓、设计这些系统的人不懂得数据库!以基于Oracle的利用为例,简要举例阐明:

底层数据布局分歧理

因为缺少专业DBA的帮忙,很多系统设计出来的底层数据库表布局问题重重。而做过系统的人都知道,底层数据库布局分歧理,带来的改造价值之大年夜险些即是一次重构!我见过一个OLTP系统,其核心表竟有100个字段,匀称一笔记录跨越8K,假如按Oracle默认的8K一个Block,一半以上的行必须孕育发生行链接!

而最糟糕的是,设计这样表布局的人还觉得自己充分使用了冗余来低落表之间的连接,事实上,其人根本不晓得什么是范式、什么是更新非常,按照范式,这个表应该拆分为两个表的,但假如要改险些所有的法度榜样都要改!虽然范式不是越高越好,但绝对是设计的人必须吃透的一个器械。在冗余上,信托大年夜多半DBA都觉得,级联更新的价值是异常高的,是以冗余该当避免发生级联更新的环境,对付关系型数据库设计中冗余的应用,毫不是门很轻易掌握的技术。

分歧理的底层数据库布局设计,给系统的机能埋下了重磅的准时炸弹,这个系统在客户那里跑不到一年,数据量轻细上去些,机能、稳定性就直线下降,而重构的资源又极高,买新办事器肯定是只能治标。而要是底层数据表布局是资深DBA设计的又会若何?当然,假如完全让DBA去做数据库表布局的设计,DBA就必须异常清楚地懂得全部系统的营业细节信息,这在DBA来说,人力资本上是有必然艰苦的,终究掩护好线上办事器就已经占用了DBA很多的资本,并且引导们平日更珍视这点。

很少有引导能熟识到DBA在系统开拓设计中所起到的感化,和掩护线上系统、处置惩罚DB故障比拟,对全部系统的稳定性和机能,是同样紧张的!

SQL机能问题

系统的开拓,平日和DBA是没有什么关系的,然则,假如DBA对系统有足够的懂得,这时刻也是可以做不少供献的。比如,反省系统营业的数据流是否精确,这个必要经由过程一些手段,比如sqltrace、10046等,具体对系统的逻辑实现进行反省,一方面查出系统中过于耗损资本的或编写不规范的SQL及时进行调剂优化,另一方面,查出系统平分歧理的数据库造访,不要到了线上才发明问题,那时可能已经宕机了。简单举个例子,当一个页面必要多处显示商品的类目列表时,法度榜样每每轻易犯一个差错,便是多次以同样的SQL读掏出同样的数据,并利用于每一个列表显示上,假如你只读取一次,或者干脆在Web层进行cache(要有适当的刷新策略),就可以大年夜大年夜削减单次造访该页面在DB上的I/O耗损。无意偶尔以致会反省出根本不必要被履行的SQL,也在这些和自己绝不关连的功能中频繁地履行着……同时,对数据流的反省还能够查出一些暗藏得较深的系统Bug,这个更必要基于DBA对营业细节的懂得。

谁说DBA只会费钱?假如一个办事器I/O负载达到极限,大年夜多半人只能选择扩容,最多重构部分功能来作些优化,而从statspack每每可以看出,系统的I/O资本多半是被一些并不该如斯频繁履行的SQL给占用了,它们单次履行并不慢,但占用系统资本比例却非常高,这些问题,细化在每一个营业中,对这些问题的反省和数据流优化,便是对系统资本的最大年夜节省,便是省钱!这个事情,或许只有DBA才能称职。

并发问题

谁都知道系统有并发存在,可是我们在设计系统的时刻,又每每是按照单一营业的思维模式来设计、编码,很少斟酌同一营业、不合营业之间并发运作可能孕育发生的问题。平日,系统无规律地呈现一些“稀罕的”、“弗成能的”差错,极有可能便是并发惹的祸,而背后的问题,每每表现了设计职员不懂得数据库的锁机制,无法和营业很好地结合。设计的人不懂得数据库,而DBA又不懂得营业,这就导致了很多原先可以避免的问题孕育发生。

最经典的便是Tom Kytes举的酒店预定的例子,当两个办事员同时按下查找预定房间的按钮,结果是两小我都预订到了同一间客房,这个问题很经典,在今朝看来也很轻易办理,不便是加上锁么?然则,这只是一个例子,在你实际利用的系统中,你这样贸然地加上for update,又可能导致其余问题!比如:逝世锁。在一个繁杂的营业系统中,逝世锁不难见到,这个是设计者的设计破绽,必要设计者周全衡量营业关系,然后对表的锁定拟订规则来只管即便避免的。学会应用锁来包管数据的完备性照样不敷的,还要机动利用锁,适当采纳乐不雅锁定。

假如对付紧张的营业,一律免谈,直接消极锁定也是弗成取的,会给系统的掩护带来一些问题,某些营业这样做以致会带来数据的大年夜面积锁准时,在OLTP上的价值很高,严重影响系统并发能力。我曾经碰着一个差错数据的问题,阐发后,确定是两个不合的营业间并发,同时缺少需要的锁定,而造成的差错数据。但基于该营业的特殊性,加锁的价值是昂贵的,在DBA的仔细穷究下,确认了可以经由过程乐不雅锁定也即提交时查验的要领来达到一箭双雕的目的。从这里可以看出,数据的康健和完备性,与系统的并发能力无意偶尔是抵触的,但有履历的DBA能够教你若何获取最佳规划,当然,条件是DBA介入设计并认识营业。

您可能还会对下面的文章感兴趣: