介绍 schemadiff 命令行工具
PlanetScale数据库集群的核心优势之一是支持零停机时间的模式迁移工作流,而这一点正是通过数据库分支实现的。
在PlanetScale中,分支从技术上来说是一个独立的MySQL集群。通过部署请求(Deploy Requests),可以将一个分支上的模式更改应用到另一个分支。在这一工作流中,我们广泛利用了Vitess提供的 schemadiff
命令,用于计算分支之间的模式差异、确定更改顺序(包括迁移并发的可能性),并在三向合并逻辑中将更改应用到上游数据库分支。
今天,我们发布了 schemadiff
命令行工具,它是Vitess的 schemadiff
库的一个轻量级封装。
快速上手 schemadiff
schemadiff
命令行工具让你可以轻松验证、规范化以及比较来自标准输入、文件系统或MySQL数据库的模式。
要尝试 schemadiff
工具,可以访问其 GitHub releases 页面 获取适用于Linux和Mac的最新二进制文件。项目README还包含了关于如何使用工具的详细信息、适用场景以及如何从源码构建该工具以支持其他平台的信息。
我们来看看一些经典的使用场景。
描述一个数据库
可以通过 load
子命令结合数据源,展示你现有数据库的定义:
schemadiff load --source 'myuser:mypass@tcp(127.0.0.1:3306)/test' -- Output: CREATE TABLE `t` ( `id` int, PRIMARY KEY (`id`) ); CREATE TABLE `t2` ( `id` int, `name` varchar(128) NOT NULL DEFAULT '', PRIMARY KEY (`id`) );
它也可以接受一段SQL语句字符串用于格式化并规范化,这将使模式更容易阅读:
echo "create table t (id int(11) unsigned primary key)" | schemadiff load -- Output: CREATE TABLE `t` ( `id` int unsigned, PRIMARY KEY (`id`) );
尝试加载格式不正确的SQL文件会抛出错误。这在CI/CD流水线中验证数据库变更脚本时非常有用,可以防止错误脚本被应用到数据库:
schemadiff load --source mydb.sql > /dev/null || echo "FAIL"
显示更改
diff
子命令可以比较两个模式,并生成必要的DDL语句以使它们同步。这也是我们在PlanetScale中合并分支时生成变更语句的方法。
schemadiff diff --source 'myuser:mypass@tcp(127.0.0.1:3306)/test' --target /path/to/repo/source/code/schema -- Output: DROP VIEW `v`; ALTER TABLE `t` MODIFY COLUMN `id` bigint; CREATE TABLE `t2` ( `id` int, `name` varchar(128) NOT NULL DEFAULT '', PRIMARY KEY (`id`) );
有关更多使用场景,请务必查看项目的README文档。schemadiff
命令行工具支持MySQL 8语法,并以 Apache 2.0 许可证发行。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接