返回顶部
首页 > 资讯 > 数据库 >gh-ost的cut-over过程
  • 195
分享到

gh-ost的cut-over过程

gh-ost的cut-over过程 2015-08-21 06:08:49 195人浏览 猪猪侠
摘要

作者:魏新平,知数堂第5期Mysql实战班学员,第10期mysql优化班学员,现任职助教。 Describing safe, blocking, atomic, pure-mysql cut-over phase 原文链接:https:

gh-ost的cut-over过程

作者:魏新平,知数堂第5期Mysql实战班学员,第10期mysql优化班学员,现任职助教。

Describing safe, blocking, atomic, pure-mysql cut-over phase

原文链接:https://GitHub.com/github/gh-ost/issues/82

作者:shlomi-noach

我们提供的方式是基于两个数据库连接的。假如我们的连接是C10,C20。应用的连接是C1..C9,C11..C19,C21..C29。

  • C1..C9在 tbl 上进行正常的dml操作:INSERT, UPDATE, DELETE

  • C10: CREATE TABLE tbl_old (id int primary key) COMMENT="magic-be-here"

  • C10: LOCK TABLES tbl WRITE, tbl_old WRITE

  • C11..C19,新进来的对tbl的操作,由于C10的,会被阻塞

  • C20: RENAME TABLE tbl TO tbl_old, ghost TO tbl

  • 由于C10加的锁,也会被阻塞住。但是当锁被释放后,会比C1..C9,C11..C19先执行。

  • C21..C29,新进来对tbl的dml操作还是会被阻塞住

  • C10: 检测C20的rename操作是否存在(在show processlist当中寻找rename关键字)

  • C10: DROP TABLE tbl_old

  • 大家还是被锁住,什么严重的事情都不会发生,除了删除这个tbl_old表。

  • C10:UNLOCK TABLES

  • BAM(象声词,不知道怎么翻译,尴尬,只能意会不能言传)!RENAME操作会先执行,ghost表会被重命名为tbl表,然后C1..C9,C11..C19,C21..C29会直接在新的tbl表上执行。

一些解释:

  • 创建tbl_old是为了阻止C20的RENAME操作

  • 当一个连接拥有对某个表的WRITE锁的时候,可以执行drop该表的操作。

  • 不管是谁先被阻塞,当一个表的INSERT/UPDATE/DELETE操作和RENAME操作同时被阻塞的情况下,RENAME操作总是会先执行。

假如上面的过程当中C10或者C20失败了,会发生什么呢

先说结论,就算失败了,不会发生灾难性的事情,也不需要回滚。

  • 假如C10在CREATE tbl_old的时候发生错误,直接退出

  • 假如C10在LOCK tbl,tbl_old的语句发生错误,直接退出,表不会被锁住,app可以继续对tbl进行dml操作

  • 假如C10在C20刚要执行RENAME操作的时候连接直接挂了

  • WRITE锁会被释放掉,C1..C9,C11..C19可以继续在原表执行

  • C20会因为tbl_old表的存在而RENAME失败

  • 整个操作失败,但是没什么严重的问题产生,只是一些语句被阻塞了很短的一段时间。我们会重试整个cut-over流程。

  • 假如C10在C20被阻塞后挂了,发生的事情和上面的流程差不多。锁释放,C20失败(因为tbl_old的存在),其他所有的被阻塞的语句会正常在原来的表上执行

  • 假如C20在C10 DROP表之前挂了,我们会捕捉到错误并按计划执行。删除表并且释放锁。没什么严重的事情发生,顶多一些语句被阻塞一会。我们需要重新尝试整个流程。

  • 假如C20在C10 DROP后释放锁之前挂了,和上面发生的事情一样。

  • 假如C10和C20都挂了。锁被释放,RENAME失败,C1..C9,C11..C19,C21..C29阻塞的语句会正常在tbl上执行。

不管发生什么事情,在操作的最后我们都会检查ghost表是否还存在。假如不在了,那就说明操作成功了。整个流程可以被看成是原子性的。

顺便说一下,如果操作失败了,可能会存在table_old表需要我们手动删除。其实删不删除都无所谓。如果你看不惯可以删除掉,不删除掉的话,也没关系,下一次操作就不用重建了。

对应用的影响

在流程开始之后到流程结束的时间里,不管是成功还是失败,应用的连接都会被阻塞住。成功的话,阻塞的语句会被执行到新表,失败的话,阻塞的语句会执行到旧表。

对复制的影响

复制只会看到RENAME操作,binlog是不会记录lock语句的。所以复制看到的是原子性的两表交换,不会有表不存在的情况。

针对网友的一些提问

为啥要用两个连接进行这么麻烦的流程?

因为一个连接在获取tbl的锁的情况下,无法进行rename操作(至少现在不能)。但是作者说他会说服工程师在MYSQL的下个版本当中实现,就不需要这么麻烦的操作了。(下面代码测试是我测试的,不是作者的)

admin@localhost [test]  11:39:32>lock table t write;
Query OK,  0 rows affected (0.00 sec)
    
admin@localhost [test]  11:39:36>rename table t to t10;
ERROR 1192  (HY000):  Can"t execute the given command because you have active locked tables or an active transaction
admin@localhost [test] 11:39:48>select @@version;
+---------------+
| @@version     |
+---------------+
| 5.7.22-22-log |
+---------------+
1 row in set (0.00 sec)
为啥要锁原来的表和创建的tbl_old表?

由于异步的应用binlog的日志,如果不锁住原表的话,可能会存在一些语句未被应用。为啥要锁住tbl_old表呢,作者自己也不太记得了,因为时间的原因,毕竟是回忆三年前的事情了,不过肯定是有原因的。

您可能感兴趣的文档:

--结束END--

