在 alter table 时,必然出现了 lock 错误,检查 processlist ,全都是 sleep 状态,然后检查 information_schema.innodb_trx 发现一个活跃状态的连接,于是推测有一个程序执行时,session 没有释放就结束了,从而引发该问题。
进一步发现,使用 flask/sqlalchemy 时,程序异常退出并没有自动释放 session,于是做了全局的异常捕获,然后释放 session,至此问题解决。