【MySQL】执行DDL选择Online DDL还是PT-OSC?

news2024/12/25 12:45:19

目录

    • 1.前言
    • 2.Online DDL和PT-OSC原理、执行机制以及优缺点
      • 2.1.Online DDL
      • 2.2.PT-OSC
    • 3.各种常用DDL操作如何选择

1.前言

MySQL DDL(Data Definition Language)表结构变更,主要支持Online DDL和PT-OSC模式,但是即使知道两者的工作原理,在什么情况下选择什么模式新增或者更改mysql的表结构,感觉能完整清楚表述出的文章并不太多。
因此站在巨人的肩膀上,将大佬的总结,进行理解、补充和记录。

以下文章以 MySQL 5.7.24 版本作为讲述依据
官方文档:https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html

2.Online DDL和PT-OSC原理、执行机制以及优缺点

在线DDL(Data Definition Language)操作和Percona Toolkit中的pt-online-schema-change工具都是为了在不停机的情况下进行数据库模式更改而设计的,旨在减少或消除对应用程序的影响。

他们的一个显著区别在Online DDL采用数据迁移的方式将原数据逐步迁移到新表中,而PT-OSC采用的是直接复制原表数据

2.1.Online DDL

在线DDL操作利用数据库管理系统(DBMS)内部的机制来实现在服务不中断的情况下修改表结构。这通常通过创建一个新表(具有新的模式),然后在后台将旧表的数据迁移到新表,最后原子性地交换两个表的引用,从而完成模式变更。整个过程对外部查询是透明的,可以继续访问旧数据,直到切换完成。
包含以下几个步骤:

  • 创建新表:创建一个与原表结构相似但包含所需更改的新表。
  • 数据迁移:将原表的数据逐步迁移到新表中。
  • DML重放:在数据迁移过程中,捕获并重放所有对原表的DML(数据操纵语言)操作,以保持数据一致性。
  • 表交换:完成数据迁移和DML重放后,使用原子操作替换原表和新表的引用,确保客户端无缝过渡到新表。
  • 清理:删除旧表或将其标记为废弃。

优点:

  • 无停机时间:可以在不影响应用服务的情况下进行模式更改。
  • 数据一致性:保证数据在迁移过程中的完整性和一致性。

缺点:

  • 性能影响:在数据迁移期间,可能会影响数据库的写入性能。主要集中在DML重放
  • 资源消耗:需要额外的存储空间来容纳新表。
  • 复制延迟:如果有从库,这有一个很致命的弱点。因为主库执行的动作,会在从库再来一遍,如果这个动作是非常耗时的,那在从库执行(重放主库的动作)的时间点开始,其后续所有动作都被堵塞住,直到从库也执行完这个DDL后,才会继续按顺序执行其他SQL。这就就意味着,从从库执行开始,从库复制就出现了延迟,延迟的时间会慢慢变大,直到DDL执行完后,延迟才会慢慢变小。
  • 特殊情况:云侧MySQL RDS,本身有一个隐藏从库用于高可用,因为这个隐藏从库不对外提供服务,所以基本上业务侧也不需要去关注他。但极端情况,如果大表DDL操作使用Online DDL模式时,在隐藏从库正在执行DDL期间,主库挂了,那常理就需要切换到隐藏从库,才能继续提供服务,但为了保证数据的一致性,隐藏从库必须要等DDL执行完,再回放DDL之后的binlog,然后,才能将其提升为主库,对外提供服务,所以这个恢复时间有可能很长。总得来讲,这个情况对业务而言也是致命的,只不过概率极低。

2.2.PT-OSC

pt-online-schema-change是一个外部工具,它利用自身的算法和技术来实现在线DDL操作,它通过创建一个与原表结构相似的新表,并逐步将数据从旧表复制到新表,同时应用任何结构更改。在复制过程中,它会捕获并重放DML(Data Manipulation Language)操作,确保数据的连续性和一致性。复制完成后,它会原子性地替换原表。
包含以下几个步骤:

  • 创建副本:同样创建一个与原表结构相同的新表,但在此基础上进行所需的结构更改。
  • 数据复制:开始将原表的数据复制到新表,同时使用多线程技术来加速复制过程。
  • DML捕获与重放:使用二进制日志或其他机制捕获原表的所有DML操作,并在新表上重放,以保持数据同步。
  • 表替换:数据复制和DML重放完成后,执行原子性的表替换操作。
  • 后期处理:清理临时资源,如删除旧表或调整索引。

