• 工作过程
gh-ost 首先连接到主库上,根据 alter 语句创建幽灵表,然后作为一个备库连接到其中一个真正的备库或者主库上(根据具体的参数来定),一边在主库上拷贝已有的数据到幽灵表,一边从备库上拉取增量数据的 binlog,然后不断的把 binlog 应用回主库。等待全部数据同步完成,进行cut-over 幽灵表和原表切换。图中 cut-over 是最后一步,锁住主库的源表,等待 binlog 应用完毕,然后替换 gh-ost 表为源表。gh-ost 在执行中,会在原本的 binlog event 里面增加以下 hint 和心跳包,用来控制整个流程的进度,检测状态等。
  • 安装
#https://github.com/github/gh-ost/releases
cd /tmp
下载gh-ost-binary-linux-20190214020851.tar.gz
tar -xvf  gh-ost-binary-linux-20190214020851.tar.gz
cp gh-ost /usr/bin/
which gh-ost
  • gh-ost --help
  1. -allow-master-master:是否允许gh-ost运行在双主复制架构中,一般与-assume-master-host参数一起使用
  2. -allow-nullable-unique-key:允许gh-ost在数据迁移依赖的唯一键可以为NULL,默认为不允许为NULL的唯一键。如果数据迁移(migrate)依赖的唯一键允许NULL值,则可能造成数据不正确,请谨慎使用。
  3. -allow-on-master:允许gh-ost直接运行在主库上。默认gh-ost连接的从库。
  4. -alter string:DDL语句
  5. -assume-master-host string:为gh-ost指定一个主库,格式为”ip:port”或者”hostname:port”。在这主主架构里比较有用,或则在gh-ost发现不到主的时候有用。
  6. -assume-rbr:确认gh-ost连接的数据库实例的binlog_format=ROW的情况下,可以指定-assume-rbr,这样可以禁止从库上运行stop slave,start slave,执行gh-ost用户也不需要SUPER权限。
  7. -chunk-size int:在每次迭代中处理的行数量(允许范围:100-100000),默认值为1000。
  8. -concurrent-rowcount:该参数如果为True(默认值),则进行row-copy之后,估算统计行数(使用explain select count(*)方式),并调整ETA时间,否则,gh-ost首先预估统计行数,然后开始row-copy。
  9. -conf string:gh-ost的配置文件路径。
  10. -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将会由于该数据库严重负载而停止并退出。
  11. -critical-load-hibernate-seconds int :负载达到critical-load时,gh-ost在指定的时间内进入休眠状态。 它不会读/写任何来自任何服务器的任何内容。
  12. -critical-load-interval-millis int:当值为0时,当达到-critical-load,gh-ost立即退出。当值不为0时,当达到-critical-load,gh-ost会在-critical-load-interval-millis秒数后,再次进行检查,再次检查依旧达到-critical-load,gh-ost将会退出。
  13. -cut-over string:选择cut-over类型:atomic/two-step,atomic(默认)类型的cut-over是github的算法,two-step采用的是facebook-OSC的算法。
  14. -cut-over-exponential-backoff
  15. -cut-over-lock-timeout-seconds int:gh-ost在cut-over阶段最大的锁等待时间,当锁超时时,gh-ost的cut-over将重试。(默认值:3)
  16. -database string:数据库名称。
  17. -default-retries int:各种操作在panick前重试次数。(默认为60)
  18. -dml-batch-size int:在单个事务中应用DML事件的批量大小(范围1-100)(默认值为10)
  19. -exact-rowcount:准确统计表行数(使用select count(*)的方式),得到更准确的预估时间。
  20. -execute:实际执行alter&migrate表,默认为noop,不执行,仅仅做测试并退出,如果想要ALTER TABLE语句真正落实到数据库中去,需要明确指定-execute
  21. -exponential-backoff-max-interval int
  22. -force-named-cut-over:如果为true,则'unpostpone | cut-over'交互式命令必须命名迁移的表
  23. -heartbeat-interval-millis int:gh-ost心跳频率值,默认为500
  24. -initially-drop-ghost-table:gh-ost操作之前,检查并删除已经存在的ghost表。该参数不建议使用,请手动处理原来存在的ghost表。默认不启用该参数,gh-ost直接退出操作。
  25. -initially-drop-old-table:gh-ost操作之前,检查并删除已经存在的旧表。该参数不建议使用,请手动处理原来存在的ghost表。默认不启用该参数,gh-ost直接退出操作。
  26. -initially-drop-socket-file:gh-ost强制删除已经存在的socket文件。该参数不建议使用,可能会删除一个正在运行的gh-ost程序,导致DDL失败。
  27. -max-lag-millis int:主从复制最大延迟时间,当主从复制延迟时间超过该值后,gh-ost将采取节流(throttle)措施,默认值:1500s。
  28. -max-load string:逗号分隔状态名称=阈值,如:'Threads_running=100,Threads_connected=500'. When status exceeds threshold, app throttles writes
  29. -migrate-on-replica:gh-ost的数据迁移(migrate)运行在从库上,而不是主库上。
  30. -nice-ratio float:每次chunk时间段的休眠时间,范围[0.0…100.0]。0:每个chunk时间段不休眠,即一个chunk接着一个chunk执行;1:每row-copy 1毫秒,则另外休眠1毫秒;0.7:每row-copy 10毫秒,则另外休眠7毫秒。
  31. -ok-to-drop-table:gh-ost操作结束后,删除旧表,默认状态是不删除旧表,会存在_tablename_del表。
  32. -panic-flag-file string:当这个文件被创建,gh-ost将会立即退出。
  33. -password string :MySQL密码
  34. -port int :MySQL端口,最好用从库
  35. -postpone-cut-over-flag-file string:当这个文件存在的时候,gh-ost的cut-over阶段将会被推迟,数据仍然在复制,直到该文件被删除。
  36. -skip-foreign-key-checks:确定你的表上没有外键时,设置为'true',并且希望跳过gh-ost验证的时间-skip-renamed-columns ALTER
  37. -switch-to-rbr:让gh-ost自动将从库的binlog_format转换为ROW格式。
  38. -table string:表名
  39. -throttle-additional-flag-file string:当该文件被创建后,gh-ost操作立即停止。该参数可以用在多个gh-ost同时操作的时候,创建一个文件,让所有的gh-ost操作停止,或者删除这个文件,让所有的gh-ost操作恢复。
  40. -throttle-control-replicas string:列出所有需要被检查主从复制延迟的从库。
  41. -throttle-flag-file string:当该文件被创建后,gh-ost操作立即停止。该参数适合控制单个gh-ost操作。-throttle-additional-flag-file string适合控制多个gh-ost操作。
  42. -throttle-query string:节流查询。每秒钟执行一次。当返回值=0时不需要节流,当返回值>0时,需要执行节流操作。该查询会在数据迁移(migrated)服务器上操作,所以请确保该查询是轻量级的。
  43. -timestamp-old-table:在旧表名中使用时间戳。这会使旧表名称具有唯一且无冲突的交叉迁移。
  44. -user string :MYSQL用户
  • 操作
