假设有 user 微服务和 user 表.
user 微服务新增了一个迭代 v1.0.2 ,但是有一个 break change ,需要:
目前有两种方案:
这里只是举一个例子。
方案 1 感觉用的不少,但个人感觉线上 ddl 还是选择方案 2 dba 处理更稳妥一点, 特别是数据量大时涉及到锁表啥的。
请问什么情况下使用方案 1 ,什么情况下使用方案 2 ?想要各位后端大佬们的一些好的实践方案。
![]() | 1 sagaxu 269 天前 大表加个字段可能要锁表几个小时,DBA 处理可以缩短到秒级 |
![]() | 2 zakokun 269 天前 ![]() 删除字段这个行为没必要,线上业务从来不应该删除字段;即使要删除,那也是稳定运行了 N 个版本以后,确认没影响了才删除,谁会一上线就急匆匆的删除字段啊 只要不删除字段,那就是正常发布就行了,先加字段,然后发新版本,没啥特别的 |
![]() | 3 EricXuu 269 天前 via Android 先找 dba 加字段赋默认值,然后起一个刷数服务刷数。 删除字段不必要。确实要删,先去掉代码里的引用,稳定几个版本后删字段。 |
![]() | 4 JYii 269 天前 ![]() 通常 DDL 操作都要走 OA 审批,到 DBA 去操作。 一个点是让开发操作少一点风险;另外一点数据库分配给 web 服务的权限不足,没法操作。 当然你要说你有权限,那应该默认你可以随便搞 |
![]() | 6 billzhuang 269 天前 postgres 几乎没有这个问题。 |
![]() | 9 xuelu520 268 天前 不走 migrate 。 加入大表加字段什么的操作,锁表好久呢,这种肯定要闲时半夜去执行的。 另外有些字段是要先上线的,不好控制时间。 |
10 ilucio 268 天前 dba 操作就没事了,rename 的时候找一个 |
13 Tidusy 268 天前 我这边刚出了一个线上故障。新增字段设置了默认值,上线后 auto-migrate 直接往存量数据刷数,把数据库卡了 |
![]() | 15 kivmi 267 天前 mysql> alter table sbtest1 add column create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', algorithm=instant; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> alter table sbtest1 add column update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间' ,algorithm=inplace; Query OK, 0 rows affected (1 min 16.38 sec) Records: 0 Duplicates: 0 Warnings: 0 这是 1000w 的表两种算法 DDL 修改的效果,而 algorithm=instant 是 mysql8.0 默认的算法,algorithm=inplace 是 mysql5.7 默认的算法,也就是说对于 mysql8.0 来说,并不需要 rebuild 数据表。 |
16 dayeye2006199 267 天前 via Android 你们公司还有 dba ?? |