MySQL如何优雅的执行DDL

💡 原文中文,约6600字,阅读约需16分钟。
📝

内容提要

本文介绍了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的建议是什么?

对于外键操作,建议避免使用以减少风险。

🏷️

标签

➡️

继续阅读