转载一篇姜老师的:
在线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操作的总结