MySQL

长事务为什么危险

一个开着不提交的事务,哪怕只读了一下,也会造成两类麻烦:

  1. 拖住 undo 清理:它的快照很旧,在它之后产生的 undo 都不能删,越积越多。5.5 时 undo 放在 ibdata 里,删了也只是文件内部空出来,文件只涨不缩,有人的数据才 20 GB,ibdata 却涨到了 200 GB。
  2. 占着锁:MDL 读锁、行锁都要到事务结束才放。想改表、想改这些行的人都得等。

MySQL 没有规定多长算长事务。排查时可以这样看谁开了很久:

sql
SELECT trx_mysql_thread_id, trx_started, trx_query
FROM information_schema.innodb_trx
WHERE TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) > 60;

trx_mysql_thread_id 就是 KILL 要用的连接号。

esc