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操作的代价是很昂贵的,许多的alter table语句是创建一个新的,按需要的选项创建的空表,然后拷贝已经存在的行到新表中,在更新插入行的索引,在所有的行被拷贝之后,老的表被删除,拷贝的表被重命名成原来表的名。

在5.5和5.1优化了的create index和drop index避免了表拷贝的行为,这个特色叫快速索引创建,56.增强了,在改变的时候不dml还能处理,叫在线ddl。

一些alter语句允许并发的dml,但是仍然需要拷贝表,这些操作的表拷贝要比之前版本的快

  • Adding, dropping, or reordering columns.
  • Adding or dropping a primary
    key
    .
  • Changing the ROW_FORMAT or KEY_BLOCK_SIZE properties
    for a table.
  • Changing the nullable status for a column.
  • OPTIMIZE
    TABLE
  • Rebuilding a table with the FORCE option
  • Rebuilding a table using a “null” ALTER
    TABLE ... ENGINE=INNODB
     statement

当ddl在改变表的时候,表是否被锁住取决于操作的内部工作方式及alter table的lock从句,在线ddl语句总是等待访问表的事务提交或回滚,因为ddl语句在准备的过程中会要求一个短暂的排他请求。因为要记录并发dml操作产生的改变,并在最后应用这些改变,在线的ddl会花费更长的时间,

要看ddl是否使用了临时表还是内部操作的,可以查看语句执行结果中有多少行收到了影响,如果是0行,那么就没有复制表,如果是非0,那么就是复制了表。

下面的测试可以看到,重命名列是不会拷贝记录的,修改列的类型就会拷贝表,并且algorithm指定replace会提示不支持这种方式,添加列也是没有拷贝表。

>alter table t8 change name r_name char(80);

Query OK, 0 rows affected (0.04 sec)

Records: 0  Duplicates: 0  Warnings: 0

>alter table t8 change r_name rr_name char(90);

Query OK, 148 rows affected (0.10 sec)

Records: 148  Duplicates: 0  Warnings: 0

test>alter table t8 change rr_name rrr_name char(200), algorithm=inplace;

ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.

>alter table t8 add column sex int;

Query OK, 0 rows affected (0.09 sec)

Records: 0  Duplicates: 0  Warnings: 0

时间: 2024-12-11 12:25:11

mysql在线ddl操作的相关文章

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在线DDL工具pt-online-schema-change

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

mysql在线DDL(与oracle的区别)

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

mysql之DDL操作--数据表

我们创建好了数据库以后,就可以创建相应的数据表,那么创建表也是属于DDL数据定义层面,接下来我们来学习一下. 1.创建数据表 创建指令:create table tb_name [表选项] 我们发现指令与数据库的创建指令是相同的,没什么大的区别. PS:当然我们创建表之前,首先先选择相应的数据库. 接下来我们创建一张学生信息表 create table student_studentinfo( id int, name varchar(5), class_id int); 关于列类型以及列约束即

mysql之DDL操作--数据库

SQL是操作关系数据库非常重要的一门编程语言 structure query language既然是语言自然可以编程,SQL的分类可依据操作对象的不同分为DDL,DML,DCL. 我们操作数据库如创建,添加,更新,删除操作,如操作表等都是属于定义范围. 所以DDL则是SQL定义语言. 我们要用数据库来存储数据,自然是先有库,再有表,然后再数据,所以我们要先定义库,定义表. 1.创建数据库 create database db_name [数据库选项] 一般情况下选项可以不填写 如我们创建一个学生

MySQL在线修改表结构pt-osc

MySQL在线修改表结构pt-osc 重所周知 MySQL的DDL操作操作是相比比较昂贵的.因为MySQL在修改表期间会阻塞任何读写操作. 基本上业务处于瘫痪.如果数据量较大可能需要好几个小时才能完成,无法容忍这个操作.Percona开发了一系列的工具 Percona Toolkit包,其中有一个工具pt-online-schema-change可以在线执行DDL操作,不会阻塞读写操作从而影响业务程序.当然也有其他的工具 例如 MySQL5.6的online ddl 还有gh-ost 本文主要讲

MySQL 在线更改 Schema 工具

MySQL在线更改schema的工具很多,如Percona的pt-online-schema-change. Facebook的 OSC 和 LHM 等,但这些都是基于触发器(Trigger)的,今天咱们介绍的 gh-ost 号称是不需要触发器(Triggerless)支持的在线更改表结构的工具. 本文先介绍一下当前业界已经存在的这些工具的使用场景和原理,然后再详细介绍 gh-ost 的工作原理和特性. 今天我们开源了GitHub内部使用的一款 不需要触发器支持的 MySQL 在线更改表结构的工

使用 pt-online-schema-change 实现在线DDL

问题背景 平时进行修改表的结构,更改字段,新增字段,更改字段名称一般都是通过ALTER TABLE  语法进行修改的.对于小表或者并发访问不是很大的情况是OK.但是如果是在线大表,那就很麻烦.由于表数据量大,复制表需要比较长的时间,在这个时间段里面,表是被加了锁的(写锁),加写锁时其他用户只能select表不能update.insert表.表数据量越大,耗时越长. mysql在线ddl(加字段.加索引等修改表结构之类的操作)过程如下: 对表加锁(表此时只读) 复制原表物理结构 修改表的物理结构

MySQL/MariaDB基础性知识及DDL操作详解

前言 MySQL/MariaDB是一个开放源码的小型关联式数据库管理系统,由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL/MariaDB作为网站数据库. 基础架构 MySQL核心组件 连接池:认证.线程重用.连接数限制.内存检查.缓存 SQL接口:DDL, DML, 关系型数据库的基本抽象 parser: 查询转换.对象权限检查 优化器:访问路径,性能相关的统计数据 caches和buffers:与存储引擎自身相关的I/O性