INPLACE 改表时一直有人在写,它怎么收尾
INPLACE 重建表的大部分时间里,别人照常读写。这期间的写入先记进 row log。
我原本担心:写入一直不停,row log 永远补不完,ALTER 岂不是结束不了?
它不等 row log 变空:
- 先在不挡写的状态下,把 row log 追到当前末尾。
- 拿 MDL 写锁,挡住新的写入。
- 剩下的尾巴是有限的,补完就把新表换上去。
如果写入速度比补的速度还快,row log 会一直变大,超过 innodb_online_alter_log_max_size 就报错回滚,ALTER 失败。所以大表改结构,最好挑写入少的时段。