gh-ost和pt-osc均是在线DDL工具,但工作原理存在显著差异:pt-osc通过触发器同步数据变更,gh-ost则通过解析二进制日志实现无触发器数据同步。
pt-osc工作原理pt-osc(pt-online-schema-change)采用触发器机制实现数据同步,具体流程如下:
- 创建影子表:工具首先创建一个与原表结构完全相同的新表(影子表),作为DDL变更的基础。
- 应用DDL变更:在影子表上执行用户指定的ALTER语句(如添加列、修改索引等),完成结构调整。
- 创建触发器:为确保原表数据变更同步到影子表,工具会创建三个触发器(INSERT/UPDATE/DELETE),分别捕获原表的增、改、删操作,并实时应用到影子表。
- 分批拷贝数据:通过分块(chunk)方式将原表数据逐步拷贝到影子表,减少单次操作对数据库性能的影响。
- 原子切换表:数据同步完成后,通过RENAME TABLE命令将原表重命名为备份表,同时将影子表重命名为原表名,实现无缝切换。特点:依赖触发器同步数据,可能因触发器逻辑复杂导致性能开销;切换过程原子性保证数据一致性,但需额外存储空间保存备份表。
gh-ost工作原理gh-ost(GitHub Online Schema Migration Tool)采用无触发器设计,通过解析二进制日志(binlog)实现数据同步,核心流程如下:
- 创建影子表:与pt-osc类似,先创建与原表结构相同的影子表,并应用DDL变更。
- 解析binlog同步数据:gh-ost不依赖触发器,而是通过监听数据库的binlog事件,捕获原表的增、改、删操作,并实时应用到影子表。
- 分批拷贝数据:采用动态分块策略,根据服务器负载自动调整拷贝速度,避免对生产环境造成过大压力。
- 流量切换:数据同步完成后,gh-ost通过短暂阻塞写操作(可配置),将流量从原表切换到影子表,完成表结构变更。特点:无触发器设计减少性能开销;支持暂停/恢复操作,适应复杂生产环境;但需确保binlog格式为ROW模式,且对数据库版本有一定要求。
核心差异- 同步机制:pt-osc依赖触发器,gh-ost依赖binlog解析。
- 性能影响:触发器可能增加写操作延迟,binlog解析对数据库负载更友好。
- 适用场景:pt-osc适合触发器兼容性好的环境,gh-ost适合高并发、低延迟要求的场景。