MySQL如何优雅的执行DDL
内容提要
本文介绍了MySQL DDL表结构变更的两种方式:pt-osc和Online DDL,分析了它们的优缺点和影响。同时讨论了加锁情况和各种DDL操作的差异。建议根据具体情况选择合适的方式进行表结构变更。
延伸解读
Online DDL 的复制延迟风险
Online DDL 在主库执行后,从库会重放相同的 DDL 操作。如果 DDL 耗时较长,从库在重放期间会阻塞后续所有 SQL,导致复制延迟持续增大,直到 DDL 完成。对于大表操作,这种延迟可能非常显著,影响从库的读服务。因此,在有从库的架构中,选择 Online DDL 前必须评估延迟容忍度。
pt-osc 的资源消耗与适用场景
pt-osc 通过创建新表并拷贝全量数据来实现表变更,过程中会消耗大量磁盘 IO 和存储空间,并产生大量 binlog。虽然它避免了从库复制延迟,但执行时间长,对实例资源压力大。因此,pt-osc 更适合空间充足、能容忍较长执行时间的场景,尤其是对复制延迟敏感的业务。
VARCHAR 列扩容的临界点
VARCHAR 列增加长度时,如果列存储最大需要字节数从 0-255 范围跨越到 256-65535 范围,记录列长度所需的字节数会从 1 字节变为 2 字节,此时 Online DDL 只能使用 COPY 算法,导致锁表和数据拷贝。例如 utf8mb4 下,长度从 63 增加到 64 就会触发此变化。这种情况下应选择 pt-osc 以避免阻塞。
主键与唯一索引操作的选择
涉及主键或唯一索引的 DDL 操作,建议直接使用 Online DDL,因为 pt-osc 依赖唯一键校验数据一致性,可能引发问题。但需注意,单独删除主键会锁表,阻塞增删改;而在同一个 DDL 中删除旧主键并添加新主键则不会阻塞。因此,操作前应仔细评估锁表影响。
Q&A
MySQL DDL表结构变更有哪些方式?
MySQL DDL表结构变更主要有两种方式:pt-osc和Online DDL。
pt-osc和Online DDL各自的优缺点是什么?
pt-osc的优点是不会引发复制延迟,缺点是需要拷贝全量数据,执行时间较长;Online DDL的优点是执行速度快,但可能会锁表并引发复制延迟。
在MySQL 5.7中,DDL操作的加锁情况如何?
在MySQL 5.7中,DDL操作通常只在执行前后加表元数据锁,整体加锁情况较好,不会对现有业务造成严重堵塞。
在什么情况下建议使用pt-osc进行表结构变更?
建议在需要避免复制延迟或在执行时间较长的情况下使用pt-osc进行表结构变更。
Online DDL在创建普通二级索引时的表现如何?
Online DDL在创建普通二级索引时执行时间较短,但需考虑复制延迟的问题。
对于外键操作,MySQL DDL的建议是什么?
对于外键操作,建议避免使用以减少风险。