当前位置: 首页 > news >正文

MySQL DDL--ghost工具学习

GHOST工作流程图:

GHOST工作原理:

1、首先新建一张ghost表,结构与源表相同
2、使用alter命令修改ghost表
3.1、模拟从库命令获取主库上该表的binlog(基于全镜像的行模式的binlog包含更改前和更改后的所有数据),并解析成语句到ghost表上执行。
3.2、获取源表的数据范围(如按照主键获取到最大值和最小值),然后将数据拆分为多个批次拷贝插入到ghost表中
4、锁住源表,防止用户修改源表数据
5、将源表重命名,将ghost表改名为源表
6、释放表锁,清理gh-ost工具产生的表。

GHOST有工作模式:

1.连接主库直接修改
    直连主库
    主库上创建ghost表
    新表(ghost表)上直接alter修改表结构
    迁移原表数据到新表
    拉取解析binlog事件,应用到新表
    cut-over阶段,用新表替换掉原表
2.连接从库间接应用到主库
    连接从库
    校验完后,在主库创建新表
    迁移原表数据到新表
    模拟从库的从库,拉取解析增量binlog应用到主库
    cut-over阶段,用新表替换掉原表

两者不同的点就在于,通过连接从库来进行变更,对主库的性能影响最小,但使用主库能够减少网络影响,操作速度更快。

如何保证源表和新表数据一致:

由于使用binlog获得的数据总是新于或者等于从源表拷贝的数据:
1、在应用binlog导出的数据时,将UPDATE和DELETE直接应用ghost表,将INSERT修改为REPLACE INTO再应用到ghost表。
2、在copy源表数据到ghost表时,使用INSERT IGNORE来忽略掉ghost表已存在的记录
3、对于在gh-ost工作期间发生的DELETE操作:
    A:如果记录在从源表删除前被复制到ghost表, 则ghost表中记录会在应用binlog导出的DELETE命令时删除。
    B:使用记录在从源表复制到ghost表之前被删除,则记录不会被复制到ghost表,应用binlog导出的DELETE命令也不会报错。

GHOST支持跨服务器操作

假设有一套主从复制A1-->A2,A1为主库,A2为从库,另有一台服务器B1装有gh-ost,可以在B1上执行对A1上表的修改:
    1、对于数据拷贝操作,B1发送查询到A1上先获取最大值和最小值,然后在B1上进行拆分成不同批次,再从B1上发送命令给A1执行小范围数据拷贝
    2、对于Binlog解析,先模拟B1到A1的搭建复制,从A1上拉取binlog到B1,在B1上解析成SQL命令,再发送到A1上执行。

对于跨服务器执行gh-ost命令,会导致大量数据在数据库服务器到命令服务器之间传输,需要考虑网络带宽和网络稳定

重命名原理

在pt-osc或者online ddl中,最后的rename操作一般是耗时比较短,但如果表结构变更过程中,有大查询进来,那么在rename操作的时候,会触发MDL锁的等待,如果在高峰期,这就是个严重的问题。所以gh-ost是怎么做的呢?

gh-ost利用了MySQL的一个特性,就是原子性的rename请求,在所有被blocked的请求中,优先级永远是最高的。gh-ost基于此设计了该方案:一个连接对原表加锁,另启一个连接尝试rename操作,此时会被阻塞住,当释放lock的时候,rename会首先被执行,其他被阻塞的请求会继续应用到新表。

唯一索引问题

如果通过gh-ost来新增唯一索引,由于REPLACE INTO和INSERT IGNORE会受到ghost表上唯一索引的影响,当在唯一索引上存在数据重复时,会导致数据丢失。

 

相关文章:

  • Vue父子组件传值 | 父传子 | 子传父
  • 【转】奇异值分解(SVD)原理详解及推导
  • MaxCompute studio FAQ
  • dubbo-admin2.8.4部署
  • 时间选择控件YearPicker(基于React,antd)
  • MicroPython支持图形化编辑了:Python Editor带你轻松玩转MicroPython
  • 负载均衡【nginx反向代理】
  • python----文件读写
  • Tensorflow 学习笔记(一)TensorFlow入门
  • [Usaco2012 Dec]First! BZOJ3012
  • 前台jsp从session中拿值
  • 代替eval执行字符串表达式
  • 解决Android 7.0 App内切换语言不生效的问题
  • App测试方法总结
  • 一个SAP顾问在美国的这些年
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • Centos6.8 使用rpm安装mysql5.7
  • create-react-app做的留言板
  • Fundebug计费标准解释:事件数是如何定义的?
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • PermissionScope Swift4 兼容问题
  • React Transition Group -- Transition 组件
  • springMvc学习笔记(2)
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Web设计流程优化:网页效果图设计新思路
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 白色的风信子
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • Hibernate主键生成策略及选择
  • MPAndroidChart 教程:Y轴 YAxis
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #vue3 实现前端下载excel文件模板功能
  • (07)Hive——窗口函数详解
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (四)linux文件内容查看
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)jQuery 基础
  • ./configure,make,make install的作用(转)
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .Net Core和.Net Standard直观理解
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .net 怎么循环得到数组里的值_关于js数组
  • .net的socket示例
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • @Bean有哪些属性
  • @ConfigurationProperties注解对数据的自动封装