MySQL大表DDL操作

MySQL大表DDL操作

概述

MySQL大表(千万级+行)执行DDL操作(如添加字段)时的快速方案选择。核心问题是传统DDL会锁表和全表复制,导致线上服务中断。

MySQL版本演进

版本特性说明
5.5及以前COPY算法全表复制,全程锁表
5.6+Online DDL (INPLACE)允许并发DML,但仍需重建数据
8.0.12+INSTANT ADD COLUMN只改元数据,毫秒级,仅限末尾加列
8.0.29+INSTANT任意位置加列放宽了位置限制

INSTANT的限制

  • ❌ 添加列的同时添加索引
  • ❌ 列涉及外键
  • ❌ ROW_FORMAT=COMPRESSED
  • ❌ 表含全文索引
  • ❌ 临时表

第三方工具

gh-ost(GitHub)

  • 解析binlog同步增量数据,无触发器
  • ⭐ 13,300+ Stars
  • 适合高并发写入场景
  • 支持暂停/恢复/回滚

pt-online-schema-change(Percona)

  • 使用触发器同步增量数据
  • 高并发写入时触发器开销较大
  • 上手简单,Percona Toolkit的一部分

对比

  • 高并发 → gh-ost(无触发器)
  • 低并发/已有经验 → pt-osc
  • MySQL 8.0+ → 优先INSTANT

操作前检查清单

  1. 表大小、行数、索引大小
  2. 外键约束
  3. 主从延迟状态
  4. 磁盘剩余空间(至少表大小的2倍)

相关实体

  • [[mysql]] — 数据库系统
  • [[gh-ost]] — GitHub开源DDL工具
  • [[pt-online-schema-change]] — Percona DDL工具

来源

  • IMA知识库「κ的知识库」原始收藏
  • MySQL 8.0 Reference Manual