MySQL 的事务性 DDL 工作流

Posted

技术标签:

【中文标题】MySQL 的事务性 DDL 工作流【英文标题】:Transactional DDL workflow for MySQL 【发布时间】:2015-03-27 15:12:54 【问题描述】:

我有点惊讶地发现 DDL 语句(alter tablecreate index 等)隐式提交 mysql 中的当前事务。来自 MS SQL Server,在本地事务中进行数据库更改(然后回滚)的能力是我工作流程的重要组成部分。对于持续集成,如果迁移因任何原因而中断,则使用回滚,这样至少我们不会使数据库处于半迁移状态。

在使用 MySQL 进行迁移和持续集成时,人们如何解决这两个问题?

【问题讨论】:

交叉张贴在 DBA 上:dba.stackexchange.com/q/90794/18273 欢迎来到美妙的 MySQL 世界 :) 你确定在 SQL Server DDL 命令中没有提交事务吗?因为在 oracle DDL 命令中也提交事务。 WWWOOOOOOOOOOOWWWW。如果这是真的,Oracle/MySQL 很糟糕。逆天。是的,我们确信 DDL 语句参与 Microsoft SQL Server 中的当前事务,并且不会像 Oracle 那样在每个语句之后自动提交事务(哇)。您如何看待 EntityFramework 能够对代码优先迁移进行建模,这些迁移可以在事务中应用和回滚,同时在其中包含许多 DDL 语句。这使得 MySQL 从根本上与 EntityFramework 之类的东西不兼容。为什么他们还要费心去整合它? 【参考方案1】:

一种可能性是以非破坏性方式进行 DDL 更改,其中包括:

在 DDL/DCL(+1 全部反转)和 DML 中拆分逻辑 仅运行 DDL/DCL 脚本添加列、新表、.. 取决于结果: 成功后,应用 DML 更改, 如果失败,请应用反向 DDL/DCL 脚本删除您要在第二步中添加的内容(显然有一些错误“不存在”,具体取决于第 1 步的距离) 删除不再需要的内容,删除旧的列/表

【讨论】:

【参考方案2】:

DDL 语句会导致隐式提交,您对此无能为力。没有办法阻止这种行为。

哪些 DDL 语句具有此行为随着时间的推移而变化,因此您需要检查您的版本。

5.1 http://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html
5.5 http://dev.mysql.com/doc/refman/5.5/en/implicit-commit.html
5.6 http://dev.mysql.com/doc/refman/5.6/en/implicit-commit.html

当我们只是扩展架构、新表/列/视图/procs/等时,不会影响现有代码,那么自动化就可以了,只需检查错误并修复它们。

当它们会影响现有代码时,您需要根据具体情况制定策略。由于没有回滚,因此您需要自己的回滚计划,并且需要对其进行彻底测试。

由于是个案,因此我无法针对您的特定情况提供很多帮助。

【讨论】:

感谢您提供相关文档链接。

以上是关于MySQL 的事务性 DDL 工作流的主要内容,如果未能解决你的问题,请参考以下文章

MySQL--当事务遇到DDL命令

MySQL8.0新特性——支持原子DDL语句

MySQL8.0新特性——支持原子DDL语句

闯祸了,生成环境执行了DDL操作《死磕MySQL系列 十四》

mysql分类和事务回滚

MySQL online DDL的两个坑