安
网易游戏 MySQL DBA, 主要负责网易游戏 MySQL SaaS 平台的设计与维护,也有关注 TiDB,CockRoachDB 等分布式数据库。
前言
表结构的变更是业务运行过程中比较常见的需求之一,在 MySQL 的环境中,可以使用 Alter 语句来完成这些操作,这些 Alter 语句对应的操作通常也称之为 DDL 操作。
DDL中的痛点
DDL 操作分为很多种,比较常用的包括索引的添加、删除,列的添加、删除等。通常情况下,这些 DDL 操作都会对业务有很明显的影响,需要在业务空闲,或者是维护的时候做,否则非常容易出现 metadata lock 等待的现象,导致业务查询一直没有返回结果或 alter 操作一直处于等待状态。如果业务使用了 Master-Slave 架构,耗时较长的 DDL 操作还会导致 Slave 出现非常明显的延迟。
对业务影响比较大的 DDL 操作中,列的添加和删除是比较常见的操作之一,一般情况下,这种 DDL 操作会完全阻塞某张表的写入,而且还需要花费比较久的时间才能完成。
曾经的解决方案
详细内容请参考 MySQL 的 DDL(https://docs.dumbo.nie.netease.com/ 案例和最佳实践 /MySQL 的 DDL/);
MySQL 5.5 与 以前
在 MySQL 5.5 与更老的版本中,对 Alter 操作做了较简单的实现,添加和删除列的操作使用的是 copy 算法,依靠临时表,把 old_table 的数据重新插入到 new_table,不仅耗时久,占用额外一倍的磁盘空间,还会阻塞表的写入。
MySQL 5.6 与5.7
在 MySQL 5.6 与 5.7,官方提出 Online-DDL 的功能,添加和删除列的操作从 copy 算法变成了 inplca