一、gh-ost介绍

作为MySQL DBA都会面临这样一个问题,就是当对大表(10G以上)进行DDL变更时会有长时间锁表问题,影响业务可持续性。目前解决这个问题的方案一个较为通用的使用Percona公司开源的pt-osc工具,还有一个就是github基于go语言开发的gh-ost。gh-ost和pt-osc类似都能对大表进行在线DDL,在表格存在高并发写的情况下由于gh-ost是模拟从库应用binlog,所以性能不如pt-osc并发操作,但是gh-ost更灵活,不依赖触发器,并能根据实际情况动态调整。

安装gh-ost很简单,只需要访问https://github.com/github/gh-ost下载RPM包直接安装即可

二、gh-ost原理

gh-ost作为一个伪从库,从主库上拉取 binlog,经过过滤之后重新应用到主库,相当于在主库上的增量操作通过 binlog又应用回主库,不过是应用在一张虚拟表上。其大致的工作过程:

1、gh-ost首先连接到主库上,根据alter语句创建出虚拟表。

2、gh-ost作为从库根据参数设定连接到主库或其它从库上,在拷贝主库上的数据到虚拟表的同时,拉取增量数据产生的binlog,然后不断的把binlog应用回主库。

3、等待全部数据同步完成后将虚拟表和原表切换。

4、gh-ost在执行中会在原本的binlog event里面增加hint和心跳包用来控制整个流程的进度,检测状态等。gh-ost也会做很多前置的校验检查,比如binlog_format、表主键和唯一键、是否有外键等等。

5、gh-ost过程可停止,如果变更过程发现主库性能受影响,可以立刻停止拉取和应用 binlog,稳定之后根据binlog位置点继续应用。

三、gh-ost工作模式

a、连接到从库,但在主库做操作(默认方式,gh-ost将会检查从库状态,然后找到主库进行连接进行迁移)

1、行数据在主库上读写
2、读取从库的二进制日志,将变更应用到主库
3、在从库收集表格式、字段、索引、行数等信息
4、在从库上读取内部的变更事件(如心跳事件)
5、在主库切换表

b、连接到主库直接操作

直连主库进行copy数据和应用binlog,主库binlog格式须是row

c、在从库迁移(测试模式)

该模式会在从库执行迁移操作。gh-ost会连接到主库,所有的操作都在从库执行,不会对主库进行任何的改动。即使在复制运行阶段也可以进行表的切换操作,gh-ost将控制速度保证从库可以及时的进行数据同步

四、gh-ost重要参数说明

· 数据库连接配置

  • --user:指定MYSQL用户
  • --password:MySQL用户密码
  • --port:MySQL端口,最好用从库
  • --database:数据库名称
  • --table:指定表名

· 负载相关配置

  • --max-load:状态名称=阈值,如Threads_running=100,Threads_connected=500
  • --max-lag-millis:主从复制最大延迟时间,超过该值后gh-ost将采取节流(throttle)措施,默认1500s
  • --chunk-size int:每次处理的行数量(100-100000),默认1000
  • --conf:gh-ost的配置文件路径
  • --critical-load:当MySQL status中某状态的值超过阈值,则退出gh-ost,避免带来更高负载。如--critical-load Threads_connected=20,Connections=1500
  • --critical-load-hibernate-seconds:负载达到critical-load时,gh-ost的休眠时间,休眠期间不会进行任何读/写
  • --critical-load-interval-millis:如果值为0,当达到--critical-load,gh-ost立即退出;值非0,当达到--critical-load,gh-ost会在--critical-load-interval-millis秒数后再次进行检查,如果依旧达到--critical-load则退出
  • --skip-foreign-key-checks:如确定表没有外键,可设置为true,跳过验证

· 主从相关配置

  • --migrate-on-replica:在从库上进行迁移操作
  • --allow-on-master:允许直连主库进行copy数据和应用binlog,主库binlog格式须是row
  • --assume-master-host string:指定主库地址,格式为ip:port或hostname:port。通常用于主主架构或gh-ost发现不到主的时候
  • --assume-rbr:原本的DDL过程中从库会执行一次stop slave、start slave操作,通过该选项可以不用重启,前提是binlog格式需要是ROW

· SQL相关配置

  • --alter:指定需要操作的DDL语句,如engine=innodb代表alter table b engine=innodb
  • --execute:需要真正执行操作,不加该选项的话默认仅做测试并退出
  • --ok-to-drop-table:gh-ost操作结束后删除旧表,默认状态是不删除旧表,会存在_tablename_del表
  • --timestamp-old-table:最终rename的时候表名会加上时间戳后缀,每次执行的时候都会生成一个新的表名
  • --test-on-replica:仅测试,在切换之前复制会停止,然后进行切换操作,但是最终会切换回来,保证原始表不变(两个表都会保存下来,可以对两个表进行一致性检查等操作)
  • --timestamp-old-table:在旧表名中使用时间戳,可以使旧表名称得到具有唯一且无冲突的交叉迁移
  • --panic-flag-file:当这个文件被创建出来,gh-ost将会立即退出
  • --postpone-cut-over-flag-file:当这个文件存在的时候,gh-ost数据正常复制但是不会完成切换,直到该文件被删除

五、gh-ost示例

· 示例1:对b表进行重建,即alter table b engine=innodb

gh-ost --user="root" --password="123456" --host=127.0.0.1 --port=3306 --database="test" --table="b" --allow-on-master --max-load=Threads_running=20 --critical-load=Threads_running=50 --critical-load-interval-millis=5000 --chunk-size=1000 --alter="engine=innodb" --execute --timestamp-old-table --assume-rbr --panic-flag-file=/tmp/ghost.panic.flag

