MySQL5.7在线DDL相关知识简单介绍

  

①:复制表方式:这是InnoDB最早支持的方式,顾名思义,通过临时表拷贝的方式实现的。新建一个带有新结构的临时表,将原表数据全部拷贝到临,,,,,,,,,,时表,然后重命名,完成创建操作。这个方式过程中,原表是可读的,不可写。但是会消耗一倍的存储空间。

②:原地方式:这是原生MySQL 5.5,以及innodb_plugin中提供的方式。所谓原地,也就是在原表上直接进行,不会拷贝临时表。相对于复制,,,,,,,,,,,,表方式,这比较高效率。原表同样可读的,但是不可写。

③:在线方式:这是MySQL 5.6以上版本中提供的方式,也是今天我们重点说明的方式,无论是复制表方式,还是原地方式,原表只能允许读取,,,,,,不可写。对应用有较大的限制,因此MySQL最新版本中,InnoDB支持了所谓的在线方式DDL。与以上两种方式相比,在线方式支持DDL时不仅可,,,,,以读,还可以写,对于dba来说,这是一个非常棒的改进。

算法=复制,需要拷贝原始表,所以不允许并发DML写操作,可读。这种复制方式的效率还是不如原地,因为前者需要记录撤销和重做日志,而且因为临时占用缓冲池引起短时间内性能受影响。

①:就地为是的是优选项,说明该操作支持原地

②:复制表为没有是优选项,因为为是的需要重建表。大部分情况与就地是相反的

③:允许并发DML吗?为是的是优选项,说明ddl期间表依然可读写,可以指定锁=NONE(如果操作允许的话mysql自动就是NONE)

④:允许并发查询?默认所有ddl操作期间都允许查询请求,放在这只是便于参考

,,,,,,,,,,,,,,,,,,,,,,,

1)在alter table时,如果涉及到表拷贝操作,要确保datadir目录有足够的磁盘空间,能够放的下整张表,因为拷贝表的的操作是直接在数据目录下进行的只,,,,,,,,,,,,,,,, MySQL5.7在线DDL相关知识简单介绍”>,,,,,,,,,,,,,,,,</p> <p> 2)添加索引无需表复制,但要确保tmpdir目录足够存下索引一列的数据(如果是组合索引,当前临时排序文件一合并到原表上就会删除),,,,,,3)在主从环境下,主库执行改变命令在完成之前是不会进入binlog记录事件,如果允许dml操作则不影响记录时间,所以期间不会导致延迟。然而,由于从库是单线程按个SQL顺序应用继电器日志,轮到改变语句时直到执行完才能下一条,所以从库会在主人ddl完成后开始产生延迟。(pt-osc可以控制延迟时间,所以这种场景下它更合适),,,</p> <p> 4)在每个> 15.13.1>表15.10,“DDL操作的在线状态”</p> <p> </p> <p> </p> <pre类= (mysql@localhost  ~),美元mysql  -u  root  - p   密码:Enter    Welcome 用,MariaDB 监控只,Commands 最终获得with ,趁机\ g。   Your  MySQL  connection  id  is  9   版本:Server  5.7.18-log  MySQL  Community  Server  (GPL)   Copyright  (c), 2000年,2014年,甲骨文,MariaDB  Corporation  Ab 以及其他信息。   Type  & # 39;帮助;& # 39;,趁机& # 39;\ h # 39;, for 帮助只Type  & # 39; \ c # 39;,用clear 从而current  input 语句。

MySQL [(一)]祝辞,create  database 测试;   Query 好吧,,1,row  affected (0.07,秒)   MySQL [(一)]祝辞use 测试   Database 改变了   MySQL [测试]祝辞,create  table  test_emp (int, id  (10), unsigned  NOT  NULL  AUTO_INCREMENT,, c1  int (10), NOT  NULL  DEFAULT  & # 39; 0 & # 39;,   ,,,,,,c2  int (10), unsigned  DEFAULT 空,,c5  int (10), unsigned  NOT  NULL  DEFAULT  & # 39; 0 & # 39;,, c3  timestamp  NOT  NULL  DEFAULT  CURRENT_TIMESTAMP 提醒UPDATE  CURRENT_TIMESTAMP,   ,,,,,c4  varchar (200), NOT  NULL  DEFAULT  & # 39; & # 39;, PRIMARY 关键(id), KEY  idx_c1 (c1), KEY  idx_c2 (c2),)引擎=InnoDB ;   Query 好吧,,0,rows  affected (0.11,秒),,,- - - - -创建测试表:test_emp   MySQL [测试]祝辞delimiter //MySQL [测试]祝辞,create  procedure  insert_test_emp (row_num 拷贝;int )   ,,,→开始   ,,,,,,declare 小姐:int , default  0;   ,,,,,,while 小姐:& lt; row_num 做   ,,,,,insert  into  test_emp (c5, c1, c2, c3, c4),值(,地板(rand () * row_num),地板(rand () * row_num),地板(rand () * row_num)、现在(),重复(& # 39;苏# 39;,,地板(rand () * 20)));   ,,,,,set 小姐:=,+ 1;   ,,,,,,最终获得的同时;   ,,,→结束   ,,,→//Query 好吧,,0,rows  affected (0.01,秒)   MySQL [测试]祝辞,   MySQL [测试]祝辞,call  insert_test_emp(100000);,,, - - - - -向测试表test_emp插入数据   Query 好吧,,1,row  affected  (8, min  24.34, sec)   MySQL [测试]祝辞,desc  test_emp;   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

MySQL5.7在线DDL相关知识简单介绍