作者小头像 Lv.1
24 成长值

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

暂无数据
个人勋章
TA还没获得勋章~
成长雷达
15
9
0
0
0

个人资料

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

暂无数据

达成规则

发布时间 2026/10/18 16:30:24 最后回复 yd_229207802 2026/10/22 22:43:20 版块 数据库
14 4 0
他的回复:
结论:Online DDL 的核心是“只在开头和结尾短暂持有元数据锁(MDL),中间重建或修改期间允许并发读写”,而能否不锁表取决于 ALGORITHM 能选到哪一级。一、原理(以 ALGORITHM=INPLACE 重建表为例)1. 准备阶段:获取 MDL 写锁,创建新的临时 .ibd 和数据字典,随后降级为 MDL 读锁,放开 DML。2. 执行阶段:后台扫描原表聚簇索引写入新表;期间的 INSERT/UPDATE/DELETE 记录到 row log(大小受 innodb_online_alter_log_max_size 限制,超出会报错回滚)。3. 提交阶段:再次升级为 MDL 写锁,回放 row log 中剩余的增量,原子替换新旧表,释放锁。8.0.12 起还有 ALGORITHM=INSTANT,只改数据字典,不动数据文件,秒级完成。二、哪些操作基本不阻塞 DML1. INSTANT:末尾加列(8.0.29 起任意位置)、删列(8.0.29+)、修改列默认值、重命名表、修改 ENUM/SET 末尾追加成员。2. INPLACE 不重建表:添加/删除二级索引、重命名列(类型不变)、扩展 VARCHAR 长度且长度前缀字节数不变(utf8mb4 下 varchar(50)→varchar(100) 跨过 255 字节边界,会退化为 COPY)。3. INPLACE 需重建但允许并发:增删主键(加主键需列 NOT NULL)、调整列顺序、OPTIMIZE TABLE、修改 ROW_FORMAT。三、会阻塞写的操作:修改列数据类型、转换字符集、删除主键但不新加、添加全文/空间索引(INPLACE 但只能 LOCK=SHARED)。四、实操建议1. 显式写明期望:ALTER TABLE t ADD INDEX idx_a(a), ALGORITHM=INPLACE, LOCK=NONE; 不支持时会直接报错而不是悄悄降级为 COPY。2. 执行前先看 SHOW PROCESSLIST 有无长事务,否则开头拿 MDL 写锁会被阻塞,并把后续所有查询堵在 “Waiting for table metadata lock”;可先 SET lock_wait_timeout=5 兜底。3. 大表或需要 COPY 的变更,用 gh-ost / pt-online-schema-change,并注意主从延迟。