gh-ost 原理

一 简介

上一篇文章介绍 gh-ost 参数和具体的使用方法,以及核心特性-可动态调整 暂停,动态修改参数等等。本文分几部分从源码方面解释gh-ost的执行过程,数据迁移,切换细节设计。

二 原理

2.1 执行过程

本例基于在主库上执行ddl 记录的核心过程。核心代码在

github.com/github/gh-ost/go/logic/migrator.go 的Migrate()

func (this *Migrator) Migrate() //Migrate executes the complete migration logic. This is the major gh-ost function.

1 检查数据库实例的基础信息

a 测试db是否可连通, b 权限验证    show grants for current_user() c 获取binlog相关信息,包括row格式和修改binlog格式后的重启replicate   select @@global.log_bin, @@global.binlog_format   select @@global.binlog_row_image d 原表存储引擎是否是innodb,检查表相关的外键,是否有触发器,行数预估等操作,需要注意的是行数预估有两种方式  一个是通过explain 读执行计划 另外一个是select count(*) from table ,遇到几百G的大表,后者一定非常慢。    explain select /* gh-ost */ * from `test`.`b` where 1=1 

2 模拟slave,获取当前的位点信息,创建binlog streamer监听binlog

2019-09-08T22:01:20.944172+08:00    17760 Query show /* gh-ost readCurrentBinlogCoordinates */ master status 2019-09-08T22:01:20.947238+08:00    17762 Connect   root@127.0.0.1 on  using TCP/IP 2019-09-08T22:01:20.947349+08:00    17762 Query SHOW GLOBAL VARIABLES LIKE 'BINLOG_CHECKSUM' 2019-09-08T22:01:20.947909+08:00    17762 Query SET @master_binlog_checksum='NONE' 2019-09-08T22:01:20.948065+08:00    17762 Binlog Dump   Log: 'mysql-bin.000005'  Pos: 795282 

**3 创建 日志记录表 xx_ghc 和影子表 xx_gho 并且执行alter语句将影子表 变更为目标表结构。如下日志记录了该过程,gh-ost会将核心步骤记录到 _b_ghc 中。**

2019-09-08T22:01:20.954866+08:00    17760 Query create /* gh-ost */ table `test`.`_b_ghc` (             id bigint auto_increment,             last_update timestamp not null