MySQL

INPLACE 改表时一直有人在写,它怎么收尾

INPLACE 重建表的大部分时间里,别人照常读写。这期间的写入先记进 row log。

我原本担心:写入一直不停,row log 永远补不完,ALTER 岂不是结束不了?

它不等 row log 变空:

  1. 先在不挡写的状态下,把 row log 追到当前末尾。
  2. 拿 MDL 写锁,挡住新的写入。
  3. 剩下的尾巴是有限的,补完就把新表换上去。

如果写入速度比补的速度还快,row log 会一直变大,超过 innodb_online_alter_log_max_size 就报错回滚,ALTER 失败。所以大表改结构,最好挑写入少的时段。

esc