← 中文资源

简体中文版本

保护 MySQL 在线 DDL 变更

判断 ALTER 能否使用 INPLACE 或 INSTANT,设置锁与超时限制,对无法在线的变更改用影子表工具。

阅读英文原文

概述

错误的算法会让一次 ALTER 长时间锁表,阻塞所有写入并堆积连接。明确指定算法与锁策略,可使服务器在不支持在线执行时快速失败,而不是悄悄锁表。

关键步骤

  1. 先确认当前版本下该变更是否支持 INSTANT 或 INPLACE。
  2. 显式指定 ALGORITHM 与 LOCK,使不能在线执行的计划被拒绝。
  3. 设置 lock_wait_timeout,避免 DDL 长时间排在长事务之后。
  4. 对无法在线的变更,改用复制并切换的影子表工具。

验证

  • DDL 明确声明算法与锁策略。
  • 不支持在线时操作快速失败而非静默锁表。
  • 长事务不会让 DDL 无限排队。
  • 影子表方案下原表写入不中断。

注意事项

  • 即便不锁写入,在线 DDL 仍消耗 CPU 与 IO,并可能影响复制延迟。
  • 变更主键类型等操作永非完全在线,必须借助工具。

适用范围

本条目围绕「保护 MySQL 在线 DDL 变更」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

ALTER TABLE orders
  ADD COLUMN channel varchar(32) NULL,
  ALGORITHM=INSTANT, LOCK=NONE;
-- if this errors, use an online schema-change tool