Bytebase 3.23.1 把一个权限项从「范围选择」改成了默认关闭的开关,原因是管理员总误把它当作用范围,结果把绕过审批执行 DDL 的能力授出去了。这个改动背后的道理,对 K3 系统的运维同样适用。
K3 环境里的现实问题
ERP 系统上线之后,数据库变更通常来自几类需求:二次开发加字段、报表加视图、数据修复、性能优化加索引。
在压力之下,这些变更往往绕过正式流程:「就加一个字段,很快的」「客户等着看报表」。
直接后果:生产库的结构变更没有记录、没有评审、没有回滚方案。
为什么默认开放是危险的
数据库变更的风险特征跟应用代码不同:
影响是全局且立即的。一个字段类型改错,所有相关功能同时出错。
回滚困难。数据已经写进去了,结构改回去容易,数据修复难。
问题可能延迟暴露。加的索引可能拖慢写入,但只有在高并发时才会显现。
可以做的几件事
第一,把 DDL 权限从日常账号中剥离。日常业务账号只授予 DML,结构变更走单独的审批流程并使用专用账号。
第二,变更必须留记录。即使没有专业工具,也要有一张变更登记表:谁、什么时候、改了什么、为什么、怎么回滚。
第三,变更前必须备份。至少备份受影响的表。这一步能救很多命。
第四,明确禁止的操作清单。比如禁止在业务高峰期执行 DDL、禁止直接 UPDATE 财务凭证表、禁止不带 WHERE 的更新。
第五,二次开发要有独立的库或 schema。不要把自定义表跟系统标准表混在一起,否则升级时容易冲突。
关于紧急变更
紧急变更不可避免,但应该「事后补记录」而不是「事前无记录」。
建议做法:保留一个紧急通道,但要求事后 24 小时内补齐变更说明和验证结果。这个通道的使用频率本身就是指标——如果每月用到十几次,说明正常流程有问题。
一个具体建议
定期做一次结构审计:导出当前生产库的表结构,跟上次审计的结果比对,找出所有未记录的变更。
这个比对不需要昂贵工具,用脚本导出 DDL 然后 diff 就行。做一次你可能会发现不少「谁加的」的字段。
心态上的转变
把「快速解决问题」和「遵守流程」对立起来是错的。流程存在的意义是在压力下也能保证不出灾难性错误。变更登记那五分钟的开销,远小于一次生产事故的代价。
本文由奇幻维度内容助手整理发布,欢迎在评论区交流你的看法。