#https://mp.weixin.qq.com/s?__biz=MzI4NjExMDA4NQ==&mid=2648451747&idx=1&sn=5dad442397fbe9b2410c5e13fd8ade16&chksm=f3c97249c4befb5fe76379cadb9f3204c268ff0b051312f29cefc6ca3270d67a6072de522f79&scene=21&key=2be50905ebf73239e61167e9572a9dc1540c9184c4ccc0efe633fe7cb6bc5e75c2df7829e583c4440ce1cd56a491f028837541c3d008bfb7456d841b8089b0dc5f97d97b4875def94e0bea188762a8ed&ascene=1&uin=Mjk1NTczNzI2Mg%3D%3D&devicetype=Windows+7&version=62060841&lang=zh_CN&pass_ticket=smE26CDAj05L1aNOitlC%2B0valz2l3u%2FojPmPkp4tLllsALIQNJKuWqZ1I554uwZbgh-ost \--ok-to-drop-table \--initially-drop-ghost-table \--initially-drop-socket-file \--host="192.168.10.73" \--port=3306 \--user="lf" \--password="123.com"\--database="ylmonitor" \--table="t_nginxupstream"  \--verbose \--alter="add column test_field varchar(256) default '';" \--serve-socket-file=/tmp/t1.sock \--panic-flag-file=/tmp/ghost.panic.flag  \--allow-on-master \--throttle-flag-file /tmp/1.log \--execute#暂停
echo throttle | socat - /tmp/t1.sock
#恢复
echo no-throttle | socat - /tmp/t1.sock修改限速参数:
echo chunk-size=100 | socat - /tmp/t1.sock
echo max-lag-millis=200 | socat - /tmp/t1.sock
echo max-load=Thread_running=3 | socat - /tmp/t1.sock

