gh-ost,是github开源的一款在线修改MySQL表结构的工具https://github.com/github/gh-ost/,它不使用pt-osc的触发器机制,而是使用解析binlog来实现将增量数据复制到新表。

最近我抽空了解了一下它的源码,结合debug日志,整理出它的过程,如下:

1.检查过程:

a.连接验证:connection validated on...
b.检查用户权限:User has SUPER, REPLICATION SLAVE privileges, and has ALL privileges on `sbtest`.*
c.binlog验证:binary logs validated on...
d.检查表存储引擎及评估表数据量:Estimated number of rows via EXPLAIN
e.判断Master节点

2.准备过程

a.伪装成Slave节点,通过binlogsyncer连接到Master节点,拉取binlog
b.初始化Applier,Applier的用途是apply增量binlog至gho表,apply的方式,上面有介绍过。
c.创建ghc(change log表),创建gho(影子表),将alter语句应用到gho表
d.选择可以确定唯一行的字段,确定目标表的所有字段(Shared columns)
e.创建一个socket文件,用来执行如暂停、限流等操作,参考https://github.com/github/gh-ost/blob/master/doc/interactive-commands.md。
f.根据命令指定的参数,决定使用何种方式来计算表的数据量,并通过上面选择的唯一键来确定最大、最小值
g.监视throttle-additional-flag-file,以决定是否限流

3.数据同步过程

