案例:分库分表与SELECT * 发生的线上问题

其他人踩的坑

环境说明:MySQL数据库中间件使用的是myhub
电商有一张MySQL表是分表的,的同事在给该表加字段的时候,存在一个阶段是,部分分表已经加字段成功,部分分表还未执行变更。

在该阶段,如果服务执行查询SQL,且SQL的写法为【select * from tab】,MyHub下发SQL到分表执行,会导致MyHub检查到本次查询的字段不一致,已变更的分表比未变更的分表多一个字段,然后抛java.sql.SQLException: Unknown error,会导致SQL和接口报错

我的亲身经历

我在给另一个关联关系表,该表是分表(256张分表),加字段提交到线上的变更的时候,审批的同事问我是否有使用select *的SQL,经过提示,我才意识到可能会踩同样的坑。

如何规避

  1. MySQL中间件和我们中间件一样存在该漏洞,变更是串行执行,且也会校验字段是否一致
  2. 要加字段的表是分表设计的
  3. 针对上述表,有select * 的SQL

同时满足上述3个条件才会踩到这个坑,破坏任一条件都不会踩到这个坑,不过对普通开发来说,可能最好的规避手段就是在分库分表的同事不要使用 select *

TODO: 后面抽空补充我们的表设计,和加字段sql,以及我们规避select * 使用的最佳实践

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值