· 示例2:在主库上进行DDL

gh-ost --user="root" --password="123456" --host=127.0.0.1 --port=3306 --database="test" --table="t"  --alter="ADD COLUMN y1 varchar(10),add column y2 int not null default 0 comment 'test' "  --allow-on-master --execute

终止gh-ost值只需要创建--panic-flag-file所指定的文件即可。停止gh-ost后会有遗留表xxx_ghc、xxx_gho及socket 文件,如果需要再次执行需要清理掉这些文件和表

【MySQL运维】使用gh-ost工具实现大表在线DDL变更相关推荐

  1. 运维必备的DevOps工具链大盘点

    作者 | Suresh Sekar 译者 | 无明 1 关于 DevOps 及其工具 关于 DevOps 及其工具,需要记住: 持续改进是目标: DevOps 不是花钱买来的: 分阶段采用工具. 2 ...

  2. mysql 回滚_一个集审核、执行、备份及生成回滚语句于一身的MySQL运维工具

    goInception 一个集审核.执行.备份及生成回滚语句于一身的MySQL运维工具, 通过对执行SQL的语法解析,返回基于自定义规则的审核结果,并提供执行和备份及生成回滚语句的功能 架构图 使用方 ...

  3. mysql运维备份_MySQL运维经验

    原标题:MySQL运维经验 1. 概要 每台机器都使用多实例的模型. 每个机器放多个实例,每个实例放多个DB. 多实例之间没有进行资源隔离,这么做是让每个实例都能发挥最大性能. 目前大部分核心业务已切 ...

  4. MySQL 运维 - 从零开始学习 | 超详细

    MySQL 运维 - 从零开始学习 一.数据库类型 ► 常见的数据库类型 二.数据库管理系统 DBMS ►数据库系统 ►关系型数据库 ►非关系型数据库 Not Only SQL 三.安装MySQL ► ...

  5. Mysql运维常用命令回顾整理

    一.前景 Mysql作为开源数据库的中坚力量之一,虽然目前已被甲骨文收购,面临闭源风险,但是mysql扔是我们运维工作中最常面对的工作,那如何做好mysql运维工作,甚至做好mysql的基础运维,都是 ...

  6. MySQL运维(二)MySQL分库分表概念及实战、读取分离详解

    MySQL运维(二)MySQL分库分表详解.读取分离详解 1.MySQL分库分表相关概念 1.1 分库分表概念 1.1.1 分库的原因 分库:就是一个数据库分成多个数据库,部署到不同机器. 如果业务量 ...

  7. Linux运维13款实用工具

    本文介绍几款Linux运维比较实用的工具,希望对Linux管理员有所帮助. 1.查看进程占用带宽情况-Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽. ...

  8. mysql系列问答题_(2)MySQL运维基础知识面试问答题

    面试题001:请解释关系型数据库概念及主要特点? 面试题002:请说出关系型数据库的典型产品.特点及应用场景? 面试题003:请解释非关系型数据库概念及主要特点? 面试题004:请说出非关系型数据库的 ...

  9. 封神-运维大脑 | 日志检测工具

    简介: 封神-运维大脑 | 日志检测工具 1. 背景目标 阿里云应用业务有问题,云平台监控可以发现问题,但并不能定位到问题根本原因,运维大脑监控底层日志,可快速定位问题原因,帮助现场运维同学解决问题. ...

最新文章

  1. HTML的标签描述7
  2. Computer:MediaPreview的简介、安装、使用方法之详细攻略
  3. Adobe Reader 文档无法签名_手把手教你如何利用PDF阅读器压缩PDF文档
  4. OpenCV捕获正弦波模式
  5. 7月30日 举办专注于微服务的.NET Conf Focus
  6. chrome浏览器的跨域设置,前端修改跨域问题
  7. 网络管理不简单 需化被动为主动
  8. android五子棋设计模板,基于android的五子棋游戏设计
  9. Iphone革了谁的命?
  10. Flume案例之采集特定目录的数据到HDFS
  11. c 生成html的div,createElement动态创建HTML对象脚本代码
  12. 有些人真是笨的可以,劝我自己别多管闲事,切记切记
  13. 【HDU5869】Different GCD Subarray Query(求[L,R]内有多少个不同的区间gcd---树状数组+思维)
  14. vscode阅读linux源码
  15. 【不存在的人】用Python获取生成随机头像,还不侵权
  16. HyperLPR车牌识别库代码分析(12)
  17. 树莓派3B+ 人脸识别(OpenCV)
  18. 13个优秀的UML工具软件
  19. 分享IT业的创业心得
  20. 系统中的obj文件、dll文件、so文件、lib文件、exe文件、vcproj文件、sln文件

热门文章

  1. 让你在 API 设计中少踩坑的实战分享
  2. 如何实现算法中的公平性
  3. Mysql--01.安装
  4. Vue打包后通过springboot运行页面为空白页的解决方法
  5. 目前最精准的Android开源计步器
  6. 关于diskgenius删除所有分区后,电脑不能识别U盘的问题。
  7. HWOD机试真题(JavaScript)
  8. 台式计算机突然连接不到网络,电脑突然网络感叹号导致不能上网的解决方法
  9. 深度学习之10分钟入门h5py
  10. 爱思服务器可以下小组件,iOS14 小组件添加/删除方法教程