Online DDL in MySQL 5.6

Online DDL in MySQL 5.6

转载一篇姜老师的:

在线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操作的总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wulantian

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值