如何在生产环境安全地添加大表索引_Online DDL与gh-ost工具

张开发
2026/4/18 17:54:17 15 分钟阅读

分享文章

如何在生产环境安全地添加大表索引_Online DDL与gh-ost工具
MySQL 5.6 加索引默认 INPLACE 模式不重建表但持 MDL_WRITE 锁阻塞后续 DML 的 MDL_SHARED_READ 获取导致连接“卡住”gh-ost 无锁但依赖 ROW 格式 binlog、不支持外键强一致场景切换失败可快速回滚原表安全。MySQL 5.6 大表加索引卡住连接ALTER TABLE 会锁表吗取决于存储引擎和操作类型。InnoDB 在 MySQL 5.6 支持部分 ALTER TABLE 的 Online DDL但「加索引」默认仍是 INPLACE 模式——它不重建表但会持有 MDL_WRITE 锁元数据锁直到操作完成。这意味着新连接能连上但后续的 SELECT、UPDATE 等语句若需读取该表结构会被阻塞在等待 MDL_SHARED_READ 锁阶段看起来像“卡住”。尤其在高并发写入场景下容易堆积大量等待线程。实操建议用 SHOW PROCESSLIST 查看是否有大量 Waiting for table metadata lock 状态加索引时显式指定 ALGORITHMINPLACE, LOCKNONE仅当支持时才生效可通过 INFORMATION_SCHEMA.INNODB_TABLES 或错误提示反推是否被降级避开业务高峰且提前在从库验证执行耗时主库执行期间从库 IO/SQL 线程也可能延迟gh-ost 能完全替代 ALTER TABLE 吗哪些场景必须慎用gh-ost 是基于 binlog 的无触发器、渐进式迁移工具核心优势是全程不锁原表适合百 GB 以上大表在线加索引。但它不是万能补丁——本质是“双写 切换”意味着它对业务有隐性要求。实操建议必须确保主库开启 binlog_formatROW且 binlog_row_imageFULL不能用于有 ENUM 或 SET 字段含非 ASCII 字符的表旧版 gh-ost 解析异常v1.1.0 已修复但仍建议测试若表有外键约束gh-ost 默认拒绝操作需加 --allow-on-master 和 --cut-over-experimental 才能绕过但切换瞬间外键检查失效务必确认下游无强一致性依赖DDL 过程中禁止手动 DROP 或 RENAME 原表否则 gh-ost 会 panic 并残留 ghost 表gh-ost 切换失败后如何快速回滚原表还安全吗安全。gh-ost 的 cut-over 分两步先原子性重命名原表为 _xxx_del再将 ghost 表重命名为目标名。如果第二步失败如网络中断、权限不足原表仍在只是被临时改名了。此时只要没手动删掉 _xxx_del就能立刻恢复。 Vozo Vozo是一款强大的AI视频编辑工具可以帮助用户轻松重写、配音和编辑视频。

更多文章