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 系统.所以就把 ...
随机推荐
- 11G RAC 简单命令
1.查看集群状态: [root@rac1 ~]# su - grid [grid@rac1 ~]$ crsctl check clusterCRS-4537: Cluster Ready Servic ...
- Nginx模块开发1_明白自定义模块的编译流程
自定义模块的编译流程 --add-module参数 configure使用--add-module参数指定添加模块目录. config脚本 由--add-module指定的目录保存为$ngx-addo ...
- Session设置不当导致API变成单线程问题的解决
起因: 最近开发一个项目,有个接口很慢(数据库的问题),然后在执行期间,随手去点了其他功能(调用其他接口),发现不响应了.等那个很慢的接口返回结果了,这个功能才立马返回结果. 这明显是一个问题啊! ...
- 微软职位内部推荐-Senior SDE for Win Shell Exp
微软近期Open的职位: Job posting title: Senior Software Development Engineer Location: China, Beijing Divisi ...
- C#更改控制台文本颜色
C#更改控制台文本的前景色和背景色 关键字:C# NET 控制台 前景色 背景色地址:http://www.cnblogs.com/txw1958/archive/2012/12/07/cshar ...
- Interview-Largest independent set in binary tree.
BT(binary tree), want to find the LIS(largest independent set) of the BT. LIS: if the current node i ...
- 2729:[HNOI2012]排队 - BZOJ
题目描述 Description某中学有n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人 ...
- HIVE Transform using 用法
select TRANSFORM(*, *, *) using 'python filter.py' as (*, *, *) from t_1 HIVE支持pipe操作,将select出来的字段,用 ...
- VMware虚拟机中Hadoop服务的端口无法访问的问题
今天安装了一个hadoop集群,因为已经在单个虚拟机上安装成功,所以初期安装相对顺利. 初始环境如下: 通过Vmware Esxi服务器虚拟机出来四台机器,每台机器的网络配置如下: ...
- js--eval函数
前言: js的eval函数很牛叉,用了几次--不过都没有记录.试想:如果没有EXT.JQery,怎样将json字符串转换为对象呢? 示例: 定义2个字符串变量s1.s2.其中s1表示一个对象:s2表示 ...