优点:

  • 高度自动化:提供了丰富的选项和自动化功能,简化了在线模式更改的过程。

    • 它可以自动从源表复制数据到新表。这个过程是增量的,意味着它会持续监控源表上的更改(包括插入、更新和删除),并将这些更改同步到新表,直到模式更改完成。
    • 提供了详细的进度报告,包括复制了多少数据、剩余多少数据、复制速率等信息,这有助于DBA实时监控操作状态
    • 允许用户调整各种参数,如内存使用、并发级别、复制策略等,以便更好地适应不同的硬件条件和数据库负载。这些高级配置选项可能在标准的在线DDL操作中是不可用的
    • 内置了错误恢复机制,能够在遇到问题时自动尝试恢复,或者至少保持数据的一致性,避免半途而废导致的问题。这在标准的在线DDL操作中可能需要额外的手动步骤来实现。
  • 灵活:支持多种数据复制策略,如多线程复制,以提高效率,也就是说可以并行处理多个分区或表的一部分,从而加速数据迁移过程,减少对数据库性能的影响,并且允许用户根据数据库的具体情况定制执行计划,比如先复制哪些数据、后复制哪些数据,这在标准的在线DDL操作中可能不是一个可选功能

  • 兼容性:适用于多种MySQL版本和配置环境。

缺点:

  • 需要将老表的所有数据都拷贝到新表上,这就意味着拷贝期间,磁盘IO可能较高。 要拷贝全量数据,所以执行时间也会很长。
  • 新临时表存放数据也需要空间(最大空间需求可能和原表一样),拷贝数据时还会产生大量binlog,所以对于本来空间就紧张的实例而言,这方式真的是雪上加霜

3.各种常用DDL操作如何选择

原理理解之后,到选择阶段就很容易了,以下是我整理的常用的选择,如果想了解更多,可以看这篇文章:
https://developer.jdcloud.com/article/3923?mid=30

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2033608.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谷粒商城实战笔记-173~174-商城业务-检索服务-搭建页面环境-调整页面

文章目录 一,173-商城业务-检索服务-搭建页面环境1,引入thymeleaf2,search模块导入模板页面3,配置域名4,上传静态资源到nginx的html目录5,nginx配置5.1 域名监听配置5.2 静态资源静态配置 6,sea…

Altium Designer 18原理图器件自动标号

前言: 当我们绘制原理图时,元器件的位号是不会自动生成的,位号大都是乱的,造成出图时十分不和谐。 器件位号修改 第一种方法: 可以先修改一个器件位号,按住shift 键然后再拖动器件会生成一个新的&…

Python面试宝典第33题:电话号码的字母组合

题目 给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合,答案可以按任意顺序返回。给出数字到字母的映射如下图(与手机按键相同)。注意:1不对应任何字母。 示例 1: 输入:digits &quo…

【网络】IP的路径选择——路由控制

目录 路由控制表 默认路由 主机路由 本地环回地址 路由控制表的聚合 网络分层 个人主页:东洛的克莱斯韦克-CSDN博客 路由控制表 在数据通信中,IP地址作为网络层的标识,用于指定数据包的目标位置。然而,仅有IP地址并不足以确…

Linux 进程间通信之管道

个人主页:仍有未知等待探索-CSDN博客 专题分栏: Linux 目录 一、通信 1、进程为什么要通信? 1.数据的类型 2.父进程和子进程算通信吗? 2、进程如何通信? 3、进程通信的常见方式? 二、管道 1、概念…

SpringBoot中整合Mybatis

一、Mybatis快速入门 1.1、在相应的模块中添加依赖的坐标 首先创建一个maven项目 在对应的pom.xml文件中引入下面的依赖 <dependencies><!--mybatis 依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artif…

【已解决】如何解决雅马哈机械手无法连接到在线模式的问题

前言 在一个项目中用到了雅马哈机器手&#xff0c;但是现场操作的时候进场出现连接不上的问题&#xff0c;经过与官方技术讨论得出以下的解决方法。 解决方法 避免这个问题出现在操作完之后必须将机械手控制器切换成离线模式。主要原因&#xff1a;1、机械手控制器本身是属…

什么是知识中台?如何搭建企业知识中台?(企业必懂术语)

一、什么是知识中台&#xff1f; 知识中台是一个集中管理、整合和共享企业知识资源的平台。它利用云计算、大数据和人工智能等技术&#xff0c;将企业内部各部门、各员工手中的知识资源进行集中整合&#xff0c;形成统一的知识库。通过这个平台&#xff0c;员工可以快速查找、…

BGP边界网关协议基础详细

