如何使用 Skeema 自动化 MySQL 数据库迁移
Skeema
是一种开源 CLI 工具,可让我们跨多个主机同步 MySQL 数据库模式。 它适用于包含 CREATE TABLE 语句的纯 SQL 文件。
数据库迁移是软件开发过程中最常见的挑战之一。 我们如何对架构进行版本控制并将更改应用于所有环境?
Skeema 通过让我们像常规 SQL 一样管理我们的模式来帮助缓解这个痛点。 没有特殊的语法或配置文件格式需要学习。 当我们将模式推送到主机时,Skeema 将提取该主机上表的定义并将它们与本地文件进行比较。 然后它将计算 CREATE
、ALTER
和 DROP
语句以使远程主机与我们的 SQL 文件匹配。
我们需要使用 InnoDB
表才能充分利用 Skeema。 它可以与 MyISAM
表一起使用,但并非所有功能都受支持,可能会遇到问题。
入门
Skeema 适用于 Linux 和 Mac。 提供 DEB 和 RPM 包,以及预构建的独立二进制文件。 为我们的系统获取适当的下载,然后安装包或将二进制文件解压到我们相应的路径中的目录。
使用 Skeema 的第一步是获取数据库的现有模式。 如果我们已经有了包含 CREATE TABLE
语句的 SQL 文件集合,则可以按原样使用它们。 否则,运行 skeema init
命令以获取表示实时数据库的 SQL。
Skeema 的 CLI 接受与常规 mysql
命令相同的参数。 使用 -h 、**-u** 和 -p 标志指定我们的 MySQL 主机、用户名和密码。 MySQL 用户应该对我们的模式具有管理访问权限; 否则,Skeema 可能无法检查它们或应用所有更改。 Skeema 会将我们的 SQL 文件存放到工作目录中的一个新目录中; 添加 -d 标志以指定它的名称。
skeema init -h example.com -u root -p -d my-sql
Skeema 默认导出主机上所有模式的 SQL。 每个模式都将在 my-sql 文件夹中获得自己的子目录。 使用 --schema
标志指示要导出的特定模式。 会直接放到 my-sql 里面,没有任何子目录嵌套。
同步模式
获得 SQL 后,就可以将其同步到另一台主机。 使用 skeema push
命令将本地 SQL 与另一个 MySQL 服务器进行比较。 Skeema 将自动应用它检测到的任何更改。
$ cd my-sql
$ skeema push -h example.com -u root -p -d my-sql
尝试编辑 SQL 中的 CREATE TABLE
语句之一。 添加新列或更改现有列的类型。 当我们推送 skeema 时,Skeema 将生成一个 ALTER TABLE
语句来更新远程表以进行匹配。
默认情况下禁用潜在的破坏性操作,例如删除表或更改列的数据类型。 如果意外运行 Skeema 或指定了不正确的服务器,这可以帮助我们避免意外的数据丢失。 通过向 skeema 推送命令添加 --allow-unsafe
标志来激活破坏性操作。
使用多个环境
Skeema 的一个常见用途是保持多个环境同步。 如果我们有本地、开发和生产服务器,Skeema 可以让我们命名它们,以便可以在它们之间无缝地推送和拉取。
编辑架构目录中的 .skeema 文件以启用此功能。 这是一个类似于 INI 的配置结构,其中每个部分都定义了一个新的命名环境。 首先,我们将拥有一个由 skeema init
添加的生产环境。
指定每个服务器的连接详细信息,以便我们可以推送和拉取以保持一切同步。 文件顶部、任何部分之外的键是应用于所有环境的全局设置。
default-character-set=utf8mb4
default-collation=utf8mb4_general_ci
generator=skeema:1.5.2-community
schema=example-db
[production]
flavor=mysql:8.0
host=example.com
port=3306
password=example
user=mysql
[local]
flavor=mysql:8.0
host=localhost
port=3306
password=example
user=mysql
现在我们可以轻松地在环境之间同步更改:
$ skeema pull local
$ skeema push production
此命令序列首先更新磁盘上的 SQL 文件以匹配本地服务器的架构。 然后将更改应用于实时生产环境。 或者,我们可以手动编辑磁盘上的 SQL,然后推送到本地和生产环境。
这种方法使数据库迁移变得简单、可重复且不易出错。 我们可以将 Skeema 合并到 CI 管道中,以将数据库更改作为常规部署流程的一部分推出到生产环境中。
试运行与 Lint
有时我们可能想检查环境所需的更改而不实际应用它们。 在这种情况下,使用 skeema diff
将命名环境与磁盘上的 SQL 文件进行比较。 Skeema 将向我们展示不同之处,以便我们可以预测 skeema push
效果。
Skeema 还有一个内置的 linting
工具。 运行 skeema lint
来分析我们的 SQL 文件并找出可能的问题。 支持几个可配置的规则。 这些帮助我们确保自己的 SQL 与现代 MySQL 最佳实践一致、受支持和兼容。 Lint 结果也会在 skeema push
和 skeema pull
命令执行期间显示。
更多的选项
Skeema 命令有几个共享标志,可让我们自定义操作。 以下是一些最重要的:
- ignore-table – 指定要从同步中排除的表名列表。 这些表不会被推送到远程主机或从中拉出。 该标志支持正则表达式语法。
- ignore-trigger – 忽略表但应用于触发器。
- temp-schema – 要在数据库主机上创建的临时模式的名称。 Skeema 使用此数据库作为推/拉操作期间中间更改的中转站。 操作完成后会自动删除。
- workspace – 控制创建临时模式的位置。 默认是使用远程主机,但支持 docker 作为替代值。 这将在您的本地机器上为每个 Skeema 操作创建一个新的 MySQL Docker 容器。 只有安装了 Docker,它才会起作用。
-
connect-options – 在远程数据库连接上设置的以逗号分隔的 MySQL 选项列表,例如
sql_mode='ALLOW_INVALID_DATES',innodb_lock_wait_timeout=1
。
这些选项可让我们更好地控制 Skeema 的运行。 它们让我们设置数据库连接以与应用程序的 MySQL 配置完全匹配。
总结
Skeema 通过提供自动化和与 CI/CD 部署管道的兼容性来消除数据库迁移的痛苦。 它结合了内置的 SQL linter、diff 工具和同步机制。
高级版本增加了额外的功能,包括使用视图和触发器的能力。 Skeema Premium 是建立在开源 Skeema Community 核心之上的商业产品。 还支持 Windows 系统。
采用 Skeema 可以让我们更轻松地与自己的团队共享数据库架构更改,从而使我们的所有环境保持同步。 与手动共享 ALTER TABLE
语句相比,这是一个更安全的选择,这些语句可能会放错地方并且不会创建当前模式的规范表示。
相关文章
使用 Mysqldump 备份 MySQL 中的数据
发布时间:2023/05/09 浏览次数:192 分类:MySQL
-
本篇文章将介绍如何使用 mysqldump 只备份数据。 在这里,我们将探讨 --no-create-info 、--compact 、--skip-triggers 和 --no-create-db 选项。
更新 MySQL 表中的主键
发布时间:2023/05/09 浏览次数:61 分类:MySQL
-
本篇文章介绍如何更新 MySQL 表中的主键。 我们将使用 ALTER 命令对主键进行任何更改。更新 MySQL 表中的主键 我们可以在多种情况下更新 MySQL 表中的主键。
在 MySQL 中获取命令历史记录
发布时间:2023/05/09 浏览次数:150 分类:MySQL
-
本文重点介绍了在 Windows 和 Linux 中获取我们已执行的 MySQL 命令历史记录的各种方法。MySQL命令历史
Oracle 的 decode 函数在 MySQL 中的等价物
发布时间:2023/05/09 浏览次数:115 分类:MySQL
-
本篇文章介绍了三种替代实现,我们可以将它们用作 MySQL 中 Oracle 的 decode() 函数的等价物。 为此,我们将使用 IF()、CASE 以及 FIELD() 和 ELT() 的组合。
使用 Ubuntu 连接远程 MySQL 服务器的不同方法
发布时间:2023/05/09 浏览次数:97 分类:MySQL
-
在本文中我们将学习如何使用 Ubuntu 连接远程 MySQL 服务器来操作数据以及启动和停止 MySQL 服务器。
在 Linux 中安装 MySQL 客户端
发布时间:2023/05/09 浏览次数:72 分类:MySQL
-
在 Linux 中安装 MySQL 客户端的命令。Linux 和 Unix 等环境作为命令行界面工作,仅在命令的帮助下运行。
在 MySQL 中转换为十进制
发布时间:2023/05/09 浏览次数:150 分类:MySQL
-
有时,我们可能需要将一种数据类型转换为另一种数据类型。 下面是我们如何使用带有 DECIMAL(M,D) 的 CAST() 和 CONVERT() 函数在 MySQL 中转换为十进制。
在 MySQL 中获取当前日期和时间
发布时间:2023/05/09 浏览次数:145 分类:MySQL
-
本篇文章我们将学习 NOW()、CURRENT_TIMESTAMP()(也写为 CURRENT_TIMESTAMP)和 SYSDATE() 来获取 MySQL 中的当前日期和时间。 我们还将看到这三个功能之间的比较。在 MySQL 中获取当前日期和时间
更改 MySQL 服务器中的 max_allowed_packet Size
发布时间:2023/05/09 浏览次数:142 分类:MySQL
-
本篇文章介绍如何更改 MySQL 服务器中的 max_allowed_packet 大小。 为了了解这一点,我们将使用两个操作系统,Windows 10 和 Linux (Ubuntu)。