镇楼图

研制误删的库,凭什么要 DBA 承当职责

三个人物

删库以及更广泛的数据库改动场景中有三个人物,事务研制,DBA 以及运用的数据库改动东西:

  • 事务研制一般指的是后端研制。国内最主流的技能栈仍是 Java,此外 Go 也有一部分,还有全栈的则运用 Node。这些语言一般会配备对应的 ORM 和数据库打交道,Java 的 MyBatis,Go 的 GORM,Node 的 TypeORM 等。
  • DBA 便是数据库管理员。有些公司即使没有全职 DBA,也会有看着数据库的那个人。
  • 数据库改动东西。公司事务稍微上了规模,一般会挑选在专门的数据库改动东西上履行操作,开源的产品里比较主流的有 Archery, Yearning, Bytebase。

生命周期

告知完进场人物,咱们再来说一下,数据库改动的整个生命周期:

  • 研制在数据库改动东西上提交了一个改动工单。
  • 东西可能进行一些自动化检测,修改字段会提示锁表,删库,删表会正告损坏应用代码的兼容性。
  • DBA 进行审阅。
  • 审阅通往后,进行发布。
  • 告警铺天盖地/客诉蜂拥而来,事务一排查,怀疑可能是之前的数据库改动引起的,拉上 DBA,实锤。所以再一起制定弥补计划。
  • 经过几天的奋战,最终修复了问题。
  • 开端进行复盘。

上一期回顾的 Linear 删库毛病便是这样一套流程。到了复盘阶段,国外遍及选用 blameless postmortem,对事不对人,但国内一般会给毛病定主责和次责。安全生产的视点来说,定职责人的威慑力必定更强。但关于数据库改动,往往一出便是大毛病,承当主责往往意味着全年绩效最低档。所以每逢事务研制和 DBA 还有他们的主管走进会议室,都会很仔细地想着怎样一起复盘。

场景模仿

咱们先来模仿一个场景:

事务研制想在 MySQL 8.0 上把一个 VARCHAR 列的长度从 20 改成 100:

ALTER TABLE person MODIFY name VARCHAR (100);

研制在数据库改动东西上提交了这个句子,由于 DBA 也读了 MySQL 8.0 官方文档,知道 MySQL 8.0 修改列不会锁表导致不可用,所以审批经过,然后 DBA 履行这条句子。事务居然挂了!本来 MySQL 8.0 里当把 VARCHAR 长度修改为超越 64 时,仍是会锁表的!

切回复盘室里仔细评论的气氛。事务团队建议 DBA 主责,事务研制次责,由于

  • 东西没有自动检测出这个危险,进行提示。
  • DBA 作为专业人员在审阅阶段没有发现锁表问题。
  • 最终是由 DBA 去履行了改动操作。
  • 事务研制提交了导致问题的 SQL,但要求事务研制了解这个 MySQL 的履行细节有点强人所难。

DBA 团队建议事务团队主责,DBA 次责,由于:

  • 事务研制应该为自己的事务负责,包含数据库在内。
  • 问题 SQL 是由事务发起的。事务研制并没有提示事务危险,比如事务的重要性,事务的顶峰期等。
  • DBA 没有识别到这个问题,督查渎职。

好了,到了这里两头其实都有各自的道理,小伙伴们能够停下来考虑一下,更倾向于如何定责。下面说一下我的观念。

我认为这个状况应该是**「事务团队主责,DBA 次责」**。

针对事务团队的几个建议:

东西没有自动检测出这个危险,进行提示。

那好,已然 DBA 引入带自动检测的东西反而留下凭据,那我们仍是提交在文档上吧,完全没有自动化检测。

DBA 作为专业人员在审阅阶段没有发现锁表问题。

双方这点都有共识,但光这条属于失查,次责。

最终是由 DBA 去履行了改动操作。

是 DBA 履行仍是研制履行,这是流程的规划。谁去点履行按钮都改动不了这次毛病的产生。

事务研制提交了导致问题的 SQL,但要求事务研制了解这个 MySQL 的履行细节有点强人所难。

没有错,但咱们来换一个视点。研制写代码调用了一个 API,让 API 的维护者审阅一下。结果 API 维护者也没有审阅出来一个 bug,上线后导致毛病。研制的确能够说让他了解 API 的实现细节有点难,可是研制为了完成自己的使命,运用了一个自己不熟悉的 API,那是不是应该由自己承当危险?

但在实践 PK 中由 DBA 承当主责的状况时有产生,往往是由于第 3 点,最终是由 DBA 点了发布按钮。但就像上面说的,我认为这点是站不住脚的。流程规划让 DBA 点那下,是由于由 DBA 来点效率是更高的,但如果由于 DBA 点了而要背锅,那 DBA 就会回绝这个流程,甩给研制自己去发布,这样流程只会愈加低效。这里也要澄清一下,也不是 DBA 点就一定是更高效的流程,但只想表达定责应该和谁最终点发布那一下无关。

场景泛化

咱们再进一步把这个场景泛化一下。在笔直事务团队和横向平台团队的协作中,由于事务开发形成的毛病,一般应该都由事务团队承当主责,否则的话,就会形成权责不对等,把平台团队面向消极合作的状况。

这个就像教师带着小朋友和家长们集体活动,照看小朋友的第一职责人始终是家长,如果要让教师承当主责,大概率就不会组织活动了。当然这也有破例,比如假设教师罔顾家长的嘱托,携带小朋友参加不适合的活动,形成意外,那便是教师的职责了。

回到模仿的场景,事务研制应该做的,是给 DBA 更多的事务危险提示,比如说哪些顶峰时段不能做改动。如果研制说了这些,可是 DBA 仍然置之不理,发布形成事端,那 DBA 也自然难辞其咎。

毛病定责是一个剧烈的论题,关乎到我们的奖金,加薪,升职。本文测验给出一个断定的原则,也欢迎我们留言讨论。回忆起那些年参加过的复盘会议,就像抄起刚一起肝完的啤酒瓶,朝对方铺天盖地扔了曩昔。我心中不由泛起丝丝寒意,想到了鲁迅的呼吁:

「 从来如此,便对么?」


更多资讯,请关注 Bytebase 公号:Bytebase