工具简介

gh-ost是一款在线无锁的DDL神器,支持在主库,或者从库两种模式使用,
而且还可以根据系统的负载延迟来动态暂停启动DDL工作,避免主从延迟等
问题的出现。
官方地址:gh-ost官网

工作原理

gh-ost使用二进制日志流捕获表更改,并异步应用到幽灵表上,最后交换幽灵表和原表。
执行DDL的过程可分为三个阶段:

 1. `校验`:是否有主键、外键、触发器;gh-ost连接的是主库还是从库,从库是否开启log_slave_updates;是否已经存在gho和del结尾的临时表等。2. `迁移`:监听binlog → 创建gho表并应用DDL → rowcopy+应用binlog。3. `cut-over`:切换幽灵表和原表。

注意事项

1. 不支持:没有主键或唯一索引的表、有外键或触发器的表;
2. 执行前show engine innodb status\G检查Free buffers是否小于服务器剩余的内存;
3. gh-ost有两种执行模式:一从主库拉取binlog,二从从库拉取binlog;被拉取binlog的mysql会使用innodb以外的内存。一定要使用无业务流量的从库,或是内存空闲的从库,用于拉取binlog(即在gh-ost命令中填写的实例IP);
4. 不要使用--exact-rowcount,会产生更多无法释放的内存,且增加的内存不在innodb的限制范围内;
5. 检查磁盘空间,至少增长变更表的size,还需考虑binlog的增长;建议使用max_binlog_files控制binlog数量
6. 应用binlog是单线程,如果原表tps持续过高,则gh-ost任务完成周期将过长或者无法完成
7. 不建议在生产cut-over阶段立马删除原表,需考虑IO影响(不能添加参数ok-to-drop-table);
需在低峰期对原表做硬连接,循环清理遗留原表_[tablename]_del;

常用参数

gh-ost --help
-allow-master-master:
是否允许gh-ost运行在双主复制架构中,一般与-assume-master-host参数一起使用-allow-nullable-unique-key:
允许gh-ost在数据迁移依赖的唯一键可以为NULL,默认为不允许为NULL的唯一键。如果数据迁移(migrate)依赖的唯一键允许NULL值,则可能造成数据不正确,请谨慎使用。-allow-on-master:
允许gh-ost直接运行在主库上。默认gh-ost连接的从库。-alter string:
DDL语句-assume-master-host string:
为gh-ost指定一个主库,格式为”ip:port”或者”hostname:port”。在这主主架构里比较有用,或则在gh-ost发现不到主的时候有用。-assume-rbr:
确认gh-ost连接的数据库实例的binlog_format=ROW的情况下,可以指定-assume-rbr,这样可以禁止从库上运行stop slave,start slave,执行gh-ost用户也不需要SUPER权限。-chunk-size int:
在每次迭代中处理的行数量(允许范围:100-100000),默认值为1000。-concurrent-rowcount:
该参数如果为True(默认值),则进行row-copy之后,估算统计行数(使用explain select count(*)方式),并调整ETA时间,否则,gh-ost首先预估统计行数,然后开始row-copy。-conf string:
gh-ost的配置文件路径。-critical-load string:
一系列逗号分隔的status-name=values组成,当MySQL中status超过对应的values,gh-ost将会退出。-critical-load Threads_connected=20,Connections=1500,指的是当MySQL中的状态值Threads_connected>20,Connections>1500的时候,gh-ost将会由于该数据库严重负载而停止并退出。-critical-load-hibernate-seconds int :
负载达到critical-load时,gh-ost在指定的时间内进入休眠状态。它不会读/写任何来自任何服务器的任何内容。-critical-load-interval-millis int:
当值为0时,当达到-critical-load,gh-ost立即退出。当值不为0时,当达到-critical-load,gh-ost会在-critical-load-interval-millis秒数后,再次进行检查,再次检查依旧达到-critical-load,gh-ost将会退出。-cut-over string:
选择cut-over类型:atomic/two-step,atomic(默认)类型的cut-over是github的算法,two-step采用的是facebook-OSC的算法。-cut-over-exponential-backoff-cut-over-lock-timeout-seconds int:
gh-ost在cut-over阶段最大的锁等待时间,当锁超时时,gh-ost的cut-over将重试。(默认值:3)-database string:
数据库名称。-default-retries int:
各种操作在panick前重试次数。(默认为60)-dml-batch-size int:
在单个事务中应用DML事件的批量大小(范围1-100)(默认值为10)-exact-rowcount:
准确统计表行数(使用select count(*)的方式),得到更准确的预估时间。-execute:
实际执行alter&migrate表,默认为noop,不执行,仅仅做测试并退出,如果想要ALTER TABLE语句真正落实到数据库中去,需要明确指定-execute-exponential-backoff-max-interval int-force-named-cut-over:
如果为true,则'unpostpone | cut-over'交互式命令必须命名迁移的表-heartbeat-interval-millis int:
gh-ost心跳频率值,默认为500-initially-drop-ghost-table:
gh-ost操作之前,检查并删除已经存在的ghost表。该参数不建议使用,请手动处理原来存在的ghost表。默认不启用该参数,gh-ost直接退出操作。-initially-drop-old-table:
gh-ost操作之前,检查并删除已经存在的旧表。该参数不建议使用,请手动处理原来存在的ghost表。默认不启用该参数,gh-ost直接退出操作。-initially-drop-socket-file:
gh-ost强制删除已经存在的socket文件。该参数不建议使用,可能会删除一个正在运行的gh-ost程序,导致DDL失败。-max-lag-millis int:单位毫秒
主从复制最大延迟时间,当主从复制延迟时间超过该值后,gh-ost将采取节流(throttle)措施,默认值:1500ms。-max-load string:
逗号分隔状态名称=阈值,如:'Threads_running=100,Threads_connected=500'. When status exceeds threshold, app throttles writes-migrate-on-replica:
gh-ost的数据迁移(migrate)运行在从库上,而不是主库上。-nice-ratio float:
每次chunk时间段的休眠时间,范围[0.0…100.0]。0:每个chunk时间段不休眠,即一个chunk接着一个chunk执行;1:每row-copy 1毫秒,则另外休眠1毫秒;0.7:每row-copy 10毫秒,则另外休眠7毫秒。-ok-to-drop-table:
gh-ost操作结束后,删除旧表,默认状态是不删除旧表,会存在_tablename_del表。-panic-flag-file string:
当这个文件被创建,gh-ost将会立即退出。-password string :
MySQL密码-port int :
MySQL端口-postpone-cut-over-flag-file string:
当这个文件存在的时候,gh-ost的cut-over阶段将会被推迟,数据仍然在复制,直到该文件被删除。-skip-foreign-key-checks:
确定你的表上没有外键时,设置为'true',并且希望跳过gh-ost验证的时间-skip-renamed-columns-switch-to-rbr:
让gh-ost自动将从库的binlog_format转换为ROW格式。-table string:
表名-throttle-additional-flag-file string:
当该文件被创建后,gh-ost操作立即停止。该参数可以用在多个gh-ost同时操作的时候,创建一个文件,让所有的gh-ost操作停止,或者删除这个文件,让所有的gh-ost操作恢复。-throttle-control-replicas string:
列出所有需要被检查主从复制延迟的从库。-throttle-flag-file string:
当该文件被创建后,gh-ost操作立即停止。该参数适合控制单个gh-ost操作。-throttle-additional-flag-file string适合控制多个gh-ost操作。-throttle-query string:
节流查询。每秒钟执行一次。当返回值=0时不需要节流,当返回值>0时,需要执行节流操作。该查询会在数据迁移(migrated)服务器上操作,所以请确保该查询是轻量级的。-timestamp-old-table:
在旧表名中使用时间戳。这会使旧表名称具有唯一且无冲突的交叉迁移。-user string:
MYSQL用户

