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测试的更多相关文章

  1. SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]

    目录 SignalR系列目录 前言 也是好久没写博客了,近期确实很忙,嗯..几个项目..头要炸..今天忙里偷闲.继续我们的小系列.. 先谢谢大家的支持.. 我们来聊聊SignalR的性能监测与服务器的 ...

  2. Apache Ignite之集群应用测试

    集群发现机制 在Ignite中的集群号称是无中心的,而且支持命令行启动和嵌入应用启动,所以按理说很简单.而且集群有自动发现机制感觉对于懒人开发来说太好了,抱着试一试的心态测试一下吧. 在Apache ...

  3. 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率

    之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...

  4. TechEmpower 13轮测试中的ASP.NET Core性能测试

    应用性能直接影响到托管服务的成本,因此公司在开发应用时需要格外注意应用所使用的Web框架,初创公司尤其如此.此外,糟糕的应用性能也会影响到用户体验,甚至会因此受到相关搜索引擎的降级处罚.在选择框架时, ...

  5. .NET Core系列 :4 测试

    2016.6.27 微软已经正式发布了.NET Core 1.0 RTM,但是工具链还是预览版,同样的大量的开源测试库也都是至少发布了Alpha测试版支持.NET Core, 这篇文章 The Sta ...

  6. 渗透测试工具BurpSuite做网站的安全测试(基础版)

    渗透测试工具BurpSuite做网站的安全测试(基础版) 版权声明:本文为博主原创文章,未经博主允许不得转载. 学习网址: https://t0data.gitbooks.io/burpsuite/c ...

  7. 在ubuntu16.10 PHP测试连接MySQL中出现Call to undefined function: mysql_connect()

    1.问题: 测试php7.0 链接mysql数据库的时候发生错误: Fatal error: Uncaught Error: Call to undefined function mysqli_con ...

  8. 【初学python】使用python调用monkey测试

    目前公司主要开发安卓平台的APP,平时测试经常需要使用monkey测试,所以尝试了下用python调用monkey,代码如下: import os apk = {'j': 'com.***.test1 ...

  9. CoreCRM 开发实录——Travis-CI 实现 .NET Core 程度在 macOS 上的构建和测试 [无水干货]

    上一篇文章我提到:为了使用"国货",我把 Linux 上的构建和测试委托给了 DaoCloud,而 Travis-CI 不能放着不用啊.还好,这货支持 macOS 系统.所以就把 ...

随机推荐

  1. libcurl

    一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_perform 函数说明(error 状态码) 五.libcurl使用 ...

  2. 一些 PHP 管理系统程序中的后门

    一些php网站管理程序的,一些后门,其实官方也没有恶意,主要是大家为了自己的安全. 我倒不怎么关心提示框,SABLOG怎么知道我的版本有漏洞呢,程序肯定有后门.每次登陆后台自动检测官方版本跟当前版本对 ...

  3. PHP中如何获取多个checkbox的值

    > > > weeks后的中括号不可漏,否则用PHP获取的时候只能取到最后一个值.之后PHP就很好处理了,如下: PHP获取checkbox值方法一: $weeks = $_POST ...

  4. Pomodairo,番茄工作法-应用篇

    传统:              选择一个待完成的任务              将番茄时间设为适合自己的固定时间              专注工作,中途不允许做任何与该任务无关的事,直到番茄时钟响 ...

  5. Quartz.net 的开源任务管理平台

    Quartz.net 的开源任务管理平台 前面总结了很多,关于Quartz.net 的文章,介绍了如何使用Quartz.net.不清楚的朋友,可以看我之前的系列文章,http://www.cnblog ...

  6. Openmeeting 网页打开缓慢,视频卡的一个解决方法

    在初次安装完openmeeting以后,从浏览器打开后发现网页缓慢,视频有卡顿的现象. 原因:为openmeeting分配的内存太小. 解决方法: 找到根目录的red5.bat,打开后查找“set J ...

  7. sqlserver 2008r2 表分区拆分问题

    问题描述: 对tab1表实行自动天分区,每天通过sqlserver代理-作业00:00点自动生成分区: 因有次停了数据库服务,sqlserver 代理服务忘记开启,导致当天00:00没有生成新分区: ...

  8. Maven搭建webService (一) 创建服务端---使用main函数发布服务

    今天和大家分享下 使用maven 搭建 webService 服务端: 首先需要在你的IDE中集成Maven.集成办法此处略....... 1.创建一个web工程. 2.在pom文件中增加以下依赖: ...

  9. KASS分布式文件系统(Kass File System)

    KASS分布式文件系统(Kass File System),简称KFS,是开始公司自主研发的分布式文件存储服务平台.KFS系统架构及功能服务类似Hadoop/GFS/DFS,它通过HTTP-WEB为上 ...

  10. 【转】System.DateTime.Now.ToString()的一些用法

    C#中的日期处理函数     //2007年4月24日     this.TextBox6.Text = System.DateTime.Now.ToString("D");    ...