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

怎样在MySQL8.0中理解原子DDL操作的实现逻辑

梦雪吖_8780

梦雪吖_8780

发布时间:2026-10-02 10:26:07

|

457人浏览过

|

来源于php中文网

原创

MySQL 8.0原子DDL仅对特定操作(如ADD COLUMN、DROP INDEX等)提供事务级原子性,不支持MODIFY COLUMN等操作;其依赖InnoDB系统表、ddl_log表和XA事务协同实现物理文件、字典与binlog三同步。

怎样在mysql8.0中理解原子ddl操作的实现逻辑

原子DDL不是“所有ALTER都回滚”,而是“只对特定操作启用事务包装”

MySQL 8.0 的原子 DDL 不是给每个 ALTER TABLE 自动加个 BEGIN/COMMIT 就完事。它只对官方明确标注为 Atomic DDL supported: Yes 的子集生效,比如 ADD COLUMN(末尾添加)、DROP INDEX、RENAME TABLE(同库内)、ALTER TABLE ENGINE=InnoDB。而 MODIFY COLUMN、CHANGE COLUMN、OPTIMIZE TABLE 这些操作压根不进原子事务流程——它们失败时可能已改了部分元数据,但无法整体回滚。

关键点在于:原子性 ≠ 语法合法,也不等于“用了 MySQL 8.0 就安全”。你执行一条 ALTER TABLE t1 MODIFY c1 INT,哪怕服务器崩溃,重启后表结构可能处于中间态(比如列类型没改完但索引被删了),这不是 bug,是设计如此。

底层靠 InnoDB 系统表 + ddl_log 表协同完成“物理文件+字典+日志”三同步

原子性的实现依赖三个硬绑定层:

  • mysql.tables、mysql.columns 等系统表全用 InnoDB 引擎存储,DDL 变成对这些表的普通 DML 操作,天然支持 ACID
  • mysql.innodb_ddl_log 是隐藏日志表,记录文件级操作(如重命名 .ibd、删除临时文件)的前滚/回滚指令,确保崩溃后能补全或清理物理动作
  • binlog 写入与字典更新在同一个 XA 事务中提交,避免主从之间出现“从库有新结构但主库没生效”的错位

所以崩溃恢复时,InnoDB 先按 undo log 回滚字典变更,再查 innodb_ddl_log 执行补偿动作(比如删掉本该 rename 却没完成的文件),最后刷新 buffer pool 中的 dict_table_t 对象。整个链条缺一不可。

MySQL
MySQL

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

下载

ALGORITHM=INSTANT 和原子性完全无关,别混淆“快”和“安全”

ALGORITHM=INSTANT 只影响执行速度,它跳过拷表、不锁表、不生成临时文件,但它的成功与否不改变原子性机制是否触发:

  • 支持 INSTANT 的操作(如 ADD COLUMN 末尾加、SET DEFAULT)如果同时满足原子 DDL 条件,就既快又可回滚
  • 不支持 INSTANT 的操作(如 DROP COLUMN)只要属于原子 DDL 支持列表,依然走完整事务流程,只是慢一点
  • 混用风险:在显式事务里写 START TRANSACTION; ALTER TABLE ... ALGORITHM=INSTANT; ALTER TABLE ... MODIFY COLUMN;,第二句直接报错退出,且第一句已提交的变更不会回滚

验证原子性是否真生效,不能只看错误信息,得交叉查字典和物理状态

服务器异常重启后,光看 SHOW CREATE TABLE 不够。必须做两件事确认状态一致:

  • 执行 SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME = 'db/t1',确认 SPACE 和 FLAG 字段有值且未变
  • 执行 SELECT FILE_NAME, ENGINE FROM INFORMATION_SCHEMA.FILES WHERE TABLE_NAME = 't1',核对返回的 .ibd 文件路径和引擎是否匹配 INNODB_SYS_TABLES 中记录
  • 若两者脱节(比如字典显示表存在,但 FILES 查不到对应 .ibd),说明原子 DDL 在准备阶段就被拒绝了,典型错误是 ERROR 1033 或 ERROR 1286,这时要检查表空间一致性,而不是重试 DDL

真正容易被忽略的是:原子性只管“改完或不改”,不管“能不能改”。MDL 锁冲突、磁盘满、外键约束校验失败这些都会让 DDL 直接失败,但它们不属于原子性失效,而是前置校验环节拦下的正常行为。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

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

PixPix
PixPix Hot

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

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

UP简历
UP简历 Hot

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

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

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

WorkBuddy

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

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

3923

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

831

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1029

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

5761

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2703

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

5740

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

7601

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1030

2024.04.29

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

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

20

2026.09.30

热门下载

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

精品课程

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

共1课时 | 178人学习

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

共2课时 | 282人学习

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

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