当前位置: 首页 > news >正文

MySQL在线DDL:零停机改表实战指南

你提供的这段内容是 MySQL 官方文档的 17.12 节:InnoDB and Online DDL,它详细介绍了 MySQL(尤其是 InnoDB)从 5.6 开始引入并持续优化的一项核心功能:在线 DDL(Online DDL)


🌟 一句话总结:

Online DDL 允许你在修改表结构(如加字段、建索引等)的同时,依然可以正常读写数据,几乎不影响业务运行。

这在现代高可用、高并发的生产环境中至关重要。


我们来逐段深入解读,并用通俗语言 + 实战建议帮助你理解。


🔹 17.12.1 Online DDL Operations(支持的在线 DDL 操作)

✅ 什么是 Online DDL?

传统的 ALTER TABLE 会锁表、复制整个表,耗时长、服务中断。而 Online DDL 改进了这一点:

  • Instant(瞬间完成):某些操作只需修改元数据,不碰数据文件。
  • In-Place(原地修改):不创建临时表,直接在原表上改,但仍需少量锁。
  • Copy(表复制):老方式,效率低,已尽量避免。

📊 不同操作类型对比(MySQL 8.0+)

操作ALGORITHM是否在线?说明
ADD COLUMN(末尾)INSTANT(8.0.12+)✅ 几乎无锁只改元数据
ADD INDEXINPLACE✅ 支持 DML构建索引时允许读写
DROP INDEXINPLACE✅ 完全在线删除快
MODIFY COLUMN 类型变更COPYINPLACE❌/⚠️大部分需要复制表
ADD PRIMARY KEYINPLACE✅ 但需排序可能较慢
CHANGE COLUMN 名称或类型多数 COPY不推荐在线做

💡 提示:INSTANT 是 MySQL 8.0.12 的重大优化,比如加字段几乎“零延迟”。


🔹 17.12.2 Online DDL Performance and Concurrency(性能与并发控制)

⚙️ 你可以通过两个关键子句控制行为:

1. ALGORITHM={INSTANT \| INPLACE \| COPY}

  • 强制使用某种算法。
  • 用于调试或降级兼容。

2. LOCK={DEFAULT \| NONE \| SHARED \| EXCLUSIVE}

  • 控制 DDL 期间的并发级别。
LOCK 级别允许 SELECT?允许 DML(INSERT/UPDATE/DELETE)?场景
LOCK=NONE最宽松,适合高并发系统
LOCK=SHARED只读可用,防写入
LOCK=DEFAULT自动选择自动选择默认行为
LOCK=EXCLUSIVE完全锁表,慎用

✅ 推荐做法:

ALTER TABLE users ADD COLUMN phone VARCHAR(20), ALGORITHM=INPLACE, LOCK=NONE;

这样如果无法做到“不锁”,语句会立即失败,而不是卡住生产环境。


🔹 17.12.3 Online DDL Space Requirements(空间需求)

💾 空间消耗对比

算法是否需要额外空间?说明
ALGORITHM=INSTANT❌ 几乎不需要只改字典
ALGORITHM=INPLACE⚠️ 少量需要日志空间、排序缓冲等
ALGORITHM=COPY✅ 需要 ≥ 2倍表大小创建临时表 .tmp,风险高

📌 举例:一个 50GB 的表执行 ALGORITHM=COPY,需要至少 100GB 磁盘空间!

✅ 建议:

  • 监控磁盘空间。
  • 尽量避免 COPY 模式。

🔹 17.12.4 Online DDL Memory Management(内存管理)

  • Online DDL 在构建索引或重做表时会使用缓冲区。
  • 主要参数:
    • innodb_sort_buffer_size:排序用内存。
    • innodb_online_alter_log_size:记录 DDL 过程中 DML 变更的日志大小。

⚠️ 如果 DDL 期间有大量写入,这个日志可能溢出,导致失败。

✅ 建议:

  • 对大表 DDL,提前增大:
    SET GLOBAL innodb_online_alter_log_size = 1073741824; -- 1GB
    

🔹 17.12.5 Configuring Parallel Threads for Online DDL(并行线程配置)

从 MySQL 8.0 起,某些 DDL 操作(如创建二级索引)可以并行执行,显著提升速度。

  • 使用参数:innodb_parallel_read_threads(默认 4)
  • 适用于:ADD INDEX 等 I/O 密集型操作。

✅ 示例:

-- 提高并行度
SET SESSION innodb_parallel_read_threads = 8;
ALTER TABLE orders ADD INDEX idx_user_id (user_id);

💡 类似于“多个人一起搬砖”,加快索引构建。


🔹 17.12.6 Simplifying DDL Statements with Online DDL(简化 DDL 语句)

不需要每次都写 ALGORITHMLOCK,MySQL 默认会自动选择最优方式。

但你可以显式指定以确保安全:

