数据库主备切换完成,VIP 已经指到备库,应用日志还在报 2003 Can't connect to MySQL server。连接池里 20 个连接全部指向旧 IP,重启实例后才恢复,中间停了 6 分钟。日志里能对上时间点,这种反而好排。
连接池建立后一直复用已有 TCP 连接,VIP 漂移对它们没有影响,旧主库下线后这些连接只剩超时。池子没配连接有效性检测,坏连接不会主动淘汰。这一点先确认清楚,后面就不用反复试。
SHOW VARIABLES LIKE 'hostname'; SELECT @@read_only, @@server_id; curl -s localhost:8081/actuator/metrics/hikaricp.connections.active
「连接池未重建」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
改完顺手把文档补一句,省得下次自己重新推一遍。
处理上按这个顺序:打开 connectionTestQuery 或者用 JDBC4 的 isValid 做空闲检测;maxLifetime 设得比数据库 wait_timeout 短 让连接定期重建;切换脚本里加一步 调 actuator 的池刷新或者滚动重启;切换后立刻查一次 server_id 确认连的是新主库。
结果对不对很好判断,切换后 1 分钟内所有实例查询返回新主库的 server_id,日志里不再出现 2003。
