安全生产使用指南
一. 简介
安全生产是应对当前生产过程中的因为业务域不兼容的变更、升级回滚、DS设计约束等操作带来的一些数据风险,主要应用于业务域的发布过程。安全生产与非安全生产最大的区别就是业务方所有的表结构的增删改相关DDL都需要业务同学手动执行,让发布操作有一个显示确认的过程,不再是一个DS侧的黑盒操作。
二. 安全生产环境配置
Trantor 通过配置的方式去控制后端的 Exception 是否抛到页面,为了用户体验和系统安全考虑,请在正式生产环境配置:WEB_ADVICE_DEAL_ORIGINAL_EXCEPTION=false
1. 新建安全生产运行环境
-
如果当前交付控制台不存在运行环境,则执行发布时会找不到运行环境,需要新建运行环境,
home-> 运行环境 ->点击任意元信息
-
点击下图创建运行环境按钮进行运行环境创建

-
如果当前研发态已经存在运行环境,但是运行环境没有开启安全生产,则切换到运行环境后,点击左上角切换为运行环境管理,增加运行环境配置


-
新增运行环境,配置必要信息,并开启安全生产(安全生产默认情况下不开启)

-
安全生产运行环境配置成功
2. 发布业务域
-
向安全生产环境发布元信息

-
执行发布计划,填写token,安全生产环境会显示出待执行的DDL,可以根据具体的业务场景排查待执行的DDL的影响范围,是否存在丢数据风险等, 确认待执行的DDL没有丢数据影响后,手动在运行态对应的数据库中执行待执行DDL中的SQL语句,执行无误后回到交付控制台执行完成计划操作。

-
再次输入 token 并完成计划进行发布
-
如果执行SQL过程中报错,则需要根据回滚SQL进行手动回滚,保证运行态表结构的准确性,但是已经删除的表字段或者表数据不会被回滚,trantor安全生产不会进行数据库备份,如果考虑丢数据风险,并且数据较难恢复,则需要在发布前手动备份。
三. 安全生产与非安全生产的不同点
非安全生产,DDL是DS执行的,而安全生产,界面上会返回DDL,需要用户自己到数据库执行,执行完了回到发布计划点击确认,只有确认成功了本次发布才会成功,如果发布失败,需要自己执行回滚SQL。
- 非安全生产 -> 一阶段,DDL由DS执行,如果失败DS会自动回滚
- 安全生产-> 二阶段,DDL由业务同学自己执行,如果执行失败了需要业务同学执行回滚SQL,保证表结构的正确性
四. FAQ
1. 不开启安全生产时发布成功,开启安全生产后,手动执行DDL会报错
-
检查DS侧是否有脏数据
-
根据SQL执行报错有针对性的检查
-
检查DDL报错模型的定义是否符合Trantor开发规范
2. 不开启安全生产正常发布,开启安全生产后,DDL执行无误,但是点击完成计划报错:Transaction commit but NOT_STARTED
-
检查DS服务报错或者发布失败原因

-
可以看到,开启了安全生产之后,DS侧对模型定义以及关联关系等的检测会更加严格,一些不符合规范的关联关系定义会被DS透出,并发布失败,业务同学在开发的时候要多比对Trantor模型定义规范,看是不是存在错误的模型关联关系.
-
这个异常是模型定义和表结构不一致,非安全生产时不会进行校验,但是安全生产是会检查的,因为DDL交给了使用方去操作,要进行校验DDL是否执行,如果存在不一致则说明DDL执行有失误,则报发布失败。对于安全生产来说,除非出现操作错误或者未知bug,不然一定是:旧的模型定义+DDL=新的模型定义
-
检查是不是存在以前的发布计划没有执行成功,但是ddl已经手动执行却没有手动回滚,这样会导致表结构的不一致,而且创建新的发布计划再进行发布时很可能无法返回DDL,导致表结构永远不一致,后续发布计划都会报错
3.本地环境开启安全生产,没有返回DDL,或者返回的DDL不完整
因为本地启动的Trantor底座和线上环境的上报发布逻辑不太一样,本地在上报操作时,已经进行了发布操作,上报发布是一体的,上报的同时新的表结构就已经生效了,所以本地安全生产开启是无法验证很多场景的,本地环境也没有必要开启安全生产
4. base模块开启安全生产,DDL执行成功,但是完成计划时报错,模型不存在
目前因为Trantor机制问题,base模块不建议安全生产模式发布