mysql online ddl

目前InnoDB引擎是通过以下步骤来进行DDL的:

1 按照原始表(original_table)的表结构和DDL语句,新建一个不可见的临时表(tmp_table)

2 在原表上加write lock,阻塞所有更新操作(insert、delete、update等)

3 执行insert into tmp_table select * from original_table

4 rename original_table和tmp_table,最后drop original_table

5 释放 write lock。

我们可以看见在InnoDB执行DDL的时候,原表是只能读不能写的。为此 perconal 推出一个工具 pt-online-schema-change ,其特点是修改过程中不会造成读写阻塞。

工作原理:

如果表有外键,除非使用 –alter-foreign-keys-method 指定特定的值,否则工具不予执行。

1 创建一个和你要执行 alter 操作的表一样的空表结构。

2 执行表结构修改,然后从原表中的数据到copy到 表结构修改后的表,

3 在原表上创建触发器将 copy 数据的过程中,在原表的更新操作 更新到新表.

注意:如果表中已经定义了触发器这个工具就不能工作了。

4 copy 完成以后,用rename table 新表代替原表,默认删除原表。

pt-online-schema-change -uroot -h172.17.10.13 -p‘test!‘ --alter=‘add key user_email(email)‘ --execute D=ggxk_account,t=ggxk_user

pt-online-schema-change -uroot -h172.17.10.13 -p‘test!‘ --alter=‘drop key user_email ‘ --execute D=ggxk_account,t=ggxk_user

pt-online-schema-change -uroot -h172.17.10.13 -p‘test!‘ --alter=‘add column lhb int ‘ --execute D=ggxk_account,t=ggxk_user

pt-online-schema-change -uroot -h172.17.10.13 -p‘test!‘ --alter=‘drop column lhb ‘ --execute D=ggxk_account,t=ggxk_user

时间: 2024-08-04 01:45:01

mysql online ddl的相关文章

Mysql常用DDL命令

Mysql常用命令:--在Mysql中,语句的结尾要么使用;要么使用\g或者\G作为结束符.进入Mysql (---其中Your MySQL connection id is 5表示到当前为止连接到Mysql数据库的次数,Server version: 5.5.37-log Source distribution表示Mysql数据库的版本)[[email protected] data]$ mysql -uroot -pEnter password:Welcome to the MySQL mo

[资料收集]MySQL在线DDL工具pt-online-schema-change

MySQL在线DDL工具pt-online-schema-change pt-online-schema-change使用说明(未完待续) 官网

MySQL在线DDL gh-ost 使用说明

原文:gh-ost: GitHub's online schema migration tool for MySQL http://github.com/github/gh-ost MySQL在线更改schema的工具很多,如Percona的pt-online-schema-change. Facebook的 OSC 和 LHM 等,但这些都是基于触发器(Trigger)的,今天咱们介绍的 gh-ost 号称是不需要触发器(Triggerless)支持的在线更改表结构的工具. 本文先介绍一下当前

MySQL Online DDL的改进与应用

    本文简析Online DDL的实现原理与使用过程注意事项.     任何DDL操作,执行者都需要预先测试或者清晰了解这个操作会给数据库带来的影响是否是在业务期间数据库的可承受范围内,尤其是对大表的DDL操作中,需要密切留意服务器的IO,内存及CPU使用情况(每个DBA总有那么一段被大表的DDL语句坑到的血泪史). 如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各位支持! 1 早期DDL实现原理(5.6.7之前 ) I

MySQL online ddl原理

背景 dba的日常工作肯定有一项是ddl变更,ddl变更会锁表,这个可以说是dba心中永远的痛,特别是执行ddl变更,导致库上大量线程处于“Waiting for meta data lock”状态的时候.因此mysql 5.6的online ddl特性是dba们最期待的新特性,这个特性解决了执行ddl锁表的问题,保证了在进行表变更时,不会堵塞线上业务读写,保障在变更时,库依然能正常对外提供访问.网上关于online ddl的文章很多,但涉及原理的很少,都是介绍语法之类的,本文将详细介绍onli

mysql在线DDL(与oracle的区别)

对mysql有所研究的都知道,当mysql某个业务表上有未提交的活动事务的时候,你去执行在线DDL,这相当危险,直接会被卡住,show processlist里面会显示这个DDL遇到了MDL锁等待,即"waiting for table metadata lock",此时如果你去喝咖啡去了...杯具就发生了,因为此时这个业务表连select都会被阻塞. mysql在5.6官方文档里面说自己可以支持大部分在线DDL了,包括常见的加字段.加索引.改字段等等.但是要注意:这里所谓的支持在线D

MySQL之DDL、DML、读锁,写锁、显示锁、事务、隔离级别详解

mysql> help insert; DDL: DATABASE TABLE VIEW DML: SELECT INSERT/REPLACE UPDATE DELETE INSERT INTO: 第一种: INSERT INTO tb_name [(col1, col2,...)] {VALUES|VALUE} (val1, val2,...)[,(val21,val22,...),...] 第二种: INSERT INTO tb_name SET col1=val1, col2=val2,

mysql之DDL(CREATE ALTER DROP)

DDL:数据定义语言    CREATE    ALTER    DROP 主要操作集中在数据库和表. 数据库:    创建数据库:        CREATE DATEBASE|SCHEMA [IF NOT EXISTS] DBNANE [CREATE_SPECIFICATION]; CREATE_SEPECIFICATION                   [DEFAULT]  CHARACTER SET [=] CHARSET_NAME 指定默认字符集                C

mysql基础(DDL语句)

DDL语句(DDL:数据定义语言) 1.创建数据库:create database test1; 2.显示数据库:show databases; 3.选择数据库:use mysql; 4.查询数据库所有的表:show tables; 5.删除数据库:drop database test1; 6.创建表:create table emp(ename varchar(10),hiredate date,sal decimal(10,2),deptno int(2)); 7.查看表结构: mysql>

mysql在线ddl操作

mysql5.6开始支持在线ddl,在线ddl能够提供下面的好处: 1提高生产环境的可用性2在ddl执行期间,获得性能和并发性的平衡,可以指定LOCK从句与algorithm从句,lock=exclusize会阻塞整个表的访问,lock=shared会允许查询但不允许dml,lock=none允许查询和dml操作,lock=default或是没有指定,mysql使用最低级别的锁,algorithm指定是拷贝表还是不拷贝表直接内部操作,3只对需要的地方做改变,不是创建一个新的临时表. 之前ddl操