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表上唯一索引的影响,当在唯一索引上存在数据重复时,会导致数据丢失。
MySQL DDL--ghost工具学习相关推荐
- mysql ddl脚本_MySQL学习之路(1):SQL脚本语言
使用MySQL数据库,首先安装MySQL数据库,本文所有SQL脚本在MySQL上测试和执行. 安装Mysql服务器: 安装Mysql workbench客户端,可以以图形化界面管理mysql: 安装p ...
- MySql DDL日志_mysql学习日记——数据库基础与基本DDL、DML语句
# # # 数据库的基本概念 数据库: DataBase (DB).用于存储和管理数据的仓库. 数据库的特点: 1. 持久化存储数据的.其实数据库就是一个文件系统 2. 方便存储和管理数据 3. 使用 ...
- 【MySQL运维】使用gh-ost工具实现大表在线DDL变更
一.gh-ost介绍 作为MySQL DBA都会面临这样一个问题,就是当对大表(10G以上)进行DDL变更时会有长时间锁表问题,影响业务可持续性.目前解决这个问题的方案一个较为通用的使用Percona ...
- mysql gh 划线,gh-ost:在线DDL修改MySQL表结构工具
在之前,我分享过一次pt-online-schema-change在线DDL的工具实践记录,在实际使用过程中,发现部门的很多老系统大量使用了触发器,从而无法使用这个工具,非常遗憾!导致很多DDL变更都 ...
- 技术分享 | gh-ost 在线 ddl 变更工具
作者简介: 杨奇龙,网名"北在南方",7年DBA老兵,目前任职于杭州有赞科技DBA,主要负责数据库架构设计和运维平台开发工作,擅长数据库性能调优.故障诊断. 一.前言 作为 MyS ...
- MySQL实战45讲学习笔记
文章目录 MySQL实战45讲-学习笔记 01 基础架构:一条SQL查询语句是如何执行的? mysql逻辑架构 连接器 查询缓存 分析器 优化器 执行器 02 日志系统:一条SQL更新语句如何执行 r ...
- 淘宝商品库MySQL优化实践的学习
淘宝商品库MySQL优化实践的学习 淘宝商品库是淘宝网最核心的数据库之一,采用MySQL主备集群的架构,特点是数据量大且增长速度快,读多写少,对安全性要求高,并发请求高.由于MySQL最初的设计不是用 ...
- MySQL DBA必备工具使用的6大锦囊妙计
老张我呢不仅是个金庸迷,还是个三国迷.就是喜欢看后期蜀国诸葛亮与魏国司马懿之间的斗智斗勇.各种锦囊妙计的使用,堪称经典.针对管理MySQL数据库这块,张老师也有很多妙计,今后一一给大家介绍.说回三国, ...
- linux mysql 测试工具_LINUX系统下MySQL 压力测试工具super smack
LINUX系统下MySQL 压力测试工具super smack 发布时间:2008-09-08 17:03:39 作者:佚名 我要评论 1. 源文件下载地址:http://vegan.net/ ...
最新文章
- /usr/bin/time -v 显示内容含义
- python编程前面需要一个空格怎么做_初学python,不明白代码之间时空格的用处
- 安装zookeeper集群及出现的问题
- datastage 函数_DataStage_Transformer常用函数
- 如何在本地开发环境调试微信 JS-SDK
- 用户领域 API 监控和代码注入检测
- 关于企业应用SAP成本管理模式与方法的一些思考
- 10.12.1 安装cocoapods及使用详解
- 为什么阿里规定需要在事务注解 @Transactional 中指定 rollbackFor?这...
- 华为天才少年-廖明辉
- c语言程序设计实验指导实验十二,C语言程序设计实验指导
- 遗传算法matlab_当结构设计遇到遗传算法应用ANSYS和MATLAB联合优化设计探索(二)...
- 在计算机检索中 有哪些方法能缩小,使用“或OR”运算将同义词连接起来可以缩小检索。()...
- 期权期货和金融衍生品学习笔记 -- 第一章引言
- 北京市房价预测---数据收集
- 标准模式(standard mode) 和 兼容模式(qurik mode)
- matlab fsolve fzero,Matlab中的fzero和fsolve函数
- 抖音四面被拒,再战头条终获offer,在线面试指南
- win 通过 Distro 安装 linux 子系统
- 布袋除尘器--预喷涂
热门文章
- 计算机网络基础概念与重要定义汇总
- 【CodeWars】 Pete, the baker
- 如何从零开始制作一款日式AVG游戏
- 对 matplotlib.cm.RdYlBu() 的理解
- time.Timer
- 《寄居者》 - 严歌苓
- SQL Server 安装程序遇到以下错误: 无法生成临时类(result=1)。 error CS1567: 生成 Win32 资源时出错: 另一个程序正在使用此文件,进程无法访问。...
- Qt刷新UI界面问题
- windows7下安装docker详细步骤
- [Camera Drv]开video dynamic framerate,特定场景下video encode时会闪屏 - MTK物联网在线解答 - 技术论坛