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

MySQL DDL--ghost工具学习相关推荐

  1. mysql ddl脚本_MySQL学习之路(1):SQL脚本语言

    使用MySQL数据库,首先安装MySQL数据库,本文所有SQL脚本在MySQL上测试和执行. 安装Mysql服务器: 安装Mysql workbench客户端,可以以图形化界面管理mysql: 安装p ...

  2. MySql DDL日志_mysql学习日记——数据库基础与基本DDL、DML语句

    # # # 数据库的基本概念 数据库: DataBase (DB).用于存储和管理数据的仓库. 数据库的特点: 1. 持久化存储数据的.其实数据库就是一个文件系统 2. 方便存储和管理数据 3. 使用 ...

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

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

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

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

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

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

  6. MySQL实战45讲学习笔记

    文章目录 MySQL实战45讲-学习笔记 01 基础架构:一条SQL查询语句是如何执行的? mysql逻辑架构 连接器 查询缓存 分析器 优化器 执行器 02 日志系统:一条SQL更新语句如何执行 r ...

  7. 淘宝商品库MySQL优化实践的学习

    淘宝商品库MySQL优化实践的学习 淘宝商品库是淘宝网最核心的数据库之一,采用MySQL主备集群的架构,特点是数据量大且增长速度快,读多写少,对安全性要求高,并发请求高.由于MySQL最初的设计不是用 ...

  8. MySQL DBA必备工具使用的6大锦囊妙计

    老张我呢不仅是个金庸迷,还是个三国迷.就是喜欢看后期蜀国诸葛亮与魏国司马懿之间的斗智斗勇.各种锦囊妙计的使用,堪称经典.针对管理MySQL数据库这块,张老师也有很多妙计,今后一一给大家介绍.说回三国, ...

  9. linux mysql 测试工具_LINUX系统下MySQL 压力测试工具super smack

    LINUX系统下MySQL 压力测试工具super smack 发布时间:2008-09-08 17:03:39   作者:佚名   我要评论 1. 源文件下载地址:http://vegan.net/ ...

最新文章

  1. /usr/bin/time -v 显示内容含义
  2. python编程前面需要一个空格怎么做_初学python,不明白代码之间时空格的用处
  3. 安装zookeeper集群及出现的问题
  4. datastage 函数_DataStage_Transformer常用函数
  5. 如何在本地开发环境调试微信 JS-SDK
  6. 用户领域 API 监控和代码注入检测
  7. 关于企业应用SAP成本管理模式与方法的一些思考
  8. 10.12.1 安装cocoapods及使用详解
  9. 为什么阿里规定需要在事务注解 @Transactional 中指定 rollbackFor?这...
  10. 华为天才少年-廖明辉
  11. c语言程序设计实验指导实验十二,C语言程序设计实验指导
  12. 遗传算法matlab_当结构设计遇到遗传算法应用ANSYS和MATLAB联合优化设计探索(二)...
  13. 在计算机检索中 有哪些方法能缩小,使用“或OR”运算将同义词连接起来可以缩小检索。()...
  14. 期权期货和金融衍生品学习笔记 -- 第一章引言
  15. 北京市房价预测---数据收集
  16. 标准模式(standard mode) 和 兼容模式(qurik mode)
  17. matlab fsolve fzero,Matlab中的fzero和fsolve函数
  18. 抖音四面被拒,再战头条终获offer,在线面试指南
  19. win 通过 Distro 安装 linux 子系统
  20. 布袋除尘器--预喷涂

热门文章

  1. 计算机网络基础概念与重要定义汇总
  2. 【CodeWars】 Pete, the baker
  3. 如何从零开始制作一款日式AVG游戏
  4. 对 matplotlib.cm.RdYlBu() 的理解
  5. time.Timer
  6. 《寄居者》 - 严歌苓
  7. SQL Server 安装程序遇到以下错误: 无法生成临时类(result=1)。 error CS1567: 生成 Win32 资源时出错: 另一个程序正在使用此文件,进程无法访问。...
  8. Qt刷新UI界面问题
  9. windows7下安装docker详细步骤
  10. [Camera Drv]开video dynamic framerate,特定场景下video encode时会闪屏 - MTK物联网在线解答 - 技术论坛