工行“去O”数据库选型与分布式架构设计( 七 )


坑二:在MySQL 5.7中 , 表的TRUNCATE操作存在bug , 对应编号68184 , 会阻塞整个数据库实例上的所有其他交易 , 所以对大表进行TRUNCATE操作会影响整个MySQL数据库的处理性能 , 即使是访问不想关的表也会收到影响 。
此时你就会收到一群开发人员的请求 , 哎呀 , 数据库夯住了 , 求救啊 , 实际上解决方案也很简单 , 因为Drop语句不受影响 , 所以映射为DROP+CREATE的操作即可规避该bug , 而MySQL 8.0也将其进行了同样的映射 。所以我们将其固化到设计开发规范中 , 提醒相关人员进行注意 , 同时在工具中增加TRUNCATE关键字识别检查 , 做到提前预防 。
坑三:MySQL的超时中断 , wait_timeout参数 , 即MySQL客户端的数据库连接闲置最大时间值(秒) , 我行设置为1小时 , 如果长连接的空闲时间超过该参数设置时间 , 数据库连接就会被MySQL主动断开 , 而中间件的连接池的连接就处于“假活“状态 , 一般的建议方法就是增加心跳监测 , 使用dbcp设置testWhileIdle、validationQuery等参数 , 如果跟我行一样使用WAS的 , 在WAS控制台上设置时效超时的参数即可 。
坑四:Replce Into引发的自增列主键冲突bug , 对应编号73563 , 主库在执行replace操作时 , 如果有数据冲突 , 会转换为一笔delete+一笔insert , 所以主库无问题 , 但是binglog记录的为update操作 , 备库重做update动作 , 更新主键 , 但由于update动作不会更新自增列值 , 导致更新后记录值大于自增列值 。
当此时发生主备切换时 , 备库提升为主库 , 插入的自增列主键会取自增列的值 , 从而引发主键冲突 。解决方案也属于应急方案 , 可以在发生问题时 , 通过ALTER语句将自增列增加;另一种解决方案 , 可以在replace into之后开启一个新的事务 , 插入一条无意义的记录然后删除掉 , 可以保证主备一致;最后一种解决方案 , 是直接用雪花算法计算递增序列号 。
以上就是我的分享 , 谢谢 。

【工行“去O”数据库选型与分布式架构设计】


推荐阅读