关于mysql 5.6 哪些操作可以进行online ddl 详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于mysql 5.6 哪些操作可以进行online ddl 详解相关的知识,希望对你有一定的参考价值。

  实际测试中add primary key 和修改字段类型是需要copy tmp table的并且阻塞dml操作,另外在5.6.17版本之前时候用alter table table_name engine=innodb 是需要 copy table的并且也阻塞dml。

  本来打算翻译成中文,后来发现这些英文实在是太简单了,就直接贴出来吧。

  请看下图:

  

参考技术A

Online DDL 工具:pt-osc

对于 mysql Online DDL 目前主流的有三种工具:

    原生 Online DDL;

    pt-osc(online-schema-change),

    gh-ost

    本文主要讲解 pt-online-schema-change 的使用以及三种工具的简单对比。

    一、原理及限制

    1.1 原理

    1. 创建一个与原表结构相同的空表,表名是 _new 后缀;

    2. 修改步骤 1 创建的空表的表结构;

    3. 在原表上加三个触发器:delete/update/insert,用于 copy 数据过程中,将原表中要执行的语句在新表中执行;

    4. 将原表数据以数据块(chunk)的形式 copy 到新表;

    5. rename 原表为 old 表,并把新表 rename 为原表名,然后删除旧表;

    6. 删除触发器。

MySQL online DDL的两个坑

  • 在外键关联中的表上的在线 DDL 操作不会等待在外键关联中的另一个表上执行的事务提交或回滚。事务在它正在更新的表上持有独占元数据锁,并在外键相关表上共享元数据锁(外键检查需要)。当需要独占元数据锁来更新表定义时,共享元数据锁允许在线 DDL 操作继续进行,但会在其最后阶段阻止操作。这种情况可能会导致死锁,因为其他事务等待在线 DDL 操作完成。

  • 运行DDL操作时,运行ALTER TABLE语句的线程会应用在同一表上并发运行的 DML 操作的在线日志,这些操作来自其他连接线程。应用 DML 操作时,可能会遇到重复键条目错误(ERROR 1062 (23000): Duplicate entry),即使重复条目只是临时的,并且会被在线日志中的后续条目还原。这类似于InnoDB在事务期间必须保持约束的外键约束检查的想法。

https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-limitations.html

以上是关于关于mysql 5.6 哪些操作可以进行online ddl 详解的主要内容,如果未能解决你的问题,请参考以下文章

(转)mysql 5.6 原生Online DDL解析

mysql 5.6 在线 DDL

关于MySQL Online DDL

MySQL InnoDB Online DDL学习

pt-osc全解pt-online-schema-change

mysql 5.6 5.7区别