MySQL5.6的Online DDL不是真正的Online DDL

Online DDL是从mysql5.6版本后引入的新功能,可以实现在线DDL操作不锁表。但是MySQL5.6的Online DDL不是真正的Online DDL,针对部分操作还是有局限性。

5.6之前的DDL处理方式:

1、创建临时表

2、将原表加S锁(只能读,不能DML)

3、将原表数据导入临时表

3、删除原表

4、把临时表重命名成新表

这种情况会对表加一个S锁,其他用户只能访问,不能执行DML操作,如果数据量越大,锁时间越长,对业务影响也越长。

5.6之后的DDL处理方式:

innodb_online_alter_log_max_size参数,默认为128M,超出范围会报错,所以处理大表的情况下需要调整这个值。作用是将DML产生的日志先插入缓存中的最大允许大小。

old_alter_table参数,判断是通过INPLACE还是COPY的算法,默认为OFF,表示采用INPLACE的方式:

INPLACE 表示创建索引或删除索引操作不需要创建临时表;

COPY 表示按照MySQL 5.1版本之前的方法,即创建临时表。

1、将INSERT、UPDATE、DELETE这类DML操作日志写入到一个缓存中

2、是否在原表上修改,还是采用临时表跟具体操作有关,不是所有的操作都建临时表、也不是所有的操作都在原表修改(见如下表格说明)

3、在原表上修改或采用临时表也不一定会加S锁(见如下表格说明)

4、待完成后再将缓存中的数据应用到表上,以此达到数据的一致性

只有以下几类DDL操作不可以通过“Online”的方式进行:会影响其他DML操作

1、新加字符编码不同

2、更改列数据类型

3、删除主键

4、添加全文索引

所以5.6的Online DDL并不是真正的Online DDL,如果想保证尽量不锁表,可以使用oak-online-alter-table和pt-online-schema-change等工具。

原理:

1、首先会对表进行分析(数据量、外键等)

2、创建一个临时表

3、创建触发器(3个),用户跟踪插入、更新、删除的数据(原表有写入,通过触发器复制到临时表)

4、copy数据

5、更新外键关联的子表

6、数据一致后将原表rename成_old,将临时表rename成原表(瞬间)

7、删除_old表

8、删除触发器

https://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html#innodb-online-ddl-summary-grid

原文发布于微信公众号 - MYSQL轻松学(learnmysql)

原文发表时间:2017-09-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏维C果糖

史上最简单的 MySQL 教程(二十三)「数据的高级操作 之 查询(上)」

字段别名,即当数据进行查询的时候,有时候字段的名字并不一定满足需求(特别地,在多表查询的时候,很可能会有同名字段),这时就需要对字段进行重命名、取别名。

3446
来自专栏zhisheng

Windows 64位下安装Redis超详细教程

Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(...

32612
来自专栏xingoo, 一个梦想做发明家的程序员

[Logstash-input-redis] 使用详解

redis插件的完整配置 input { redis { batch_count => 1 #返回的事件数量,此属性仅在list模式下起...

25510
来自专栏orientlu

初试 Protocol Buffer

如下, 一般情况下,进行消息发送的时候,对于 c/c++, 双方统一使用相同的结构体,发送时直接按内存块丢出去,接收后内存块直接赋值给结构体即可。但是这种对于其...

563
来自专栏Albert陈凯

Hadoop数据分析平台实战——140Hive函数以及自定义函数讲解离线数据分析平台实战——140Hive函数以及自定义函数讲解

离线数据分析平台实战——140Hive函数以及自定义函数讲解 Hive函数介绍 HQL内嵌函数只有195个函数(包括操作符,使用命令show functions...

2698
来自专栏大内老A

从数据到代码——基于T4的代码生成方式

在之前写一篇文章《从数据到代码》(上篇、下篇)中,我通过基于CodeDOM+Custom Tool的代码生成方式实现了将一个XML表示的消息列表转换成了相应的C...

2028
来自专栏noteless

HttpServletResponse ServletResponse 返回响应 设置响应头设置响应正文体 重定向 常用方法 如何重定向 响应编码 响应乱码

HttpServletResponse  和 ServletResponse  都是接口

531
来自专栏Java 技术分享

Struts2 转换器

2527
来自专栏Albert陈凯

mapreduce项目调优

一、调优的目的 充分的利用机器的性能,更快的完成mr程序的计算任务。甚至是在有限的机器条件下,能够支持运行足够多的mr程序。 二、调优的总体概述 从mr程...

3166
来自专栏偏前端工程师的驿站

.Net魔法堂:log4net详解

一、作用                              提供一个记录日志的框架,可以将日志信息记录到文件、控制台、Windows事件日志和数据库(M...

1875

扫描关注云+社区