如何在不同的环境(开发、测试、生产)中维护相同的数据表?



作为开发人员,如果我在开发数据库中进行任何更改,我必须复制脚本并在用于测试和生产的 2 个数据库上手动执行它。 有没有办法我们可以自动化它? 我正在使用java,mysql和spring mvc。 我们不允许对生产数据库进行任何更改

这是一个通常称为"数据库迁移"的功能;它被烘焙到一些开发框架中(例如Ruby on Rails(,但不是Spring MVC。

最简单的方法是使用集成到构建和部署脚本中的工具 - Flyway 很受欢迎。

原理是这样的:您将数据库更改放入脚本中,使用指示执行顺序的命名约定,然后针对您尝试更新的环境运行这些脚本。每个数据库都知道哪个是最后一个要运行的迁移脚本,因此您可以从上次中断的地方继续。

例如:

filename: 201912130980-create-table-users.sql
create table users (
id int not null, 
name string not null,
age int not null);

运行此表后,它将为您的用户创建一个新表。

filename: 201912130981-add-title-to-users.sql
alter table users add title varchar null;

这会向表中添加一个额外的列。

如果按顺序运行这两个,它们将从头开始创建数据库。如果您已经在测试中运行了"创建"脚本,但尚未运行"alter"脚本,则下次在测试中运行迁移时,它将知道不要重新运行创建脚本,并使用更改脚本。

在评论中,您说不允许在生产环境中执行表更改 - 我假设您的意思是它需要一些人工过程(例如询问DBA(。在这种情况下,您遇到了一些问题,因为"迁移"过程需要维护哪个是数据库发生的最后一次更改,这是由工具保证的。人类往往会犯错误...Flyway 通过迁移历史记录表执行此操作。

最好的选择是与您的 ops/dba 团队合作,看看您是否可以使用 Flyway 直接部署到生产环境。如果这太难,您可以创建一个"预生产"数据库并将其用作生产的镜像;将迁移应用到该环境,然后将迁移发送给生产所有者。你可以通过 Jenkins 或任何你正在使用的东西来自动化它。

您可以使用 liquibase 以编程方式实现此目的

你可以参考这里 liquibase 示例

最新更新