MySQL DDL--ghost工具学习

Johnny21 等级 339 0 0

GHOST工作流程图:

MySQL DDL--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表上唯一索引的影响,当在唯一索引上存在数据重复时,会导致数据丢失。

相关资源:GHOST文件提取_工具_最新版

本文转自 https://blog.csdn.net/weixin_33806300/article/details/85993965,如有侵权,请联系删除。

收藏
评论区

相关推荐

[DB]PostgreSQL 与 MySQL 相比,优势何在?
PostgreSQL 与 MySQL 相比,优势何在? 数据库 知乎 Pg 没有 MySQL 的各种坑 MySQL 的各种 text 字段有不同的限制, 要手动区分 small text, middle text, large text... Pg 没有这个限制, text 能支持各种大小. 按照 SQL 标准, 做 null 判断不能用
mysql表和字段的操作
(3)mysql表和字段的操作 (3)mysql表和字段的操作 创建表 create table name( id int, student varchar(20) ); 查看表结构 常用 describe 表名; 修改表名 老表 rename 新表 ALTER TABLE tb\_men
mysql安装无法启动问题解决
版本:mysql8.0.12winx64 下载地址:https://dev.mysql.com/downloads/mysql/(https://links.jianshu.com/go?tohttps%3A%2F%2Fdev.mysql.com%2Fdownloads%2Fmysql%2F) 前提 :解压下载的压缩包文件 操作步骤:
哪些场景下使用MongoDB
为什么需要MongoDB (https://blog.csdn.net/tanqian351/article/details/81744970)MongoDB与MySQL的区别 关于MongoDB
mysql8.0.20安装配置教程
mysql配置安装教程1、下载mysql8.0.20安装包 下载地址: https://dev.mysql.com/downloads/mysql/. 找到安装包后下载。(官网为英文,如果看不懂的小伙伴可以将网站复制到谷歌进行翻译) 点击跳过登录,直接下载到本地。安装mysql
MySQL 8.0 创建 user 及允许远程连接
进入 mysql 命令行模式mysql h127.0.0.1 uroot p 查看当前 mysql 版本select version(); 查看当前 mysql 用户列表信息select host, user, authentication_string, plugin from user; 执行完上面的命令后会显示一个表格 查看表格
msyql备份
MySQL备份的几种方式最近一直想写点博客,但是不知道写什么,感觉自己最近的知识没有什么增加,今天想到了一篇可以写的博客。以前试过根据data文件夹备份MySQL,但是从来没有成功过,前几天帮助朋友还原MySQL,终于成功的将备份的data文件夹还原成功了。MySQL数据库算是常用的数据库中最好使用的数据库了,对于备份的操作也不例外。所以今天分享一下
MySQL DDL--ghost工具学习
GHOST工作流程图:GHOST工作原理:1、首先新建一张ghost表,结构与源表相同 2、使用alter命令修改ghost表 3.1、模拟从库命令获取主库上该表的binlog(基于全镜像的行模式的binlog包含更改前和更改后的所有数据),并解析成语句到ghost表上执行。 3.2、获取源表的数据范围(如按照主键获取到最大值和最小值),然后将数据拆分
MySQL 8 复制(二)——半同步复制
目录 一、简介 直到目前的最新版本为止,MySQL缺省依然使用异步复制策略。简单说所谓异步复制,指的是主库写二进制日志、从库的I/O线程读主库的二进制日志写本地中继日志、从库的SQL线程重放中继日志,这三步操作都是异步进行的。如此选择的主要理由是出于性能考虑,与同步复制相比,异步复制显然更快,同时能承载更高的吞吐量。但异
21分钟 MySQL 入门教程
21分钟 MySQL 入门教程 目录 一、MySQL的相关概念介绍(c1) 二、Windows下MySQL的配置(c2) 配置步骤(d1) MySQL服务的启动、停止与卸载(d2) 三、
MySQL(一)MySQL基础介绍
最近的学习内容是数据库相关的一些知识,主要以MySQL为主,参考书籍——《MySQL必知必会》MySQL学习及下载地址:https://dev.mysql.com/MySQL学习使用注意事项:1、必须访问一个已有的MySQL服务器,需要一个服务器账号(一个登录名和一个口令)2、MySQL运行在所有主要平台上,包括Windows、Linux、Solaris、M
Mysql Workbench使用教程
<1 MySQL WorkbenchMySQL Workbench 为数据库管理员、程序开发者和系统规划师提供可视化的Sql开发、数据库建模、以及数据库管理功能。 <2.MySQL Workbench 的下载和安装 (1)安装最新MySql时,有是否安装MySql Workbench的选项,可选择安装。 (2)可以独立安装MySql Workbench。
MySQL-Workbench使用
MySQL Workbench使用简单介绍下Workbench的使用 Workbench是MySQL官方提供的一个可视化管理工具,跨多个平台而且免费的,详情参考。 我们从下载地址下载,安装就行了安装workbench 安装 可以单独下载,也可以使用提供的一个管理工具统一下载管理,管理工具提供了整个MySQL所有相关组件的统一管理维护,也挺方便。管理工
什么是索引?Mysql目前主要的几种索引类型
一、索引MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。创
MySQL最全整理,1200页文档笔记,从高级到实战讲的太清楚了
闲话作为一名编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的。对于求职者来说,MySQL又是面试中一定会问到的重点,很多人拥有大厂梦,却因为MySQL败下阵来。实际上,MySQL并不难,今天这份最全的MySQL总结,一共1200页,几乎涵盖了MySQL的所有知识,尤其突出了实战技能和高级知识点,无论是工作还是面试看完这篇就足