更新时间:2025-04-23 gmt 08:00

ddl工具简介-j9九游会登录

mysql 5.6之前数据库中对大表的表结构修改的ddl操作通常会引发dml语句阻塞,复制延迟升高等问题,导致数据库对外呈现出一种“异常”的状态。本文介绍了mysql原生的数据库ddl方式copy和inplace算法、开源工具gh-ost以及mysql 8.0新增的instant秒级加列的算法的原理,使用限制,适用场景等。

  • mysql原生的copy算法由于在拷贝数据的过程中对源表加mdl写锁,导致dml语句被长时间阻塞,已经不推荐使用。
  • inplace算法相比copy算法有很大的改进,采用在原表上进行更改的方法,不需要生成临时表,占用的额外空间小。同时inplace操作只需要短暂的持有mdl写锁,不会造成dml操作被长时间阻塞。但是对大表的表结构修改,依然要消耗大量的时间,导致备机在回放ddl语句时产生较大的复制延迟。
  • 开源gh-ost将一个ddl操作拆分成多个小操作,减少单次操作的时间来降低复制延迟。同时只有在最后rename镜像表和原表的过程中才会短暂阻塞读写操作。gh-ost基于binlog回放增量数据,同时额外维护了额外的心跳表来记录ddl执行过程,支持临时暂停ddl过程。这些机制导致gh-ost的执行时间比原生的ddl算法略长。
  • mysql 8.0之后提出的instant秒级加列算法,不再需要rebuild整个表,只需要在表的metadata中记录新增列的基本信息即可。这种方式将大表的加列操作降低到了秒级。但是目前这种方式的应用场景只局限在添加列,设置列默认值,删除列默认值,修改enum/set列的定义等少量ddl场景。

根据每种算法和工具的特点,建议在可以使用instant算法的ddl场景和版本下,尽可能使用instant算法来减少ddl对整个业务的影响。此外的其他情况,如果客户是主备或含有只读实例的场景,且对复制延迟带来的影响容忍较低的情况下,使用gh-ost工具来进行ddl操作。如果客户需要快速变更表结构,可以容忍短时间的主备不一致的问题,用inplace算法可以满足需求。copy算法由于会长时间阻塞dml操作,占用大量磁盘空间,且执行时间较长,目前在可以应用其他算法和工具的场景下不推荐使用。

表1 ddl工具说明

方法

mysql copy

mysql inplace

gh-ost

instant

ddl过程中读取数据

允许

允许

允许

允许

ddl过程中写入数据

不允许

允许(短暂时间不允许)

允许(短暂时间不允许)

允许

额外空间占用

小(需要rebuild会略高)

执行时间

非常长

非常长

复制延迟

相关文档

网站地图