a.开始copy源表数据至gho表,示例语句:
insert /* gh-ost `sbtest`.`t1` */ ignore into `sbtest`.`_t1_gho` (`id`)
(select `id` from `sbtest`.`t1` force index (`PRIMARY`)
where (((`id` > _binary'1') or ((`id` = _binary'1'))) and ((`id` < _binary'4') or ((`id` = _binary'4')))) lock in share mode
b.同时,将binlog中与源表相关的dml操作,在gho表上面应用,以保持2表的数据一致。 在本文的最后部分会有较详细的分析。

4.交换表过程

gh-ost实现原子交换过程的逻辑,都在migrator.go的atomicCutOver()函数中,过程如下:
a.Copy线程使用select get_lock('gh-ost.989.lock', 0)方式创建锁,以确保ghost工具各线程之间的操作一致,其中989是Copy线程连接到MySQL的connection_id
b.Rename线程创建一个magic cut-over table,表名是源表名加上_del后缀。至于magic cut-over table名称的由来,是为了防止在rename操作成功之前,Copy线程意外断开与MySQL的连接,从而导致新数据被写入到源表,而这部分新数据无法同步到gho表。
c.Copy线程同时锁住源表和_del表
d.Rename线程等待所有的event在gho表上应用完毕
e.Rename线程交换表,此时因为表被Copy线程锁住,所以此时会一直等待锁释放,示例语句:rename /* gh-ost */ table `sbtest`.`t1` to `sbtest`.`_t1_del`, `sbtest`.`_t1_gho` to `sbtest`.`t1`
f.另外一个线程使用select is_used_lock('gh-ost.989.lock')方式判断Copy线程是否持有锁,因为必须要确保有锁,才能防止源表被写入新数据
g.Copy线程现在可以安全地同删除_del表了,然后unlock tables, 并rollback
h.上述步骤完成的同时,Rename线程获取锁,完成原子rename操作

交换表的过程,我粗略整理了一下流程如下:

5.收尾工作

删除ghc后缀的changelog表

ost期间,增量数据如何复制? 

这是gh-ost的特点之一。实现原理如下:

osc期间,源表新增的数据,是通过解析binlog中的DML Events,然后由logic/applier.go的buildDMLEventQuery调用sql/builder.go中相应的函数(例如insert操作对应的是BuildDMLInsertQuery函数),来生成相应的query语句,然后返回给logic/applier.go的ApplyDMLEventQueries(tx.Exec)执行,以实现同步数据到gho表。

gh-ost工具在线改表过程的详细解析的更多相关文章

  1. mysql在线改表结构 pt-online-schema-change

    https://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html 不锁表更改数据库表结构 pt-online-s ...

  2. Hash表 算法的详细解析

    http://xingyunbaijunwei.blog.163.com/blog/static/76538067201111494524190/ 什么是HashHash,一般翻译做“散列”,也有直接 ...

  3. Apach Shiro MD5密码加密过程(明文生成密码过程)详细解析

    前言: 最近再项目当中使用的ApachShiro安全框架,对于权限和服务器资源的保护都有一个很好的管理.前期主要参考的文章有 项目中设计密码的加盐处理以及二次加密问题,跟着断点 一步步揭开Apach ...

  4. Linux MTD下获取Nand flash各个参数的过程的详细解析【转】

    本文转载自:https://www.crifan.com/files/doc/docbook/nand_get_type/release/html/nand_get_type.html 文章不错可以看 ...

  5. MySQL使用pt-online-change-schema工具在线修改1.6亿级数据表结构

    摘  要:本文阐述了MySQL DDL 的问题现状.pt-online-schema-change的工作原理,并实际利用pt-online-schema-change工具在线修改生产环境下1.6亿级数 ...

  6. pt-online-schema-change在线修改表结构

    工具简介 pt-osc模仿MySQL内部的改表方式进行改表,但整个改表过程是通过对原始表的拷贝来完成的,即在改表过程中原始表不会被锁定,并不影响对该表的读写操作.首先,osc创建与原始表相同的不包含数 ...

  7. ClickHouse(10)ClickHouse合并树MergeTree家族表引擎之ReplacingMergeTree详细解析

    目录 建表语法 数据处理策略 资料分享 参考文章 MergeTree拥有主键,但是它的主键却没有唯一键的约束.这意味着即便多行数据的主键相同,它们还是能够被正常写入.在某些使用场合,用户并不希望数据表 ...

  8. ClickHouse(11)ClickHouse合并树MergeTree家族表引擎之SummingMergeTree详细解析

    目录 建表语法 数据处理 汇总的通用规则 AggregateFunction 列中的汇总 嵌套结构数据的处理 资料分享 参考文章 SummingMergeTree引擎继承自MergeTree.区别在于 ...

  9. ClickHouse(13)ClickHouse合并树MergeTree家族表引擎之CollapsingMergeTree详细解析

    目录 建表 折叠 数据 算法 资料分享 参考文章 该引擎继承于MergeTree,并在数据块合并算法中添加了折叠行的逻辑.CollapsingMergeTree会异步的删除(折叠)这些除了特定列Sig ...

  10. 在线数据库表(sql语句)生成java实体类工具

    相信每个做java开发的读者,都接触过SQL建表语句,尤其是在项目开发初期,因为数据库是项目的基石. 在现代项目开发中,出现了许多ORM框架,通过简单的实体映射,即可实现与数据库的交互,然而我们最初设 ...

随机推荐

  1. dataX是阿里开源的离线数据库同步工具

    dataX是阿里开源的离线数据库同步工具的使用 DataX介绍: DataX 是阿里开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL.Oracle等).HDFS.Hive.OD ...

  2. ChatGPT正式登陆iOS平台

    6天前,ChatGPT在美区App Store中上架了官方App,累计下载量已经突破 50 万次,OpenAI 的 ChatGPT 应用在上架之后,其热度远超必应聊天等聊天机器人,以及其它使用 GPT ...

  3. 递归获取zip中的文件

    1 //tempPath 系统临时文件夹 2 2 private List<String> getWsContentList(String tempPath) { 3 3 //wsFile ...

  4. Unity中的光源类型(向前渲染路径进行光照计算)

    Unity中的光源类型 Unity中共支持4种光源类型: 平行光 点光源 聚光灯 面光源(在光照烘焙时才可以发挥作用) 光源的属性: 位置 方向(到某个点的方向) 颜色 强度 衰减(到某个点的衰减) ...

  5. 模板声明的两种形式:template<int N> 和 template<N>

    template<int N>:非类型模板参数 template<int N> 是一个典型的非类型模板参数的例子.这里的 N 是模板的参数,但它不是一个类型,而是一个具体的整数 ...

  6. linux中安装mysq5.7

    linux中安装mysq5.7 一. 安装mysql yum install mariadb-server mariadb 二. 开启mysql service mysqld start 四. 停止m ...

  7. 三维医学图像数据扩充:flip and rotate

    对于小数据量医学图像进行深度学习使,会由于数据量过小而过拟合.因此我们需要采用数据扩充方法,而flip和rotate又是经常用到的,这里做一个简单的实现. 输入为[batchsize,height, ...

  8. iOS键盘通知弹框使用小结

    项目开发中文本框输入的时候经常会用到键盘弹框遮挡的问题.解决办法就是根据底部键盘弹出的高度动态的改变对应view的位置.这里以多行文本框输入为例,效果图如下. //第一步,注册监听键盘通知 [[NSN ...

  9. 第三方的开源库FluentVaidation校验字段的

    内置的 using System.ComponentModel.DataAnnotations; 基本使用: 1. 安装包 FluentValidation.AspNetCOre 2. 注册服务 bu ...

  10. 55.父页面通过ifaram嵌套子页面,如何固定子页面菜单

    使用固定定位 :