我们使用Flyway迁移数据库模式,我们已经有超过100个迁移脚本。
一旦我们将多个迁移“压缩”到单个第一版迁移中,这在开发期间就可以了,因为我们删除并重新创建模式。但是在生产中这不起作用,因为Flyway无法验证迁移。
在这种情况下,我找不到任何文档或最佳做法。问题是文件数量不断增加,我不希望每次都看到数千个迁移文件,基本上如果生产已经是最新版本。我的意思是,版本号低于生产版本的迁移脚本与我们无关,如果我们可以将这些文件压缩到单个迁移中,那将是非常棒的。
我们正在使用MySQL。
我们该如何处理?
这不是重新基线会做什么的吗?
我还是飞路新手,但这就是我认为它会起作用的方式。在接受我的说法之前,请先测试以下内容。
删除schema_version表。删除迁移脚本。
运行flyway基线(这会重新创建schema_version表并将基线记录添加为版本1)
现在你很高兴。请记住,由于您已删除所有迁移脚本,因此无法“迁移”到任何先前版本,但这对您来说可能不是问题。
一步一步的解决方案:
drop table schema_version;
V1__Baseline.sql
V1__Baseline.sql
添加到您的脚本文件夹中,因此它是Flyway唯一可用的脚本我们这样做是为了允许我们压缩脚本以在开发环境中构建新数据库,但也可以针对现有生产数据库运行,而无需登录和删除flyway_version_history表,我们可以保留脚本(主要用于参考):
将所有脚本压缩到新脚本,例如V1到V42成新的脚本V43。通过在末尾添加.txt将V1转换为V42到文本文件。
将基线设置为43.设置flyway以忽略缺少的迁移。
在脚本V43中,使用“if”块来保护create / insert语句,以便它们不会针对现有生产数据库运行。我们使用postgres所以它是这样的:
DO $$
DECLARE
flywayVersion INTEGER;
BEGIN
SELECT coalesce(max(installed_rank), 0) INTO flywayVersion FROM flyway_schema_history;
RAISE NOTICE 'flywayVersion = %', flywayVersion;
IF flywayVersion = 0 THEN
RAISE NOTICE 'Creating the DB from scratch';
CREATE TABLE...
.....
END IF;
END$$;
flyway命令看起来像这样:
Flyway.configure()
.dataSource(...)
.baselineVersion("43")
.ignoreMissingMigrations(true)
.load()
.migrate()
我没有尝试过这个,但如果删除了所有迁移,创建一个新的迁移,创建新的起点作为版本1,将其设置为基线版本 - 然后修改配置以使用不同的表(例如, flyway_schema_history_2
)?
在现有数据库中,Flyway将看到您具有非空模式,没有(已识别的)flyway表并忽略基线迁移。在新环境中,它也将运行基线迁移。
我错过了什么吗?
(当然另一个问题是如何生成“压缩”迁移。如果您不需要任何种子数据,您可以只进行数据库的模式备份并使用它。如果您的迁移也填充数据,那么您可能会必须手动完成。)