实际操作

#安装
cd /usr/local/src/
wget https://github.com//github/gh-ost/releases/download/v1.1.2/gh-ost-binary-linux-20210617134741.tar.gz
tar xzvf gh-ost-binary-linux-20210617134741.tar.gz -C /usr/local/
ln -s /usr/local/gh-ost /usr/bin/gh-ost#操作表(从slave上获取binlog)!从备用从库或bkp上获取日志
gh-ost --user="" --password="" --host="" --port= --database="" --table="" --verbose --alter="" --max-lag-millis=1000 --serve-socket-file=/tmp/gh-ost.[tablename].sock --panic-flag-file=/tmp/ghost.panic.[tablename].flag --assume-rbr --execute
#操作表(从master上获取binlog;非常不建议!)
gh-ost --user="" --password="" --host=""  --port= --database="" --table="" --verbose --alter="" --max-lag-millis=1000 --serve-socket-file=/tmp/gh-ost.[tablename].sock --panic-flag-file=/tmp/ghost.panic.[tablename].flag --allow-on-master --execute#暂停
echo throttle | socat - /tmp/gh-ost.[tablename].sock#恢复
echo no-throttle | socat - /tmp/gh-ost.[tablename].sock#停止
touch /tmp/ghost.panic.[tablename].flag#运行中查看状态
echo status | socat - /tmp/gh-ost.[tablename].sock
echo "chunk-size=?" | socat - /tmp/gh-ost.[tablename].sock#一些默认值
chunk-size=1000
cut-over-lock-timeout-seconds=3
dml-batch-size=10
max-lag-millis=1500#运行中调整限速
echo chunk-size=1500 | socat - /tmp/gh-ost.[tablename].sock
echo max-lag-millis= | socat - /tmp/gh-ost.[tablename].sock
echo max-load=Thread_running=30 | socat - /tmp/gh-ost.[tablename].sock#删除中间表
#将主+从上的原表做硬连接(集群实例数量较多建议用蓝鲸)
ln /data/mysql/[dbname]/_[tablename]_del.ibd /data/mysql/[dbname]/_[tablename]_del.ibd.hdlk
#在主库上drop
drop table _[tablename]_del;
#使用linux 系统命令truncate 分批删除数据