1.BGP概述 1.1 BGP基础 应用层协议&#xff0c;基于TCP&#xff0c;源端口号是随机&#xff0c;目的端口是179。 无类路由协议、外部网关路由协议、采用距离(路径)矢量算法、单播路由协议 核心作用为传递路由。 1.2 AS自治系统 AS是指由同一个技术管理机构管理&#xff0…

数据可视化:解锁数据奥秘的钥匙与实战指南

如何有效地解读和利用这些数据成为了企业和个人面临的重大挑战。数据可视化&#xff0c;作为连接数据与洞察的桥梁&#xff0c;正逐步成为数据分析与决策支持不可或缺的工具。本文将深入探讨数据可视化的本质、用途分类、设计原则、高效制作技巧&#xff0c;并通过Axure产品设计…

四数相加2 | LeetCode-454 | 哈希集合 | Java详细注释

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f579;️思路&#xff1a;四数相加 > 两数相加 &#x1f4cc;LeetCode链接&#xff1a;454. 四数相加 II 文章目录 1.题目描述&#x1f34e;2.题解&#x…

事件驱动系统设计之将事件检索与事件处理解耦

0 前言 part1讨论了集成过程中遇到的挑战以及幂等事件处理的作用。解决集成问题之后&#xff0c;我们需要反思事件检索的问题。我们的经验教训表明&#xff0c;将事件检索与事件处理解耦至关重要。 1 事件处理与请求/响应 API 紧耦合 part1讨论了将请求/响应 API 集成到事件…

变量的注意或许需要调试

输入一个自然数N&#xff08;1<N<9&#xff09;&#xff0c;从小到大输出用1~N组成的所有排列&#xff0c;也就说全排列。例如输入3则输出 123 132 213 231 312 321 输入格式: 输入一个自然数N&#xff08;1<N<9&#xff09; 输出格式: N的全排列&#xff0c;每行一…

8.12 day bug

bug1 一定要记得改变this指向&#xff0c;否则调用时this不再指向实例而是调用的上下文。 This.handleChange this.handleChange.bind(this); bug2 同样的代码莫名其妙就是没行&#xff0c;复制粘贴到通义千问&#xff0c;再复制回来居然就行了&#xff0c;prompt是“编写代…

R语言中的命名规则

在R语言中&#xff0c;为变量、元素、函数或对象命名时&#xff0c;遵循一定的规则是至关重要的。这些规则确保代码的可读性、可维护性&#xff0c;并避免与R语言的内部函数和保留字产生冲突。下面我们将详细探讨R中命名的具体规则和注意事项。 1、名字中允许的字符 R语言的命…

数据库方式实现实时排行榜

文章目录 &#x1f31e; Sun Frame&#xff1a;SpringBoot 的轻量级开发框架&#xff08;个人开源项目推荐&#xff09;&#x1f31f; 亮点功能&#x1f4e6; spring cloud模块概览常用工具 &#x1f517; 更多信息1.排行榜的设计1.实时榜单1.数据库统计2.redis 的 sorted set …

25届秋招还有金九银十?会是“史上最难”?

吉祥学安全&#xff1a;知星&#x1f517;http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247483727&idx1&sndb05d8c1115a4539716eddd9fde4e5c9&chksmc0e47813f793f105017fb8551c9b996dc7782987e19efb166ab665f44ca6d900210e6c4c0281&scene21#wechat…

友元的一些资料

友元&#xff1a;可以访问私有权限下的一种代码 全局函数作友元&#xff1a; 我们创建了两个属性&#xff0c;并且通过无参构造函数给属性赋了值&#xff0c; 这个时候再创建一个goodgay类&#xff0c;形参是应用的buil1的对象&#xff0c;用这个引用的对象调用属性。所以下面…

笔记(day17)集合概述、List、Set、比较器

集合Collection 一.概述 ​ 集合可以理解为数据结构的封装,根据不同的特性及操作性能进行分类 二.继承体系 三.Collection中常用方法 ​ collection是集合中的父类,所以collection中的方法是所有集合中都有的 ​ 集合中只能保存引用类型(Object),无法保存基本类型 ​ Colle…

记一次CSDN认证模块后端未校验漏洞

前言 作为一个程序员&#xff0c;一直充满好奇心&#xff0c;没事就喜欢找找漏洞&#xff0c;试想一下某些程序是否存在某些鉴权等漏洞&#xff0c;目前该漏洞已提交官方&#xff0c;且影响不大&#xff0c;现分享分析过程用于各位技术学习。 漏洞分析 https://i.csdn.net/#…