-- 安全写法:必须在线,否则失败
ALTER TABLE logs ADD COLUMN status TINYINT,ALGORITHM=INPLACE,LOCK=NONE;

✅ 好处:防止意外锁表,适合自动化脚本。


🔹 17.12.7 Online DDL Failure Conditions(失败情况)

以下情况会导致 Online DDL 失败或退化为 COPY

  1. 使用了不支持 INPLACE 的操作(如改变列字符集)。
  2. 指定的 LOCK 级别无法满足(如要求 LOCK=NONE 但实际需要锁)。
  3. 磁盘空间不足。
  4. innodb_online_alter_log 溢出(DDL 期间写入太多)。
  5. 存在外键约束限制。

✅ 建议:在测试环境先试,查看 SHOW ENGINE INNODB STATUS 中的 DDL 日志。


🔹 17.12.8 Online DDL Limitations(限制)

当前仍有一些限制:

限制说明
不支持 JSON 列的某些修改如修改嵌套结构
分区表 DDL 更复杂部分操作仍需锁表
ALTER TABLE ... RENAME COLUMN8.0+ 支持,但底层可能是 COPY
外键约束可能阻止 LOCK=NONE需注意依赖关系
ROW_FORMAT 修改可能触发复制尤其是 COMPRESSED

✅ 实战建议(DBA 必看)

场景推荐做法
加字段(末尾)MySQL 8.0.12+ 用 ADD COLUMN → 几乎无感
加索引ALGORITHM=INPLACE, LOCK=NONE,避免高峰期
改字段类型小心!可能触发 COPY,先评估
删除字段支持 INPLACE,但建议先测试
生产环境 DDL永远加上 LOCK=NONELOCK=SHARED,防止锁库
大表操作提前调大 innodb_online_alter_log_size,开启并行

🧪 示例:安全地在线加字段和索引

-- 1. 加字段(MySQL 8.0.12+ 瞬间完成)
ALTER TABLE users ADD COLUMN email VARCHAR(100) AFTER name,ALGORITHM=INSTANT,LOCK=NONE;-- 2. 加索引(允许读写)
ALTER TABLE users ADD INDEX idx_email (email),ALGORITHM=INPLACE,LOCK=NONE;-- 3. 查看是否成功
SHOW PROCESSLIST; -- 观察是否有阻塞

📈 总结:Online DDL 的三大优势

优势说明
高可用性表不锁,服务不中断
节省空间避免 COPY 模式占用双倍磁盘
提升效率并行 + 快速算法(如 INSTANT)

🚨 最后提醒

不要以为所有 DDL 都是“在线”的!

一定要:

  1. 查看 MySQL 官方文档 确认操作是否支持 Online。
  2. 在测试环境验证。
  3. 生产环境使用 ALGORITHMLOCK 显式控制行为。

如果你有具体的 DDL 语句想知道是否“在线”,或者想分析某个 DDL 为什么卡住了,欢迎贴出来,我可以帮你分析!

http://www.dtcms.com/a/419076.html

相关文章:

  • 哪个做图网站可以挣钱马鞍山网站建设公司排名
  • 杭州公司做网站电商是干什么工作的
  • 揭秘InnoDB磁盘I/O与存储空间管理
  • 【深度相机术语与概念】
  • Android studio 依赖jar包里的类引用时红名,但能构建打包运行。解决红名异常
  • 做设计常用的素材网站网站seo啥意思
  • 云南最便宜的网站建设农村电商平台简介
  • AI时代下,我们需要新一代的金融基础软件
  • 挪威网站后缀网站服务器ip
  • Salesforce 生态中的缓存、消息队列和流处理
  • 【开源】基于STM32的无线条码扫描仪控制系统设计
  • 南京我爱我家网站建设新村二手房有限责任公司和有限公司的区别
  • WebStorm 快捷键大全(Windows / macOS 双平台对照)
  • 多线程顺序输出abc
  • CSS盒模型全面解析
  • 免费开源cms网站源码网页设计公司网站设计
  • [pytest] autouse 参数:自动使用fixture
  • 上海市建上海市建设安全协会网站wordpress盲注
  • 论文阅读三-第二章(3)
  • 在 Windows 系统上怎么使用rabbitmq相关命令,比如:rabbitmqctl list_queues 命令
  • spire.doc for .net 在word的表格最后增加行及索引超限处理办法
  • 【android 驱动开发十】中断唤醒功能-维持500ms唤醒状态
  • 微信上可以做网站吗广州专业视频制作
  • wordpress还原网站源码易语言 wordpress
  • 深入解析AppCrawler:开源自动遍历测试工具配置指南
  • 24届(华为OD)Java面经
  • 20届-测试面经-华为OD
  • 重庆seo整站优化效果百度竞价推广属于什么广告
  • 朝阳区住房和城乡建设部网站营销模式有几种
  • linux学习笔记(5)计算机基本硬件结构