mysql日常~gh-ost使用

一 对表的基本要求
    1 表必须要有主键 2 binlog必须是ROW格式 3 表不能有外键/触发器约束
二 基本过程
   1 检测实例基本参数是否符合
   2 添加binlog监听,目标主库/从库
   3 创建_xxx_ghc表(记录操作步骤) _xxx_gho表(全新表)
   4 同时进行以下两个工作
      对原表进行 row copy->_xx_gho
      对新表进行 binlog apply->xx_gho
      针对未拷贝的数据 binlog在新表不应用,针对已拷贝的数据,会应用binlog
   5 cut-over阶段
     0 首先会创建一个哨兵表__b__xx_del(日后的备份表)
     1 当binlog应用完成后先锁定源表和哨兵表
     2 进入rename交换 表:rename 源表 to 源_del表,gho表 to 源表。
   6 清理ghc表。
三 区别
   1 gh-ost 放弃了触发器,使用 binlog 来同步实现实时数据的变更
   2 gh-ost的效率低于pt-osc,因为pt-osc是多线程
   3 两者工具上对于负载的控制有很多相通的参数
四 特性
  1 原子性的两阶段切换方案
     pt-osc在rename阶段可能会有一小段时间提示不存在表,  gh-ost 解决的方式
    1 rename操作优先级高于DML操作,
    2 创建两个会话请求,一个会话请求执行lock哨兵表和原表 另一个会话执行rename操作,
      当第一个会话认为达到rename情况的时候会删掉哨兵表并且解锁表,因为rename操作优先级高于DML操作,所以另一个会话请求rename会被优先执行,等两者弄完,其他的程序       请求就能正常运行了
五 常用参数
   1 --allow-on-master 直接在主库执行必须添加
   2 --chunk-size int 默认每次的行数
   3 --initially-drop-ghost-table 在本次操作前删除可能存在的ghost表(可能之前留下的),默认如果存在就中断
   4 --initially-drop-old-table 在本次操作前删除old表(可能之前没有删除),默认如果存在中断、
   5 --initially-drop-socket-file 删除socket文件
   6 --ok-to-drop-table DDL完成后自动删除old表 默认不删除
   7 --max-load=Threads_connected=M --critical-load=Threads_connected=N(负载组合)
   8 -assume-rbr 显示告诉gh-ost日志格式是row格式,如果没有该参数,gh-ost每次都会设置row格式并重启复制,需要用户有super权限
   9 -execute 执行
六 组合
   --max-load=Threads_connected=M --critical-load=Threads_connected=N --chunk-size=1000 --initially-drop-ghost-table --initially-drop-old-table --initially-drop-socket-file --   allow-on-master -execute --assume-rbr
七 备注
   2 当执行成功后会在日志结尾打印success字样

原文地址:https://www.cnblogs.com/danhuangpai/p/13750008.html