首页/数据/数据库速查/gh-ost / pt-online-schema-change 概念
性能与调优57 条

gh-ost / pt-online-schema-change 概念

大表改结构的两大外部工具:pt-osc 用触发器同步增量,gh-ost 读 binlog 无触发器;均可限流、暂停、回滚,适合上亿行表的结构变更。

数据库速查数据更新于 2026-10-13

在线改表工具是什么

对几千万行以上的大表执行 ALTER TABLE,原生在线 DDL 虽然不长时间锁表,但重建过程中的 IO 与临时空间压力仍可能影响业务。gh-ost 与 pt-online-schema-change(pt-osc)是两类成熟的外部工具:做法都是先建一张新表、把数据搬过去、同时持续同步变更,最后用原子 RENAME 换表。区别在增量同步方式:pt-osc 用触发器,gh-ost 解析 binlog 不建触发器。两者都支持限流、暂停与中止。

基本信息

pt-oscPercona Toolkit 组件,靠触发器捕获增量
gh-ost独立二进制,靠解析 binlog 捕获增量,可在从库读取
共同点建影子表 + 增量同步 + 原子 RENAME 切换
限流按负载指标(如 Threads_running)自动暂停拷数据
切换保障先加唯一键避免数据不一致,切换前后做行数比对

典型使用场景

  • 上亿行大表加索引:原生 DDL 影响窗口过长时改用工具分阶段执行
  • 大表改列类型:字符集或类型变更通常需要重建表,工具能把影响摊到长时间窗口
  • 在线补列:为宽表新增列时避免整体重建带来的空间峰值
  • 业务高峰不可停:非高峰窗口有限时,靠限流参数让工具在压力上升时自动让路
  • 演练与回滚:工具过程可暂停或中止,比一次性提交的原生 DDL 更可控

gh-ost 使用示意

gh-ost 使用示意
# 先干跑,只输出计划不实际执行
gh-ost --host=127.0.0.1 --user=osc --password='***' \
  --database=appdb --table=orders \
  --alter='ADD COLUMN memo VARCHAR(200)' \
  --max-load='Threads_running=50' --critical-load='Threads_running=200' \
  --chunk-size=1000 --dry-run
# 确认无误后改 --execute 真正执行
# pt-osc 的等价思路(Percona Toolkit)
pt-online-schema-change --alter 'ADD COLUMN memo VARCHAR(200)' \
  --max-load Threads_running=50 --critical-load Threads_running=200 \
  --user=osc --password='***' D=appdb,t=orders --dry-run

两种工具对比

维度pt-oscgh-ost
增量同步在源表上创建触发器解析 binlog,不建触发器
源表写放大触发器带来额外写入开销较轻,可读从库 binlog 减轻主库压力
已有触发器与现有触发器冲突,需特殊处理不冲突,但仍要评估 binlog 格式要求
切换方式原子 RENAME原子 RENAME
依赖Percona Toolkit独立二进制,需 binlog 访问权限
两种工具都会在磁盘上同时存在源表与影子表,所需额外空间接近源表体积加上增量部分,执行前必须先确认剩余空间够用。
限流参数必须按业务实际负载设置:不限流地跑大表改表,会把主库 IO 与内存抢到业务超时,风险高于原生 DDL。

易错点

  • 表上已有触发器就直接跑 pt-osc:工具与现有触发器互相干扰甚至直接拒绝执行,上线前先导出 SHOW CREATE TABLE 确认
  • 不设限流参数:改表期间的拷贝与同步写入与业务争抢资源,容易在最忙的时候把主库拖垮
  • 空间没算够:影子表与源表并存,磁盘写满会连带影响所有实例上的表,执行前用实际数据量估算两倍空间
  • 切换后不做行数与抽样比对:工具正常退出不等于数据一致,必须核对行数与关键字段
  • 把工具当万能:某些操作(如主键大范围变更、强烈依赖触发器的业务逻辑)需要单独评估,工具文档里有限制清单

数据来源与参考

  • gh-ost 项目文档
  • Percona Toolkit: pt-online-schema-change

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