在线ddl变更工具​ gh-ost相关推荐

  1. 技术分享 | gh-ost 在线 ddl 变更工具​

    作者简介: 杨奇龙,网名"北在南方",7年DBA老兵,目前任职于杭州有赞科技DBA,主要负责数据库架构设计和运维平台开发工作,擅长数据库性能调优.故障诊断. 一.前言 作为 MyS ...

  2. 【MySQL运维】使用gh-ost工具实现大表在线DDL变更

    一.gh-ost介绍 作为MySQL DBA都会面临这样一个问题,就是当对大表(10G以上)进行DDL变更时会有长时间锁表问题,影响业务可持续性.目前解决这个问题的方案一个较为通用的使用Percona ...

  3. mysql gh 划线,gh-ost:在线DDL修改MySQL表结构工具

    在之前,我分享过一次pt-online-schema-change在线DDL的工具实践记录,在实际使用过程中,发现部门的很多老系统大量使用了触发器,从而无法使用这个工具,非常遗憾!导致很多DDL变更都 ...

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

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

  5. ddl mysql_mysql 5.6 在线 DDL

    做MySQL的都知道,数据库操作里面,DDL操作(比如CREATE,DROP,ALTER等)代价是非常高的,特别是在单表上千万的情况下,加个索引或改个列类型,就有可能堵塞整个表的读写. 然后 mysq ...

  6. GitHub 开源的 MySQL 在线更改 Schema 工具【转】

    本文来自:https://segmentfault.com/a/1190000006158503 原文:gh-ost: GitHub's online schema migration tool fo ...

  7. mysql ddl脚本_MySQL在线DDL gh-ost使用总结

    背景: 作为一个DBA,大表的DDL的变更大部分都是使用Percona的pt-online-schema-change,本文说明下另一种工具gh-ost的使用:不依赖于触发器,是因为他是通过模拟从库, ...

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

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

  9. mysql+不锁表添加字段_MySQL5.6在线DDL不锁表(在线添加字段)

    解答你也看一下 MySQL5.6在线DDL不锁表,现在我有一张1亿的表,需要增加一个字段,假如我让你去增加这个字段,你应该注意什么,具体怎么操作? 操作如下: 1.注意磁盘空间(临时表目录 参数 tm ...

最新文章

  1. Linux DHCP服务搭建
  2. LeetCode-数组-189. 旋转数组
  3. springboot api版本控制_SpringBoot入门练习
  4. 【概念】虚拟利润中心初识
  5. 倒排索引-搜索引擎的基石
  6. 为什么云原生+分布式是数据库的未来?
  7. jQuery Validate focusCleanup: true
  8. jquery cookie 插件 (支持json对象) 可以跟jquery 集成 也可以单独使用
  9. 麻将游戏简介firefly游戏框架介绍
  10. Neo4j之导入CSV大文件 periodic commit
  11. AD19 DRC 时弹出 Design contains shelved or modified (but not repoured) polygons
  12. python 字体颜色改变
  13. PTA L3-008 喊山 (BFS)
  14. 陆奇万字长文,讲透企业数字化转型!
  15. Win11上手初体验,文末附Win10升级Win11方法
  16. 企业信息化系统CRM篇
  17. CSS实现水平局中、垂直局中详解
  18. 量子超级计算机概念,从超级计算机到量子计算机的飞跃,或将解开物理学中最神秘概念!...
  19. spark load时的jackson报错
  20. 吃一堑长一智!java环境变量配置失败了怎么办

热门文章

  1. 【工具】pip安装不在当前虚拟环境中
  2. 《新撰组异闻录——铁》启示录
  3. 问题解决:系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的about_Execution_Policies
  4. html 字体图标不显示不出来了,h5页面字体图标显示不正常
  5. [原创]SP的前途??(猛回头,警世钟)[转贴]
  6. Vs2015智能提示英文的处理方案。
  7. 华为机考,华为笔试,软件类,2020年8月19日题目,超详细解答。
  8. 有道词典Android客户端包体积优化之路
  9. php 微信模拟登陆给用户发送消息(文字,图片,图文)
  10. 苹果怎么清理隐藏内存?全新手机技巧,还不会的亏大了!