热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQLOnlineDDL方案剖析

8.0可以支持快速加列好了,这里pt-online-shema-change是通过触发器的方式,来同

一、常见的几种方案

  • 1.1 MySQL 源生的IN-PLACE ONLINE DDL
5.5,5.6 开始支持
5.7 支持的更好,有更多ddl操作支持online
8.0 支持快速加列功能
  • 1.2 第三方工具
1. pt-online-schema-change
2. gh-ost
  • 1.3 slave 先ddl,后切换主从

二、方案剖析

2.1 MySQL源生的IN-PLACE ONLINE DDL

  • 原理
原理比较复杂,不一一解读。但是中间有几个重要的过程:  
1.加一会排它锁,开启战场,并释放排它锁    
2.记录ddl期间产生的增量dml(大小由innodb_online_alter_log_max_size控制)  
3.应用这些增量dml  
4.再加一会排它锁,清理战场,释放排它锁  

这里关心的问题:
1.如果再ddl期间,innodb_online_alter_log_max_size的大小被占满,会有怎样的后果?
2.如果DDL期间,被强行终止了,会有怎么样的后果?
  • 优点
1.官方出品,原生态,品质有保障
  • 缺点
1.有所等待风险  
2.innodb_online_alter_log_max_size 是有限制的  
3.有可能造成主从延迟  
4.不是所有的ddl都是online的,对ddl类型有要求
  • 哪些DDL可以online (基于5.7的官方文档)

8.0 可以支持快速加列

类型 操作 是否需要copy数据,重新rebuild表 是否允许并发DML 是否只修改元数据 备注
索引相关 创建、添加二级索引 NO YES NO -
索引相关 删除索引 NO YES YES -
索引相关 重命名索引 NO YES YES -
索引相关 添加FULLTEXT索引 NO* NO NO -
索引相关 添加SPATIAL索引 NO NO NO -
索引相关 改变索引类型(USING {BTREE or HASH}) NO YES YES -
主键相关 添加主键 YES* YES NO -
主键相关 删除主键 YES NO NO -
主键相关 删除主键并且又添加主键 YES YES NO -
列操作相关 添加列 YES YES* NO -
列操作相关 删除列 YES YES NO -
列操作相关 重命名列 NO YES* YES -
列操作相关 重新排列列(use FIRST or AFTER) YES YES NO -
列操作相关 设置列的默认值 NO YES YES -
列操作相关 修改列的数据类型 YES NO NO -
列操作相关 扩展varchar列的长度 NO YES YES 0~255 , 256 ~ 256+ 这两个区间可以in-place
列操作相关 删除列的默认值 NO YES YES -
列操作相关 修改auto-increcement的值 NO YES NO* -
列操作相关 使某列修改成NULL YES* YES NO -
列操作相关 使某列修改成NOT NULL YES* YES NO -
列操作相关 修改列定义为ENUM、SET NO YES YES -
表相关操作 optimizing table YES YES NO -
表相关操作 Rebuilding with the FORCE option YES YES NO -
表相关操作 Renaming a table NO YES YES -

三、第三方工具

3.0 第三方 工具 大致原理

  1. 先创建一个临时表 old_table_tmp
  2. 给临时表变更结构 alter old_table_tmp …
  3. 然后呢就是关键了: 将增量数据 和 原表的数据 都拷贝到 临时表
  4. 当原表数据拷贝完毕后,对原表加锁,进行切换
  5. 打扫战场,结束

好了,这里pt-online-shema-change 是通过触发器的方式,来同步增量数据的 , gh-ost 是通过模拟slave,监听binlog并应用binlog来完成增量数据同步的,这里是主要区别。

所以,不管哪种方式,这里需要解决一个时序的问题(因为rowcopy和row_apply是并行的,不知道哪个先哪个后),我们暂且认为 拷贝原表数据叫: rowcopy , 拷贝增量数据并应用为 row_apply

由于rowcopy从时序上来说,都是老数据,所以它的优先级是最低的,所以将rowcopy的动作转换为inset ignore,意味着,row apply是可以覆盖rowcopy数据的,这样理解没问题吧

好了,上面的问题解决了,其他的基本就不是问题了

