用 raw_connection() 打开但没关闭的僵尸连接
时间: 2026-04-18 19:02:57
(部分内容来自网络,其真实性存疑,为了避免对您造成误导,请谨慎甄别。)
好,看到结果了。问题很清楚:
🎯 凶手找到了
连接ID 10、11、9 这三个 Sleep 状态的连接,空闲时间分别是:
- ID 10:空闲了 10111秒(约2.8小时)
- ID 11:空闲了 9992秒(约2.8小时)
- ID 9:空闲了 140秒
这些就是你之前用 raw_connection() 打开但没关闭的僵尸连接!它们一直占着茅坑不拉屎,导致表被锁。
🔪 立刻执行,杀了它们
KILL 10; KILL 11; KILL 9;
杀了之后验证一下
SHOW PROCESSLIST;
应该看不到那几个 Sleep 连接了,表锁立刻解除。
📝 总结一下你踩的坑
| 你做的事 | 后果 |
|---|---|
connection = engine.raw_connection() | 打开一个连接 |
df = pd.read_sql_query(sql, connection) | 用这个连接查数据 |
没有 connection.close() | 连接永远不关,变成僵尸 |
| 再次操作同一个表 | MySQL 看到有旧连接还活着 → 锁表 |
✅ 以后记住这个模板
# 方式1:最简单,不会错
df = pd.read_sql_query("SELECT ...", engine)
# 方式2:非要用raw_connection,必须加with
with engine.raw_connection() as conn:
df = pd.read_sql_query("SELECT ...", conn)
# 出了with自动关闭,100%不会留僵尸杀了那三个ID,问题解决。妈的这破坑害了多少人。