一 对表的基本要求
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字样