3.1 pt-online-shema-change

  • 优点
1.percona 出品,必属金品

2.经过多年的生产环境验证,质量可靠

3.支持并发DML操作
  • 缺点
1. 原表不能有触发器
3. 由于触发器的原因,对master的性能消耗比较大
4. 处理外键有一定的风险,需要特殊处理  
5. 原表中至少要有主键或者唯一键
	检查是否具有主键或者唯一索引,如果都没有,这一步会报错  
	提示The new table `xx`.`_xx_new` does not have a PRIMARY KEY or a unique index which is required for the DELETE trigger.

6. ddl不能有添加唯一索引的操作
	如果对表增加唯一索引的话,会存在丢数据的风险。  
	具体原因是因为pt-osc在copy已有的数据时会使用insert ignore将老表中的数据插入到新表中,因为新表已经增加了unique index,所以重复的数据会被ignore掉
	--check-unique-key-change 可以避免  , 默认yes
  • 原理
1. 创建一张新表  
2. alter新表
3. 原表创建insert,update,delete三种触发器
4. 原表开始拷贝数据到新表,且触发器也开始映射到新表
5. 处理外键(如果没有忽略)
6. 重命名新表和原表  
7. 清理战场  


重要:

insert触发器 =SQL转换=> replace into

update触发器 
	=SQL转换=> delete ignore + replace into (大于3.0.2版本)
	=SQL转换=> replace into(低于3.0.2版本,所以这个版本会有问题,如果这时候对老的主键修改,那么修改之前的值不会去掉,从而多了一些异常数据)  
delete触发器 =SQL转换=> delete ignore

copy rows    =SQL转换=> insert ignore into
  • 最佳实践
1.innodb_autoinc_lock_mode 设置成 2 , 否则会经常死锁,autoinc锁  
2.如果中途ddl失败,需要先删除触发器,再删除新的临时表

3.2 gh-ost

  • 优点
1.无触发器设计
2.out-over方案设计
3.对主机性能级别无影响
4.可以暂停
  • 缺点
1.原表不能有外键
2.原表不能有触发器
3.强制要求binlog为row格式
4.原表不能有字母大小不同的同名表
5.当并发写入多的时候,在应用binlog阶段由于是单线程,所以会非常慢,影响ddl性能和进度
  • 原理
原理基本都一样,这里主要的区别就是row apply这里,pt-osc是触发器,这里是监听master binlog并应用日志,其余的差别不大,这里不再赘述

四、 slave 先ddl,后切换主从

如果其余方式都不行,只能祭出大招slave先ddl,然后主从切换了

  • 优点
1.slave操作,不影响master
  • 缺点
1. 需要主从切换,主从切换越平滑,此方案就越好  
2. 有几点需要考虑和处理下:
	2.1 add column after|before , 这样的操作slave先做是否有影响  
	2.2 slave先新增字段,可能会导致主从同步停掉,需要设置某些参数

五、 ONLINE DDL 最佳方案选型

    1. 如果是创建索引、修改默认值这样的,online ddl 快速且无影响的操作,尽量优先选择online ddl
    1. 如果当前服务器写入量不高,负载不高,且原表没有触发器,没有外键,且此表有主键,尽量优先选择pt-online-schema-change
    1. 其余情况,选择主从切换

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 我们


推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 如何使用代理服务器进行网页抓取?
    本文介绍了如何使用代理服务器进行网页抓取,并探讨了数据驱动对竞争优势的重要性。通过网页抓取,企业可以快速获取并分析大量与需求相关的数据,从而制定营销战略。同时,网页抓取还可以帮助电子商务公司在竞争对手的网站上下载数百页的有用数据,提高销售增长和毛利率。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • 统一知识图谱学习和建议:更好地理解用户偏好
    本文介绍了一种将知识图谱纳入推荐系统的方法,以提高推荐的准确性和可解释性。与现有方法不同的是,本方法考虑了知识图谱的不完整性,并在知识图谱中传输关系信息,以更好地理解用户的偏好。通过大量实验,验证了本方法在推荐任务和知识图谱完成任务上的优势。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
author-avatar
漂亮的花裙子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有