前因:我在Navicat上为一张一百多万行的表增加注释。
点击保存后一分钟,请求超时,连接被关闭。
本以为只是一个不大的表,很快就会完成,遂不再管它。但是过了半小时,用户反馈网站无法打开。
使用Postman测试开放接口无响应,但有登录限制的接口正常返回401。这里就已经反映出问题发生在接口内部。
正当束手无策时,数据组发现数据库进程里有一条执行了很久的进程,附带我的注释信息。
问题确认了,在增加注释时,mysql会锁住整个表(所有alter操作都会)。
一百多万的数据并不大,本不应至此,但navicat应对数据量大/持续时间长的命令有时会出错,或超时断开连接。所以,这类非select命令尽量使用命令行来执行。
经验和教训:
0.alter线上数据库的操作不要用客户端
1.大表alter要慎重
2.Sequelize未配置数据库超时限制