MySQL 连接池复用后请求行为漂移:会话状态泄漏的排查与复位实践
适用场景与现象 同一个接口在生产环境中偶发出现以下现象:有时写入没有立即提交,有时日期相差 8 小时,有时普通查询突然以更严格的事务隔离级别执行。重启应用后故障暂时消失,单独连接 MySQL 手工执行又无法复现。 这类问题常见于使用连接池的 Web 服务、异步任务和批处理程序。连接池归还的是可复用的物理连接,而 MyS
Tag
包含这个标签的文章。
适用场景与现象 同一个接口在生产环境中偶发出现以下现象:有时写入没有立即提交,有时日期相差 8 小时,有时普通查询突然以更严格的事务隔离级别执行。重启应用后故障暂时消失,单独连接 MySQL 手工执行又无法复现。 这类问题常见于使用连接池的 Web 服务、异步任务和批处理程序。连接池归还的是可复用的物理连接,而 MyS
适用场景 本文适用于 MySQL 8.0 使用 InnoDB 的生产环境。典型场景是 SQL 和索引近期都没有修改,但一次批量导入、归档删除或数据分布变化后,原本几十毫秒的查询突然变成数秒;EXPLAIN 显示优化器改走了低选择性索引、错误的连接顺序,甚至全表扫描。 这类问题容易被误判为“数据库负载太高”。真正需要回答
适用场景 本文适用于按时间倒序展示订单、流水、审计日志或消息列表的接口。典型特征是:第一页很快,翻到几千页后响应时间明显上升;数据库 CPU 和磁盘读取随页码增长;接口仍使用 LIMIT offset, size。 示例使用 MySQL 8.0,表结构如下: CREATE TABLE orders ( id BIGIN
适用场景 本文适用于 MySQL 8.0 或已启用 GTID 的 MySQL 5.7 主从/主备架构:监控显示 Seconds_Behind_Source 持续增长,报表、读库或故障切换的恢复点开始不可接受。目标是先确认延迟真实原因,再在不破坏复制一致性的前提下恢复追平。 现象描述 一次订单促销后,主库写入从平时每秒数
适用场景 MySQL 主库所在分区持续增长,/var/lib/mysql 已接近 100%,业务开始出现写入失败、事务提交变慢,甚至因为磁盘写满而触发只读保护。检查目录后发现大量 mysql-bin.000xxx 文件,但不能直接删除:binlog 仍可能被复制从库、增量备份或审计流程使用。 本文适用于已开启二进制日志
适用场景 生产环境执行 python manage.py migrate 后长时间没有结束,应用发布流水线被阻塞;或者迁移最终报出 Lock wait timeout exceeded、OperationalError。这类问题常见于 Django + MySQL/InnoDB:迁移本身很短,却在等待另一条业务 SQL
适用场景 业务接口偶发返回 Deadlock found when trying to get lock(错误码 1213),订单、库存、账户余额或状态流转等事务写入失败;重试后通常成功,但高峰期错误数明显上升。本文以 InnoDB 为例,给出一套可在生产环境执行的取证、定位和治理流程。 死锁不是数据库“故障”:两个或
适用场景 业务表按租户、状态和创建时间查询列表。数据量从几十万增长到千万级后,接口 P95 延迟突然升高;应用监控中数据库耗时占比明显增加,但 CPU 和磁盘利用率并不一定很高。 本文以常见的订单列表为例,说明如何确认“建了索引却没有用好”的联合索引问题,并在不影响线上写入的前提下完成优化。 现象描述 接口执行的 SQ
适用场景 本文适用于线上 MySQL 出现以下情况: 接口偶发变慢,慢查询集中在 ORDER BY、GROUP BY、DISTINCT、复杂分页或报表 SQL 上。 数据库实例的磁盘使用率短时间上涨,过一段时间又自动回落。 tmpdir 所在分区 IO 使用率升高,甚至出现 No space left on devic
适用场景 这篇文章适用于 MySQL 5.7、MySQL 8.0 或兼容 MySQL 协议的数据库中,执行 ALTER TABLE、CREATE INDEX、DROP INDEX、TRUNCATE TABLE 等 DDL 时长时间不返回,同时业务侧出现接口变慢、连接数升高、写入卡住等问题的场景。 元数据锁的英文是 Me