本文标题: gh-ost的cut-over过程

本文链接: https://lsjlt.com/news/5263.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • gh-ost的cut-over过程
    作者:魏新平,知数堂第5期MySQL实战班学员,第10期MySQL优化班学员,现任职助教。 Describing safe, blocking, atomic, pure-mysql cut-over phase 原文链接:https:...
    99+
    2015-08-21
    gh-ost的cut-over过程
  • MySQL中gh-ost的原理是什么
    这篇文章将为大家详细讲解有关MySQL中gh-ost的原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一.简介gh-ost基于 golang 语言,是 github 开源的一个 DD...
    99+
    2023-06-14
  • MySQL在线DDL工具 gh-ost的原理解析
    目录一.简介1.1 原理1.2 过程1.3 特性1.4 github地址二.测试环境:2.1 测试服务器2.2 安装2.3 创建用户2.4 命令参数三. 操作模式四.gh-ost与p...
    99+
    2024-04-02
  • 在线更改MySQL表结构工具gh-ost的特点介绍
    无触发器:这也是其他工具最受诟病之处。触发器方案会对MySQL的性能造成比较大的影响,严重时甚至会拖垮主库。 轻量级:gh-ost获取数据表修改操作的方法是伪装成从库连入,获取并解析二...
    99+
    2022-11-30
    mysql gh-ost 介绍
  • GitHub开源的MySQL在线更改Schema工具gh-ost是怎样的
    今天就跟大家聊聊有关GitHub开源的MySQL在线更改Schema工具gh-ost是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。MySQL...
    99+
    2024-04-02
  • Oracle数据库存储过程的调试过程
    目录oracle存储过程调试方法Oracle 存储过程的调试总结oracle存储过程调试方法 PL/SQL中为我们提供了【调试存储过程】的功能,可以帮助你完成存储过程的预编译与测试。 点击要调试的存储过程,右键...
    99+
    2022-07-05
    oracle 调试存储过程 oracle 存储过程怎么调试 oracle存储过程如何调试
  • oracle存储过程转达梦8存储过程时踩过的坑
    达梦存储过程的语法与oracle的高度相似,但有好多细节还是有差异。我在这次项目迁移中踩过不少小坑,在这里给大家分享一下。 说明一下,我用的版本是达梦8,迁移时碰到的问题有些我已经反馈给达梦的官方群管理员,估计以后会有修复。 rp...
    99+
    2021-04-19
    oracle存储过程转达梦8存储过程时踩过的坑
  • Python程序的执行过程
    原文出处:http://www.cnblogs.com/kym/archive/2012/05/14/2498728.html1、C++和C都是属于编译型语言,本来的.c文件都是用高级语言编写的,计算机是不能识别高级语言的,所以,必须要通过...
    99+
    2023-01-31
    过程 程序 Python
  • Oracle的启动过程
        a、先找到初始化文件(spfile或者pfile),此时数据库处在nomount状态;     b、根据初始文件找到控制文件(Control File),此时数据库处于mount状态;mount状态会读取控制文件中的参数    ...
    99+
    2014-06-10
    Oracle的启动过程
  • mysql的存储过程
    什么是存储过程 一组可编程的函数,是为了完成特定功能的SQL语句集 经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。 存储过程就是具有名字的一段代码,用来完成一个特定的功能。 创建的存储过...
    99+
    2015-04-21
    mysql的存储过程
  • pymongo 的安装过程
    下载pymongo  的相关版本wget http://pypi.python.org/packages/source/p/pymongo/pymongo-2.6.3.tar.gz tar -zx...
    99+
    2024-04-02
  • mongodb的学习过程
        近段时间感觉有点迷茫了,不知道该做什么,今天上班看看自己的监控数据,想想能不能为了读写速度我把数据写入到mongodb里面这种非关系型数据库里面呢,下面开始学习mong...
    99+
    2024-04-02
  • [ORACLE DATAGUARD] switchover的过程
    1.检查主库的状态:SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;SWITCHOVER_STATUS--------------------TO ...
    99+
    2024-04-02
  • redis的搭建过程
    本篇内容介绍了“redis的搭建过程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!redis官网:http...
    99+
    2024-04-02
  • hadoop的搭建过程
    本篇内容主要讲解“hadoop的搭建过程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“hadoop的搭建过程”吧!!出现不能用rz命令:yum install ...
    99+
    2024-04-02
  • Flask的安装过程
    本篇内容介绍了“Flask的安装过程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!安装Flask首先我们来安装Flask。最简单的办法就是使...
    99+
    2023-06-05
  • HTTPS 的传输过程
    系列文章目录 如何使用代码来构造HTTP请求?_crazy_xieyi的博客-CSDN博客 HTTP协议中常见的状态码及其含义_crazy_xieyi的博客-CSDN博客 HTTP协议中的“报头”(header)和 “正文“ (body)详...
    99+
    2023-08-31
    https 服务器 网络 网络协议 http
  • Seminario的安装过程
    关于Seminario Seminario是GitHub上的一个“使用Seminario方法的工具估算力场参数”的项目。我安装的过程出现了很多坑~特此记录。 安装过程 在GitHub上下载 Seminario 。 打开命令行,进入Sem...
    99+
    2023-01-31
    安装过程 Seminario
  • springsecurity3实现的过程
     1.在类初始化的时候,InvocationSecurityMetadataSource类就会调用loadResourceDefine()的方法,取到所用的资源对应的角色关系。(这个步骤是在tomcat容器启动的时候调用的)  2.当用户访...
    99+
    2023-01-31
    过程
  • CentOS6.5的部署过程
    这篇文章主要介绍“CentOS6.5的部署过程”,在日常操作中,相信很多人在CentOS6.5的部署过程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CentOS6.5的部署过程”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作