【问题标题】:How to check if a MySQL schema was changed如何检查 MySQL 模式是否已更改
【发布时间】:2022-01-28 22:14:09
【问题描述】:

假设我想检查 MySQL 数据库中定义的架构是否等于代码中定义的架构 - 确保两者之间没有区别的业务需求。

我可以通过查询 information_schema 表来进行比较。但是,在某些情况下,某些对象的返回方式与我创建它们的方式不同。数据库以不同的方式表示它们。

有没有办法在数据库上做比较或者使用MySQL的内部函数?

【问题讨论】:

  • 一种蛮力方法是让进行更改的开发人员在每次更改后手动返回架构,并使用返回的版本而不是创建版本更新检查它的其他代码。如果他们忘记了,那么你会得到一个不匹配并且知道有问题。

标签: mysql sql


【解决方案1】:

正式地,您正在使用表达式的“自然形式”(您键入的形式)创建索引,而 MariaDB 的引擎正在返回它的“规范形式”。比较它们是否相等的唯一方法是生成并存储索引的规范形式。

我使用的技巧是运行整个 SQL 脚本并在单独的数据库(或模式)中创建模式。然后您可以检索和存储它的规范形式。获得规范形式后,您可以使用它来确定地与 TEST、STAGING、QA、UAT 和 PROD 模式进行比较。

只需一点点编码,您就可以自动执行该过程,并且整个事情都可以在瞬间完成。请记住,当您部署新版本的代码时,您可能需要一次又一次地这样做。

现在,您需要确保在与目标引擎版本相同的 MariaDB 引擎中运行此并行进程,以确保所有引擎都生成完全相同的表单。

说了这么多,我开发了一个名为“Sentinel”的库,它比较整个模式并在运行时提供差异。这样,它就会对 DEV 数据库进行快照,在启动期间检查 TEST 和 PROD 数据库,并报告日志中的任何差异。我最近才在 Oracle、DB2 和 PostgreSQL 中测试过它,所以我不记得它在 MariaDB 中的表现如何(据说是支持的)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
相关资源
最近更新 更多