【MySQL】在线无锁无延迟DDL神器gh-ost相关推荐

  1. MySQL在线DDL gh-ost 使用说明

    https://my.oschina.net/u/3765527/blog/3037243 https://www.cnblogs.com/zhoujinyi/p/9187421.html delet ...

  2. 你应该知道的高性能无锁队列Disruptor

    1.何为队列 听到队列相信大家对其并不陌生,在我们现实生活中队列随处可见,去超市结账,你会看见大家都会一排排的站得好好的,等待结账,为什么要站得一排排的,你想象一下大家都没有素质,一窝蜂的上去结账,不 ...

  3. 【Java 并发编程】线程锁机制 ( 锁的四种状态 | 无锁状态 | 偏向锁 | 轻量级锁 | 重量级锁 | 锁竞争 | 锁升级 )

    文章目录 一.悲观锁示例 ( ReentrantLock ) 二.重量级锁弊端 三.锁的四种状态 ( 无锁状态 | 偏向锁 | 轻量级锁 | 重量级锁 ) 四.锁的四种状态之间的转换 ( 无锁状态 - ...

  4. java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?

    转载自 java多线程中的死锁.活锁.饥饿.无锁都是什么鬼? 死锁.活锁.饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了. 死锁 死锁 ...

  5. mySQL无锁队列_使用 MySQL 实现无锁任务队列(using MySQL as a job queue)

    目录目录 场景 关键问题 有问题的解决方案 方案1 - 锁表 方案2 - SELECT FOR UPDATE 无锁任务队列 关键问题及解决方案 References 场景N 个生产者往 db 里面插入 ...

  6. mysql8.0源代码解析_源码解读:MySQL 8.0 InnoDB无锁化设计的日志系统

    原标题:源码解读:MySQL 8.0 InnoDB无锁化设计的日志系统 作者介绍 张永翔,现任网易云RDS开发,持续关注MySQL及数据库运维领域,擅长MySQL运维,知乎ID:雁南归. MySQL ...

  7. [MySQL] 在线 DDL 工具 gh-ost 原理简介

    一.简介 gh-ost: github 提供的针对 MySQL 无触发器式在线架构迁移解决方案. 二.原理 目前的在线架构变更工具都使用了类似的方式:创建一个和源表一样的临时表,在临时表执行 DDL ...

  8. mysql在线上建索引,mysql 5.6在线DDL建索引测试

    基本信息: mysql版本: (product)root@localhost [(none)]> select @@version; +------------+ | @@version  | ...

  9. java 无锁框架_高性能无锁并发框架 Disruptor,太强了!

    Java技术栈 www.javastack.cn 关注优质文章 Disruptor是一个开源框架,研发的初衷是为了解决高并发下队列锁的问题,最早由LMAX提出并使用,能够在无锁的情况下实现队列的并发操 ...

最新文章

  1. 阿里达摩院青橙奖再颁发!10名大陆青年科学家各获100万,最小获奖者28岁
  2. java继承构造_Java语言的继承结构
  3. mysql日志恢复数据_Mysql 通过binlog日志恢复数据
  4. 消除左递归c++代码_python实现文法左递归的消除
  5. 防止cpu 一直被占用 sleep(0) 和 yield
  6. 网络流及建模专题(上)
  7. 在没有IDE的情况下编译和运行Java
  8. python中的_init_的使用
  9. python gevent缺点_python 协程 greenlet gevent
  10. streamsets添加mysql驱动_StreamSets3.9.1安装说明
  11. mysql主从应用_MySQL主从复制应用、主从复制原理
  12. libtool: Version mismatch error. This is libtool 2.4.6, but the definition of this LT_INIT
  13. Improving Opencv 8: The Core Functionality :File Input and Output using XML and YAML files
  14. android游戏分成,原神半年吸金10亿美元,为何国内Android商店还秉承着55分成?
  15. 动手了!限19天,大米云主机满10送2手慢无!
  16. 浅析微信支付:公众平台卡券功能开通、HTML5线上发券(JS-SDK接口)、查看卡券详情
  17. 如何用电脑破解WiFi
  18. hao643.com劫持(修改快捷方式跳转至hao123.com)
  19. 【Unity ASE学习笔记】
  20. XTTS,又一个值得你重视的Oracle数据库迁移升级利器

热门文章

  1. 国内有名的文化与教育调查研究咨询公司
  2. 雅利安人覆灭了世界三大文明,为何单单在商朝被斩首两万?
  3. 【数学基础】简单易懂的张量求导和计算图讲解
  4. 微信小程序支持windows PC版了
  5. 人工智能Java SDK:图片分类(支持imagenet数据集分类)
  6. 如何打造差异化抖音账号IP?
  7. ASPXGridView 数据分页设置
  8. 教你如何赚取你的第一桶金 - 2048(含源码)
  9. 解决Google浏览器首页被2345网站劫持
  10. 可爱的小老鼠计算机教案,大班语言儿歌教案《小老鼠玩电脑》