讲师中心 微信公众号
AI工具推荐 视频效率加速

如何使用MySQL Online DDL降低变更影响

云杰吖_4352

云杰吖_4352

发布时间:2026-08-24 08:15:23

|

792人浏览过

|

来源于php中文网

原创

判断ALTER是否走Online DDL应查官方支持矩阵或观察SHOW PROCESSLIST中是否出现“copy to tmp table”;INSTANT仅限8.0.12+末尾加列等极窄场景;LOCK=NONE不等于零阻塞,仍受MDL锁、Buffer Pool污染等影响。

如何使用mysql online ddl降低变更影响

怎么判断一个ALTER是否走Online DDL

直接看执行计划或EXPLAIN没用,MySQL不暴露DDL执行路径。真正可靠的方式是查INFORMATION_SCHEMA.INNODB_METRICS或观察SHOW PROCESSLIST中是否长时间卡在copy to tmp table——出现这个状态,基本就是走COPY算法了。

更实用的做法是查官方文档的Online DDL支持矩阵,对照你的操作类型和MySQL版本。比如:ADD INDEX在5.6+全版本都走INPLACE;ADD COLUMN在8.0.12+末尾加字段可走INSTANT;但MODIFY COLUMN哪怕只是把VARCHAR(10)改成VARCHAR(20),在8.0.33之前仍可能触发COPY。

  • 别信“默认就Online”——MySQL的ALGORITHM=DEFAULT会优先选INPLACE,但某些操作(如改字符集)根本无法INPLACE,它就会退化到COPY
  • 用ALGORITHM=INPLACE强制指定后,如果操作不支持,会报错ERROR 1845 (HY000): ALGORITHM=INPLACE is not supported,而不是静默降级
  • LOCK=NONE不是万能开关:即使算法支持INPLACE,若操作本身需排他锁(如删主键),LOCK=NONE会直接失败,报错ERROR 1846 (HY000): LOCK=NONE is not supported

什么时候必须用pt-online-schema-change而不是原生Online DDL

原生Online DDL不是万能解药。当遇到以下任一情况,就得切到pt-online-schema-change:

  • ALTER TABLE语句被MySQL判定为必须COPY,且你没法改操作方式(比如要给大表CHANGE COLUMN类型,又不能升级到8.0.33+)
  • 主从延迟敏感:原生INPLACE操作虽允许DML并发,但DDL期间产生的row log要等commit阶段才合并,从库回放压力集中,容易拉长延迟
  • 需要中途暂停或限速:原生DDL一旦开始就停不了,pt-osc支持--max-load、--check-interval等参数动态控速
  • DDL变更涉及外键或触发器——pt-osc会自动处理影子表的外键重建和触发器迁移,原生DDL容易漏掉依赖对象

注意:pt-osc不是零成本。它会在原库多占一份磁盘(影子表+触发器日志),且对高QPS写入场景,触发器开销可能推高CPU。上线前务必在备库压测。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

INSTANT DDL的硬性限制和绕过技巧

ALGORITHM=INSTANT只在8.0.12+有效,且仅覆盖极窄的操作集:末尾加列、改列默认值、删列(8.0.29+)、重命名列(8.0.29+)。但它有个关键隐性约束:所有历史行查询时都要补默认值,所以新增列必须带DEFAULT。

  • 没写DEFAULT?MySQL会拒绝执行,报错ERROR 3105 (HY000): Cannot add column with non-default value in INSTANT algorithm
  • 想在中间插字段?不行。8.0.29起支持AFTER col_name语法,但底层仍是INPLACE而非INSTANT,性能无提升
  • 已有数据的表,INSTANT加的列在查询旧数据时“看起来”有值(默认值),但磁盘上那行实际没存这个字段——这是元数据版本控制的结果,别试图用SELECT * FROM t WHERE new_col IS NULL去筛数据,永远查不到

如果业务真需要中间加字段,又卡在INSTANT限制里,唯一办法是接受一次INPLACE重建:先末尾加字段,再用ALTER TABLE ... MODIFY COLUMN调整顺序(这步会触发INPLACE rebuild,但比全表COPY快得多)。

LOCK=NONE失效的典型场景

LOCK=NONE常被当成“完全不锁表”的银弹,实际它只保证DML不被阻塞,但以下情况仍会导致业务感知卡顿:

  • MDL锁争抢:DDL准备阶段会短暂申请MDL_EXCLUSIVE,如果此时有长事务正在查这张表,DDL会被堵住,而所有新来的DML也会排队等这个MDL——表现为“突然所有写入变慢”,查performance_schema.metadata_locks能看到堆积
  • Buffer Pool污染:INPLACE重建索引时,会批量读取数据页进内存,挤出热点页。后续查询可能因缓存命中率下降而变慢,尤其在buffer pool不够大的实例上
  • Binlog写放大:Online DDL期间产生的row log最终要刷成binlog event,如果DDL耗时长,binlog写入会持续占用IO,影响主从同步吞吐

真正要“零感知”,得组合策略:挑低峰期执行 + 确保没有未提交长事务 + innodb_buffer_pool_size预留20%余量 + 监控Innodb_rows_read和Bytes_received突增。单靠LOCK=NONE解决不了根本问题。

热门AI工具

更多
PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2073

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

1279

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

735

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2792

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

4648

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

1079

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

4911

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

4382

2023.08.14

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 178人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 283人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn