研发误删的库,凭什么要 DBA 承担责任
业务研发通常指的是后端研发。国内最主流的技术栈还是 Java,此外 Go 也有一部分,另有全栈的则使用 Node。这些语言通常会配备对应的 ORM 和数据库打交道,Java 的 MyBatis,Go 的 GORM,Node 的 TypeORM 等。
DBA 就是数据库管理员。有些公司即使没有全职 DBA,也会有看着数据库的那个人。
数据库变更工具。公司业务稍微上了规模,一般会选择在专门的数据库变更工具上执行操作。
生命周期
研发在数据库变更工具上提交了一个变更工单。
工具可能进行一些自动化检测,修改字段会提示锁表,删库,删表会警告破坏应用代码的兼容性。
DBA 进行审核。
审核通过后,进行发布。
告警铺天盖地/客诉蜂拥而来,业务一排查,怀疑可能是之前的数据库变更引起的,拉上 DBA,实锤。于是再一起制定补救方案。
经过几天的奋战,最终修复了问题。
开始进行复盘。
场景模拟
ALTER TABLE person MODIFY name VARCHAR (100); 工具没有自动检测出这个风险,进行提示。
DBA 作为专业人员在审核阶段没有发现锁表问题。
最后是由 DBA 去执行了变更操作。
业务研发提交了导致问题的 SQL,但要求业务研发了解这个 MySQL 的执行细节有点强人所难。
业务研发应该为自己的业务负责,包括数据库在内。
问题 SQL 是由业务发起的。业务研发并没有提示业务风险,比如业务的重要性,业务的高峰期等。
DBA 没有识别到这个问题,督查失职。
针对业务团队的几个主张:
工具没有自动检测出这个风险,进行提示。
那好,既然 DBA 引入带自动检测的工具反而留下把柄,那大家还是提交在文档上吧,完全没有自动化检测。
DBA 作为专业人员在审核阶段没有发现锁表问题。
双方这点都有共识,但光这条属于失查,次责。
最后是由 DBA 去执行了变更操作。
是 DBA 执行还是研发执行,这是流程的设计。谁去点执行按钮都改变不了这次故障的发生。
业务研发提交了导致问题的 SQL,但要求业务研发了解这个 MySQL 的执行细节有点强人所难。
但在实际 PK 中由 DBA 承担主责的情况时有发生,往往是因为第 3 点,最后是由 DBA 点了发布按钮。但就像上面说的,我认为这点是站不住脚的。流程设计让 DBA 点那下,是因为由 DBA 来点效率是更高的,但如果因为 DBA 点了而要背锅,那 DBA 就会拒绝这个流程,甩给研发自己去发布,这样流程只会更加低效。这里也要澄清一下,也不是 DBA 点就一定是更高效的流程,但只想表达定责应该和谁最后点发布那一下无关。
场景泛化