onlineDDL测试
onlineDDL语法:
alter table
ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
ADD [COLUMN] col_name column_definition [FIRST|AFTER col_name]
CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]
MODIFY [COLUMN] col_name column_definition
[FIRST | AFTER col_name],
ALGORITHM [=] {DEFAULT|INPLACE|COPY} LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE}; 简单的说就是原来的语句上,加个ALGORITHM=xxx LOCK=XXXX
ALGORITHM指定了onlineDDL时候是使用COPY,还是INPLACE,
()COPY表示执行DDL的时候会创建临时表。
()INPLACE表示不需要创建临时表。(inplace英文单词是原地的意思)
()DEFAULT表示根据参数old_alter_table来判断是通过INPLACE还是COPY的算法,old_alter_table参数默认为OFF,表示采用INPLACE的方式 LOCK部分为索引创建或删除时对表添加锁的情况,默认是default,可选择的如下:
()NONE,目标表不添加任何锁,可以进行读写操作,不阻塞任何操作。如果手工指定NONE,但是onlineDDL不支持NONE模式,返回一个错误信息,告诉你用SHARE模式。 ()SHARE,对操作表加一个S锁。不阻塞读操作。写操作会阻塞,将会发生等待MDL锁,如果手工指定SHARE,但是onlineDDL不支持SHARE模式,将返回一个错误信息。 ()EXCLUSIVE,执行索引创建或删除时,对目标表加上一个X锁。读写事务均不能进行。会阻塞所有的线程。这和COPY方式类似,但是不需要像COPY方式那样创建一张临时表。 ()DEFAULT,该模式首先会判断当前操作是否可以使用NONE模式,若不能,则判断是否可以使用SHARE模式,最后判断是否可以使用EXCLUSIVE模式。也就是说DEFAULT会通过判断事务的最大并发性来判断执行DDL的模式。 .创建一个测试表 (mysql5.-)root@localhost [test]> create table ddl_test (id int() not null,name varchar() not null default '',age int() null default ,primary key(id));
Query OK, rows affected (0.02 sec) (mysql5.-)root@localhost [test]> ###这边先看看onlineDDL语法,就是DDL语句后面价格ALGORITHM=INPLACE, lock=none,是否拷贝表,锁模式,什么都没指定默认为defalut
(mysql5.-)root@localhost [test]> ALTER TABLE `ddl_test` MODIFY COLUMN `id` int() NOT NULL AUTO_INCREMENT FIRST ,ALGORITHM=INPLACE, lock=none;
ERROR (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
(mysql5.-)root@localhost [test]> ALTER TABLE `ddl_test` MODIFY COLUMN `id` int() NOT NULL AUTO_INCREMENT FIRST ,ALGORITHM=copy, lock=none;
ERROR (0A000): LOCK=NONE is not supported. Reason: COPY algorithm requires a lock. Try LOCK=SHARED.
(mysql5.-)root@localhost [test]> ALTER TABLE `ddl_test` MODIFY COLUMN `id` int() NOT NULL AUTO_INCREMENT FIRST ,ALGORITHM=copy, lock=shared;
Query OK, rows affected (0.00 sec)
Records: Duplicates: Warnings: 创建一个大表 (mysql5.-)root@localhost [test]> insert into ddl_test (name,age) select name,age from ddl_test;
Query OK, rows affected ( min 20.73 sec)
Records: Duplicates: Warnings: ###onlineDDL,前不能针对该表的,有长事务,空闲未提交事务,不然会等待MDL锁 (简单的说,DML 要获取表MDL共享锁,DDL要获取MDL排他锁)
session (mysql5.-)root@localhost [test]> select count(name) from ddl_test; session
(mysql5.-)root@localhost [test]> alter table ddl_test add column address varchar() not null default '',ALGORITHM=INPLACE, lock=none; session
(mysql5.-)root@localhost [crm]> show processlist;
+----+---------+---------------------+------+---------+------+---------------------------------+------------------------------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+---------+---------------------+------+---------+------+---------------------------------+------------------------------------------------------------------------------------------------------+
| | root | localhost | test | Query | | optimizing | select count(name) from ddl_test |
| | root | localhost | test | Query | | Waiting for table metadata lock | alter table ddl_test add column address varchar() not null default '',ALGORITHM=INPLACE, lock=non |
| | root | localhost | crm | Query | | starting | show processlist |
| | odstest | 172.16.123.63: | NULL | Sleep | | | NULL |
| | odstest | 172.16.123.63: | test | Sleep | | | NULL |
| | odstest | 172.16.123.63: | test | Sleep | | | NULL |
| | odstest | 172.16.123.63: | test | Sleep | | | NULL |
+----+---------+---------------------+------+---------+------+---------------------------------+------------------------------------------------------------------------------------------------------+
rows in set (0.00 sec)
在等待MDL锁 .测试onlineDDL #增加列 session (mysql5.-)root@localhost [test]> alter table ddl_test add column address varchar() not null default '',ALGORITHM=INPLACE, lock=none; session (mysql5.-)root@localhost [test]> update ddl_test set name='adfadf' where id> and id <; session
看到木有,并不阻塞update (mysql5.-)root@localhost [crm]> show processlist;
+----+---------+---------------------+------+---------+------+----------------+------------------------------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+---------+---------------------+------+---------+------+----------------+------------------------------------------------------------------------------------------------------+
| | root | localhost | test | Query | | updating | update ddl_test set name='adfadf' where id> and id < |
| | root | localhost | test | Query | | altering table | alter table ddl_test add column address varchar() not null default '',ALGORITHM=INPLACE, lock=non |
| | root | localhost | crm | Query | | starting | show processlist |
| | odstest | 172.16.123.63: | NULL | Sleep | | | NULL |
| | odstest | 172.16.123.63: | test | Sleep | | | NULL |
| | odstest | 172.16.123.63: | test | Sleep | | | NULL |
| | odstest | 172.16.123.63: | test | Sleep | | | NULL |
+----+---------+---------------------+------+---------+------+----------------+------------------------------------------------------------------------------------------------------+
rows in set (0.00 sec)
删除一行数据试试,也不阻塞
(mysql5.-)root@localhost [test]> delete from ddl_test where id=;
Query OK, row affected (0.02 sec) (mysql5.-)root@localhost [test]> ####删除列 session 1
(mysql5.-)root@localhost [test]> alter table ddl_test drop column address,algorithm=inplace,lock=none;
session 2 #### session1--DDL ,执行之后执行。
(mysql5.7-101)root@localhost [test]> select count(name) from ddl_test;
+-------------+
| count(name) |
+-------------+
| 41943040 |
+-------------+
1 row in set (6.99 sec) session (mysql5.-)root@localhost [crm]> show processlist;
+----+---------+---------------------+------+---------+------+----------------+----------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+---------+---------------------+------+---------+------+----------------+----------------------------------------------------------------------+
| | root | localhost | test | Query | | optimizing | select count(name) from ddl_test |
| | root | localhost | test | Query | | altering table | alter table ddl_test drop column address,algorithm=inplace,lock=none |
| | root | localhost | crm | Query | | starting | show processlist |
| | odstest | 172.16.123.63: | NULL | Sleep | | | NULL |
| | odstest | 172.16.123.63: | test | Sleep | | | NULL |
| | odstest | 172.16.123.63: | test | Sleep | | | NULL |
| | odstest | 172.16.123.63: | test | Sleep | | | NULL |
+----+---------+---------------------+------+---------+------+----------------+----------------------------------------------------------------------+
rows in set (0.00 sec) 忘记了是DML,删除一行试一下,看会阻塞么,哈哈,并不阻塞(因为表数据很多,执行这个语句,会话二还在执行)
(mysql5.-)root@localhost [test]> delete from ddl_test where id=;
Query OK, rows affected (0.02 sec) (mysql5.-)root@localhost [test]>
### #####修改列
先试一下看看能不能不拷贝表,
(mysql5.-)root@localhost [test]> alter table ddl_test modify column address varchar() not null default '',ALGORITHM=INPLACE, lock=none;
ERROR (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
呵呵了,要拷贝表
(mysql5.-)root@localhost [test]> alter table ddl_test modify column address varchar() not null default '',ALGORITHM=copy, lock=none;
那么看看是不是不锁表,也呵呵了,只支持共享锁,那么意味这阻塞DML,不阻塞select
ERROR (0A000): LOCK=NONE is not supported. Reason: COPY algorithm requires a lock. Try LOCK=SHARED.
(mysql5.-)root@localhost [test]> 小结:只要LOCK模式不是NONE的DDL操作,锁最小范围都是共享锁,意味着还是会阻塞DML,其他情况我就不一一测试了,参考官方手册
问题
#### (mysql5.-)root@localhost [test]> alter table ddl_test add column address varchar() not null default '',ALGORITHM=INPLACE, lock=none;
ERROR (HY000): Creating index 'FTS_DOC_ID_INDEX' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.
(mysql5.-)root@localhost [test]> show global variables like 'innodb_online_alter_log_max_size';
+----------------------------------+-----------+
| Variable_name | Value |
+----------------------------------+-----------+
| innodb_online_alter_log_max_size | |
+----------------------------------+-----------+
row in set (0.02 sec)
支持动态修改
(mysql5.-)root@localhost [test]>
(mysql5.-)root@localhost [(none)]> set global innodb_online_alter_log_max_size=;
Query OK, rows affected (0.00 sec) (mysql5.-)root@localhost [(none)]> innodb存储引擎实现Online DDL的原理是在执行创建或者删除操作同时,将DML操作日志写入到一个缓存中,待完成后再将重做应用到表上,以此达到数据的一致性。
这个缓存的大小由参数innodb_online_alter_log_max_size控制,默认大小为128MB,支持动态修改
如果更新的表比较大,并且创建过程中有大量的写操作,如果遇到innodb_online_alter_log_max_size的空间不能存放日志时,会抛出相应的错误,
如果遇到改错误,我们可以调大该参数,以此获得更大的日志缓存空间。还可以设置lock的模式为SHARE,这样在执行过程中会阻塞写操作发生,
因此不需要进行DML日志的记录。
参考资料:
http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html
onlineDDL测试的更多相关文章
- SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]
目录 SignalR系列目录 前言 也是好久没写博客了,近期确实很忙,嗯..几个项目..头要炸..今天忙里偷闲.继续我们的小系列.. 先谢谢大家的支持.. 我们来聊聊SignalR的性能监测与服务器的 ...
- Apache Ignite之集群应用测试
集群发现机制 在Ignite中的集群号称是无中心的,而且支持命令行启动和嵌入应用启动,所以按理说很简单.而且集群有自动发现机制感觉对于懒人开发来说太好了,抱着试一试的心态测试一下吧. 在Apache ...
- 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率
之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...
- TechEmpower 13轮测试中的ASP.NET Core性能测试
应用性能直接影响到托管服务的成本,因此公司在开发应用时需要格外注意应用所使用的Web框架,初创公司尤其如此.此外,糟糕的应用性能也会影响到用户体验,甚至会因此受到相关搜索引擎的降级处罚.在选择框架时, ...
- .NET Core系列 :4 测试
2016.6.27 微软已经正式发布了.NET Core 1.0 RTM,但是工具链还是预览版,同样的大量的开源测试库也都是至少发布了Alpha测试版支持.NET Core, 这篇文章 The Sta ...
- 渗透测试工具BurpSuite做网站的安全测试(基础版)
渗透测试工具BurpSuite做网站的安全测试(基础版) 版权声明:本文为博主原创文章,未经博主允许不得转载. 学习网址: https://t0data.gitbooks.io/burpsuite/c ...
- 在ubuntu16.10 PHP测试连接MySQL中出现Call to undefined function: mysql_connect()
1.问题: 测试php7.0 链接mysql数据库的时候发生错误: Fatal error: Uncaught Error: Call to undefined function mysqli_con ...
- 【初学python】使用python调用monkey测试
目前公司主要开发安卓平台的APP,平时测试经常需要使用monkey测试,所以尝试了下用python调用monkey,代码如下: import os apk = {'j': 'com.***.test1 ...
- CoreCRM 开发实录——Travis-CI 实现 .NET Core 程度在 macOS 上的构建和测试 [无水干货]
上一篇文章我提到:为了使用"国货",我把 Linux 上的构建和测试委托给了 DaoCloud,而 Travis-CI 不能放着不用啊.还好,这货支持 macOS 系统.所以就把 ...
随机推荐
- show engine innodb status\G
mysql> show engine innodb status\G *************************** 1. row *************************** ...
- putty工具常见设置
Putty 工具主要是用于在 windows 环境下连接 linux 服务器的一个命令行工具,可以在此客户端中进行编译.svn代码修改 更新 提交等动作.LD主要是用它来干这个的. 工作环境的改变: ...
- linux下bus,device,driver三者关系
linux下bus,device,driver三者关系 1.bus: 总线作为主机和外设的连接通道,有些总线是比较规范的,形成了很多协议.如 PCI,USB,1394,IIC等.任何设备都可以选择合适 ...
- 从零开始学ios开发(八):Autorotation and Autosizing
不好意思,这一篇间隔的时间有点长,最近实在是事情太多,耽搁了,好了,长话短说,下面继续学习ios. 这次学习的内容是Autorotation和Autosizing,Autorotation就是屏幕内容 ...
- VBS基础篇 - wscript 对象
一.wscript对象 描述:提供对 Windows 脚本宿主对象模型根对象的访问.详述:WScript 对象是 Windows 脚本宿主对象模型层次结构的根对象.它可在任何脚本文件中使用,不需要特定 ...
- Smarty插件简单开发
smarty的插件相当简单,你的网站经常会用到一些特定的Url或Controller或Action的路由地址的动态生成,通过smarty插件方式可以很轻松的实现. 在smarty/plugins目录下 ...
- Leetcode#81 Search in Rotated Sorted Array II
原题地址 如果不存在重复元素,仅通过判断数组的首尾元素即可判断数组是否连续,但是有重复元素的话就不行了,最坏情况下所有元素都一样,此时只能通过线性扫描确定是否连续. 设对于规模为n的问题的工作量为T( ...
- C++中的mutable关键字
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词. 在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量,将永远 ...
- 能"干掉"苹果的中国"黑客"
他是全球发现苹果漏洞最多的人,他曾穷的住在小黑屋,他经常接到国家安全部门的电话,他差点堵住周鸿祎的路,他是谁? 无名英雄 我们最终还是没有见到吴石本人,即便他的生意合伙人刘盛(化名)已经应承了帮我们牵 ...
- Bad configuration option localCommand
command-line: line 0: Bad configuration option: PermitLocalCommand 2011-12-08 14:04:54 标签:Bad confi ...