一、常见的几种方案

  • 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 intoupdate触发器=SQL转换=> delete ignore + replace into (大于3.0.2版本)=SQL转换=> replace into(低于3.0.2版本,所以这个版本会有问题,如果这时候对老的主键修改,那么修改之前的值不会去掉,从而多了一些异常数据)
delete触发器 =SQL转换=> delete ignorecopy 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. 其余情况,选择主从切换

MySQL Online DDL 方案剖析相关推荐

  1. 6 种 MySQL 数据库平滑扩容方案剖析

    更多内容关注微信公众号:fullstack888 1. 扩容方案剖析 1.1 扩容问题 在项目初期,我们部署了三个数据库 A.B.C,此时数据库的规模可以满足我们的业务需求.为了将数据做到平均分配,我 ...

  2. MySQL 数据库平滑扩容的6 种方案剖析

    1. 扩容方案剖析 1.1 扩容问题 在项目初期,我们部署了三个数据库 A.B.C,此时数据库的规模可以满足我们的业务需求.为了将数据做到平均分配,我们在 Service 服务层使用 uid%3 进行 ...

  3. MySQL Group Replication调研剖析

    以下转自 http://www.iteye.com/news/32090 MySQL Group Replication调研剖析 引用 作者简介:王伟,京东基础平台数据库工程师,京东商城基础平台部门包 ...

  4. mysql怎么在海量数据上ddl_浅谈MySQL Online DDL(中)

    本文首发于个人微信公众号<andyqian>,期待你的关注! 前言 在上一篇文章中<浅谈MySQL Online DDL (上)>中,我们谈到了MySQL Online DDL ...

  5. MySQL高可用方案-PXC环境部署记录

    之前梳理了Mysql+Keepalived双主热备高可用操作记录,对于mysql高可用方案,经常用到的的主要有下面三种: 一.基于主从复制的高可用方案:双节点主从 + keepalived 一般来说, ...

  6. 带你玩转Mysql高可用方案--PXC

    目录 理论篇 基于Galere协议的高可用方案:pxc PXC介绍 PXC特性 PXC优缺点 PXC原理描述 PXC的架构示意图 数据读写示意图 下面看传统复制流程 异步复制 半同步 超过10秒的阀值 ...

  7. 数据库平滑扩容方案剖析

    1. 扩容方案剖析 1.1 扩容问题 在项目初期,我们部署了三个数据库A.B.C,此时数据库的规模可以满足我们的业务需求.为了将数据做到平均分配,我们在Service服务层使用uid%3进行取模分片, ...

  8. MySQL 的优化方案总结

           性能优化(Optimize)指的是在保证系统正确性的前提下,能够更快速响应请求的一种手段.而且有些性能问题,比如慢查询等,如果积累到一定的程度或者是遇到急速上升的并发请求之后,会导致严重 ...

  9. Mysql性能优化方案

    2019独角兽企业重金招聘Python工程师标准>>> 内容简介:这是一篇关于mysql 性能优化的文章.网上有不少mysql 性能优化方案,不过,mysql的优化同sql serv ...

最新文章

  1. android sco通信,android – startBluetoothSco()在ICS上抛出安全异常(BROADCAST_STICKY)
  2. UnsatisfiedLinkError解决办法
  3. python下载安装教程mac-mac上如何安装python3
  4. sqlsever2008数据库的备份与还原
  5. java私有属性和私有方法_Java接口–历年来Java 9之旅–默认方法和私有方法
  6. 猎户座计划软件测试,四核配置跑分:猎户座4412性能强劲_平板电脑评测-中关村在线...
  7. (转) 淘淘商城系列——Redis的安装
  8. python selenium语法_Python+Selenium基本语法
  9. c语言木马源代码下载,木马编程 之超强服务... 附代码 原创.
  10. Tomcat中配置文件conf修改的一些常识
  11. [转] PHP:自己动手制作伪原创程序
  12. Hive数据分析案例
  13. C#利用QRCode动态生成自定义二维码图片
  14. 背壳BAKAZU 2013复古邮差风帆布休闲潮男腰包 A801BK 黑色 腰包胸包【图片 价格 品牌 报价】-京东商城...
  15. MySQL ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
  16. 2011 ATMEL AVR 校园设计大赛获奖名单
  17. Navicat For MySQL简体中文版 V8.2.20注册码
  18. 三菱FX2NPLC 顺序控制与顺序功能图
  19. 2018计算机网络考试,2018本科《计算机网络》期末考试试卷及答案
  20. oracle adf lov,adf oracle selectOneChoice 加 LOV 后手动设置Lov的值

热门文章

  1. verilog中阻塞赋值与 非阻塞赋值的区别
  2. JavaScript使用button提交表单
  3. 组合数学之排列组合(Permutations and Combinations)(四种情况)
  4. Myeclipse中添加XFire插件支持
  5. http请求头中包含未编码中文时webapi self host崩溃
  6. OpenCV统计应用-CvHistogram直方图资料
  7. rCNN学习笔记二:基于R-CNN的物体检测
  8. 数据结构笔记(十六)-- 数组实现
  9. stl之multiset容器的应用
  10. java 数据挖掘 开源_5个开源数据挖掘工具,收下这波干货