摘 要 在线DDL修改生产环境的大表一直是运维、DBA一个很头痛的问题,本文分享一些相关经验,希望对还在头痛的同学能有所帮助,当然更希望路过的大神,如果有更靠谱的方案能够指点一二,不吝赐教。...2、gh-ost gh-ost 是 github 开源的一个 DDL 工具,即 gitHub,s Online Schema Transmogrifier/Transfigurator/Transformer...= b.id WHERE b.COMMAND = 'Sleep'; 附:5.6 版本(5.6 原生支持在线 DDL,感兴趣的可以研究下) SELECT a.trx_id, ...四、小结 对于 MySQL 在线 DDL 修改大表,gh-ost 和 pt-osc 都是很不错的选择,前提是不能有坑爹的触发器和外键!当然,实在是遇上了也没什么办法,只能硬扛!...以上,就是我在 MySQL 在线 DDL 修改表结构的一些经验分享,希望路过的大神如果有更好的方案能指点一二,不吝赐教。
在之前,我分享过一次 pt-online-schema-change 在线 DDL 的工具实践记录,在实际使用过程中,发现部门的很多老系统大量使用了触发器,从而无法使用这个工具,非常遗憾!...导致很多 DDL 变更都必须压到空闲时候做,比如凌晨,非常苦逼。...咨询了做 DBA 的老同事,他将 gh-ost 推荐给我,基于 golang 语言,是 github 开源的一个 DDL 工具,gh-ost 是 gitHub,s Online Schema Transmogrifier...动态可控 如果别的工具在修改过程中产生了比较高的负载,DBA 只好把它停掉再修改配置,比如把一次拷贝的数据量改小些,然后再从头开始修改过程。这样的反复操作代价非常大。...对于我们生产环境地每一张表,小到空表,大到几百 GB,都会通过修改存储引擎的方式来进行修改(engine=innodb),这样并不会真正修改表结构。
一 简介:今天来DDL的变革 二 DDL演化方式: 1 copy table : 1 创建临时表2 copy数据到临时表 3 rename进行交换 缺点 1 阻塞事务 2占用磁盘空间 2...inplace : 1 在线更改表,不会拷贝临时表 缺点 1 阻塞事务 3 online_ddl :1 在线更改表,不会拷贝临时表 优点 1 不会阻塞事务 因此MySQL最新版本中,InnoDB...支持了所谓的Online方式DDL。...时间可能很长 delete column -> inplace 方式->不会阻塞事务, 时间可能很长 change->copy 方式->会阻塞事务 , 时间可能很长 设置 修改...column默认值->inplace 方式 ->不会阻塞事务,时间很快,直接修改frm文件 设置 colunm not null/null->inplace 方式->不会阻塞事务,时间可能很长
use db_name; # 查看正在使用的数据库 select database(); # 查询指定数据库 show create database db_name; ☞ 示例 1.1.2 库修改相关操作...☞ 语法 # 修改名为 db_name 的数据库的字符集为 char_name alter database db_name charset char_name; # 不建议修改数据库名称,若必须修改名称建议创建新的数据库然后将表复制过去...☞ 语法 # 将 old_tb_name 表名修改为 new_tb_name alter table old_tb_name rename to new_tb_name; # 给 tb_table...alter table tb_name change old_col_name new_col_name type; # 修改 tb_name 表 col_name 列数据类型 alter table...alter table tb_name drop col_name; # 删除名为 tb_name 的表 drop table tb_name; ☞ 示例 1.3 数据类型 1.3.1 概述 MySQL
作者:黄稚禹 Online DDL in MySQL5.5 历史上看,MySQL 在 2007 年就完成了在线索引接口的设计。...MySQL5.6 出现之前(5.5 版本及之前版本),MySQL 数据库长期被吐槽的原因之一(特别是 Oracle DBA) MySQL5.5 版本及之前版本的 DDL 实现方式: 上图不难看出,5.5...虽然在 MySQL5.5 版本中增加了 IN-Place 方式,但依然会阻塞 INSERT、UPDATE、DELETE 操作 Online DDL in MySQL5.6 MySQL5.5 中对添加索引操作引入了新特性...但并不是所有的 DDL 操作都支持在线操作,这里附上 MySQL 官方文档对于 DDL 操作的总结: http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html...MYtable 和 myTable,则无法对这两张表进行修改 不支持 MySQL5.7 Json 类型列的修改 不支持 MySQL5.7 generated column 的修改 使用案例: .
(3)修改自增长起始值。...SHOW TABLE STATUS LIKE 'tbl_name'; 14.增加、删除和修改数据表的列 (1)增加列。...内存表的生命周期是服务端 MySQL 进程生命周期,MySQL 重启或者关闭后内存表里的数据会丢失,但是表结构仍然存在,而临时表的生命周期是 MySQL 客户端会话。...log_2018); 21.清空表内容 TRUNCATE [TABLE] tbl_name TRUNCATE 与 DELETE 均可以删除表记录,区别主要有如下几点: (1)truncate 属于 DDL...---- 参考文献 MySQL Data Definition Statements
值得注意的是,所有这些修改都是通过同一个DDL Trx进行的,如果事务提交则系统表的修改提交,如果DDL回滚,这些修改也会通过UNDO LOG进行回滚。...表的修改。...DDL Log 系统表的定义如下: mysql> show create table mysql.innodb_ddl_log \G*******************...crash-safe DDL https://dev.mysql.com/worklog/task/?...id=6394 MySQL 8.0 Data Dictionary: Background and Motivation https://dev.mysql.com/blog-archive/mysql
name varchar(50) comment '姓名',age int comment '年龄',gender varchar(1) comment '性别') comment '用户表';二、数据类型MySQL...ALTER TABLE 表名 MODIFY 字段名 新数据类型 (长度);3、修改字段名和字段类型ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型 (长度) [ COMMENT 注释...] [ 约束 ];案例将emp表的nickname字段修改为username,类型为varchar(30)ALTER TABLE emp CHANGE nickname username varchar...(30) COMMENT '昵称';4、删除字段ALTER TABLE 表名 DROP 字段名;案例将emp表的字段username删除ALTER TABLE emp DROP username;5、修改表名...ALTER TABLE 表名 RENAME TO 新表名;案例将emp表的表名修改为 employeeALTER TABLE emp RENAME TO employee;五、表操作-删除1、删除表 DROP
MySQL大表变更主要有原生的online DDL、pt-osc(pt-online-schema-change)、ghost三种工具。...online DDL在5.7、8.0版本会支持更好一点儿,早一点的版本支持比较弱。 pt-osc是percona工具集中的一个工具。应该是应用最广泛的之一。 ghost是用go语言实现的工具。
4,DDL:操作数据库 我们先来学习DDL来操作数据库。而操作数据库主要就是对数据库的增删查操作。...使用数据库 USE 数据库名称; 查看当前使用的数据库 SELECT DATABASE(); 运行语句效果如下: 5,DDL:操作表 操作表也就是对表进行增(Create)删(Retrieve...6.1 navicat概述 Navicat for MySQL 是管理和开发 MySQL 或 MariaDB 的理想解决方案。...: 修改表结构 通过下图操作修改表结构: 点击了设计表后即出现如下图所示界面,在图中红框中直接修改字段名,类型等信息: 编写SQL语句并执行 按照如下图所示进行操作即可书写SQL语句并执行...修改表数据 UPDATE 表名 SET 列名1=值1,列名2=值2,… [WHERE 条件] ; 注意: 修改语句中如果不加条件,则将所有数据都修改!
DDL操作 DDL,(Data Definition Language数据定义语言),主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上...alter table tname add 字段名称 类型(长度) after 指定列名; //添加字段到指定列后面 2.2 删除字段 alter table tname drop 字段名称; 2.3 修改字段...、类型、长度、约束描述等 alter table tname modify 字段名称 新类型 新约束; alter table tname change 旧字段名 新字段名 新类型 新约束; 2.4 修改表名
前言: MySQL中DDL语句,即数据定义语言,用于创建、删除、修改、库或表结构,对数据库或表的结构操作。常见的有create,alter,drop等。...本篇文章会揭露各类DDL语句执行的详细情况。 1.Online DDL简介 在MySQL的早期版本中,DDL操作因为锁表会和DML操作发生锁冲突,大大降低并发性。...从MySQL5.6开始,很多DDL操作过程都进行了改进,出现了Online DDL,用于支持DDL执行期间DML语句的并行操作,提高数据库的吞吐量。...上面只是 Online DDL 内部的实现方式,此外还有 LOCK 选项控制是否锁表,根据不同的DDL操作类型有不同的表现:默认MySQL尽可能不去锁表,但是像修改主键这样的昂贵操作不得不选择锁表。...LOCK=DEFAULT,让mysql自己去判断lock的模式,原则是mysql尽可能不去锁表 LOCK=EXCLUSIVE,即DDL期间该表不可用,堵塞任何读写请求。
本文详细解释 MySQL DDL 的原理,以及尽可能减少 DDL 对业务的影响的办法。 MySQL DDL 的方法 MySQL 的 DDL 有很多种方法。...5.5 或者 MySQL 5.6,推荐使用 gh-ost 如果使用的是 MySQL 5.7,索引等不涉及修改数据的操作,建议使用默认的 inplace 算法。...如果涉及到修改数据(例如增加列),不关心主从同步延时的情况下使用默认的 inplace 算法,关心主从同步延时的情况下使用 gh-ost 如果使用的是 MySQL 8.0,推荐使用 MySQL 默认的算法设置...修改统计信息。 rename 临时 ibd 文件,frm文件。 变更完成,释放 EXCLUSIVE-MDL 锁。...instant 算法 MySQL 8.0.12 才提出的新算法,目前只支持添加列等少量操作,利用 8.0 新的表结构设计,可以直接修改表的 metadata 数据,省掉了 rebuild 的过程,极大的缩短了
---- (作者玉树临风照) 随着 MySQL 版本的不断更新,对 DDL 操作的支持也在不断的完善和更新:比如从 MySQL 5.6 引入 Online DDL ,在 MySQL 5.7 对 Online...DDL 进一步完善,到现在的 8.0 版本,则对 DDL 的实现重新进行了设计,比如 DDL 操作支持原子特性,在 MySQL 8.0.27 引入并行 DDL 。...本篇就来探究一下 MySQL 8.0.27 的并行 DDL 对于 DDL 操作速度的提升。...MySQL 8.0.27 引入了 innodb_ddl_threads 变量来控制用于创建二级索引时的并行线程数量,此参数一般和一并引入的 innodb_ddl_buffer_size 一起使用,innodb_ddl_buffer_size...mysql 12G Jan 20 17:38 sbtest1.ibd 分别测试不同的线程数量和缓冲区大小的 DDL 操作时间,例如: -- 设置并发DDL线程为1 mysql> set innodb_ddl_threads
// MySQL之Online DDL过程 // 昨天内容中说了不同类型的DDL操作所采用的的执行方法,以及Online DDL对系统空间的依赖,今天我们说说Online DDL的操作过程,让大家有一个更加直观的认识...01 Online DDL的过程 从官方文档上看,online ddl操作的执行过程一般被分为3个阶段,如下: 阶段1:初始化阶段(准备阶段) 在初始化阶段,服务器将考虑存储引擎功能,语句中指定的操作以及用户指定的...02 Online DDL失败的情况 昨天的文章中说道,Online DDL失败的情况没有给出样例,但是官方文档上给出了可能失败的几种情况: 1、手工指定的algorithm和存储引擎中的算法出现冲突...的值 4、当前系统有不活跃的事务占用了元数据锁,导致锁等待超时 5、DDL添加唯一二级索引的时候,并发DML中插入了重复键值的记录,此时会造成alter table的操作回滚 03 Online DDL...√ 2、提前准备好故障报告,直接在线上进行变更,该方法纯属娱乐:)× 相关文章: 大表Online-DDL操作问题初探 MySQL之Online DDL再 有帮助的话还希望点下再看哈
背景 经常会有用户在咨询大表 DDL 的进度,预估时间等信息,其实依靠经验来做判断的话,比较容易出现误差,而且也和评估人的实际评估手段有较大的关系。...事实上 MySQL 本身就有 DDL 的监控手段吗,只是默认情况没有进行开启。 实践一下 测试环境使用了腾讯云数据库 MySQL 5.7,官方的 MySQL 8.0,5.7 版本基本同理。...+----------------+ 1 row in set (0.00 sec) WORK_COMPLETED 表示已经完成的“工作量”,WORK_ESTIMATED表示预计的总工作量,所以评估 DDL...总结一下 其实 MySQL 自身已经集成了非常多的监控信息,有需求的时候可以多研究研究setup_instruments。...实际上 DDL 也可以使用 Online DDL 工具来操作,本身 gh-ost 工具也会展示操作的进度。
关于进入数据库 mysql -uroot -p //使用这种方式,接下来需要输入密码。...---- DDL DDL,data defination language,指的是数据定义语言,其主要作用是创建数据库,对库表的结构进行删除和修改等操作。 全部命令 1....字段n); -- 查看创建表的SQL语句 show create table user; -- 查看表的结构 desc user; -- 删除表 drop table user; -- 修改表名...modify:修改 change:改变名字 add:添加字段 默认是末尾 指定位置添加 // 修改字段信息 alter table user modify name varchar(50) not null...mysql> alter table user modify name varchar(50); # 修改字段名字 mysql> alter table user change email user_email
大家好,我是不才陈某~ 今天与大家一起分享一下 mysql DDL执行方式。 一般来说MySQL分为DDL(定义)和DML(操作)。...在MySQL 5.6版本以前,最昂贵的数据库操作之一就是执行DDL语句,特别是ALTER语句,因为在修改表时,MySQL会阻塞整个表的读写操作。...比如 optimize table、添加索引、添加/删除列、修改列 NULL/NOT NULL 属性等; no-rebuild:不需要重建表,只需要修改表的元数据,比如删除索引、修改列名、修改列默认值、...修改列自增值等。...目前可用的DDL操作工具包括pt-osc,github的gh-ost,以及MySQL提供的在线修改表结构命令Online DDL。
出现该情况的原因就是MySQL不支持原子的DDL。 MySQL8.0 之前的数据字典结构图: ?...Post-DDL:重放并删除 mysql.innodb_ddl_log 表中的 DDL 日志。...无论事务被提交还是回滚,在 Post-DDL 阶段都会重放并删除 mysql.innodb_ddl_log 表中的 DDL 日志。...查看 DDL 日志 为了支持 原子 DDL,InnoDB 在执行DDL 语句时将日志写入隐藏的数据字典表mysql.innodb_ddl_log中,该表存储在 mysql.ibd 数据字典表空间。...另外就是我们可以通过设置 innodb_print_ddl_logs=1 和 log_error_verbosity=3 在MySQL 的 系统日志里面查看DDL log,比如我运行的MySQL 8.0
DDL发展 DDL online DDL 工具化时代 1、DDL(锁表阶段) ALGORITHM=COPY ALGORITHM=inplace ALTER TABLE xxxx ADD xxx, ALGORITHM...关键字:LOCK LOCK=NONE DDL期间允许dml并发 LOCK=SHARED 写操作加锁 LOCK=DEFAULT mysql自己去判断是否加锁,原则是是少加锁 LOCK=EXCLUSIVE...tmpdir的空间不足 innodb_online_alter_log_max_size参数,如果增量大小超过这个参数会报错,DB_ONLINE_LOG_TOO_BIG ,默认128M 如何查看进度: 在MySQL...,针对这次ddl修改–set-vars “wait_timeout=10000,innodb_lock_wait_timeout=1“ --no-version-check:云上执行时版本不对时忽略版本...可测试,--test-on-replica参数允许在从库进行修改表结构,修改完后暂停主从复制,切换表再切换回来,对比同一时刻的两个表数据是否一致(此备库不提供服务) go-ost使用以及简单参数介绍
领取专属 10元无门槛券
手把手带您无忧上云