Online DDL in MySQL 5.6

Online DDL in MySQL 5.6-MySQL社区 Inside MySQL Group

在线DDL操作(Online DDL)是MySQL 5.6中最为另人激动的改进功能。从历史上看,若我没记错MySQL在2007年就完成了在线索引接口的设计。而MySQL NDB Cluster、TokuDB都早在5.1版本中就支持在线索引添加,然而直到MySQL 5.6用户才能享受到该功能(虽然facebook团队有推出OSC),这也是MySQL数据库长期被吐槽的原因之一(特别是Oracle DBAOnline DDL in MySQL 5.6 - insidemysql - Inside MySQL)。

虽然MySQL 5.6支持了在线DDL操作,不过还是有些需要注意的问题,最为重要的就是参数innodb_online_alter_log_max_size的配置。在进行DDL操作时会保存操作时间内产生的日志,这与facebook OSC的临时表,但是其保存在内存中,而该内存的大小由参数innodb_online_alter_log_max_size定义,默认大小为128M。如果产生的日志超出该容量大小,则会抛出类似如下的异常提示:

Error:1799SQLSTATE:HY000(ER_INNODB_ONLINE_LOG_TOO_BIG)
Message: Creating index 'idx_aaa' required more than 'innodb_online_alter_log_max_size' bytes of modification log. Please try again.

根据我的实际经验体会,128M通常在一个活跃的线上环境中是不够的,通常512M是比较推荐的值。好在该参数是动态的,可以基于会话级别进行调整。另外个人的体会是,在进行在线索引添加操作时,数据库性能会有20~30%的下降。

另一个小技巧是使用ALTER TABLE ... LOCK=NONE来强制使用在线DDL操作,若操作不支持,则会抛出异常,如:

mysql> ALTER TABLE customers DROP PRIMARY KEY ,LOCK=NONE;
ERROR 1846 (0A000): LOCK=NONE is not supported. Reason: Dropping a primary key is not allowed without also adding a new primary key. Try LOCK=SHARED.

正如前面所说的,并不是所有的DDL操作都支持在线操作,这里附上MySQL官方文档对于DDL操作的总结(http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html)。

发表评论

坐等沙发
相关文章
MySQL 8.0 200W QPS!!!InnoDB大重构 #M1005#
MySQL 8.0 200W QPS!!!InnoDB大重构 …
滚蛋吧,MySQL主从复制延迟
滚蛋吧,MySQL主从复制延迟
MySQL 8.0.3性能大杀器 —— CATS
MySQL 8.0.3性能大杀器 —— CATS
2017年MySQL数据库技术嘉年华 —— 有态度的技术大会
2017年MySQL数据库技术嘉年华 —— 有态度…
IMG社区MySQL技术沙龙南京站圆满结束
IMG社区MySQL技术沙龙南京站圆满结束
改朝换代:MySQL Group Replication
改朝换代:MySQL Group Replication
myadmin 订阅者
我还没有学会写个人说明!

一触即发,2017年,数据库世界的诸神之战