其他
解读|Bytebase 如何实现对 MySQL 库表同步的支持
什么是库表同步?
概述
Schema Diff 引擎
SQL AST
在 SQL AST 上计算 Diff
处理依赖关系
数据库对象和操作内都可能存在着依赖关系,Bytebase 需要正确地处理这些依赖关系。
不同数据库对象之间的依赖关系
Bytebase 需要通过拓扑排序的顺序来处理数据库对象之间的依赖,下列对象的创建顺序需要是由上到下的,而删除顺序是从下到上的:
Table
Column
View
Index
Constraint
而在创建 function,procedure,trigger 这三个对象的时候, MySQL 不会对它们做验证,所以删除原有(如果有)对象之后,可以在任意位置创建它们。
不同数据库操作之间的依赖关系
除了数据库对象之间有依赖关系,不同的操作类型之间也有依赖关系,上面提到的先删除再新增一个同名对象就是一个简单的例子。
Bytebase 将操作类型作以下排序:
创建此前不存在的新的对象,例如新增一个原本不存在的列 A。
原地修改属性,例如修改列的默认值,我们不需要先删除列再增添列,只需要原地修改即可。
删除无法原地修改属性的对象,例如 Index,如果两个同名 Index 的定义不一致,MySQL 不允许我们修改 Index 的定义。Bytebase 将会删除这个 Index,并在随后的第四条重建。
重建无法原地修改属性的对象。
删除多余的对象。
将 AST 还原成 SQL 语句
通过上面的顺序将 diff 结果排序后,我们就获得了一系列 AST,通过解析器将这些 AST 还原成 SQL 语句就得到了我们最终的结果。
tl;dr
将 SQL 语句转换成 AST。
比较对应的 AST 并生成对应的 Diff 结果(以 AST 的形式表示)。
调整 Diff 结果的顺序。
将 Diff 结果 AST 还原成 DDL 语句。
使用 Schema Sync