gh-ost 原理剖析
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