关于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。
本来打算翻译成中文,后来发现这些英文实在是太简单了,就直接贴出来吧。
请看下图:
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 详解的主要内容,如果未能解决你的问题,请参考以下文章