飞路假故障

Flyway false failure

前几天我们的 jenkins 工作失败了,我们的 flyway 迁移又回来了。当我们查看数据库时,我们发现脚本已应用,但没有在 "schema_version" table 中为脚本创建条目。我们知道这个脚本需要很长时间才能应用(修改 table 大约 7000 万行)并且我们使用 SQL 语法至少可以使更改不阻塞(ALGORITHM=INPLACE on mysql).然而,当脚本完成时,flyway 返回到 jenkins 失败并且在这么长的脚本之后没有 运行 任何脚本。

我们通过 gradle 插件(版本 3.2.1)运行ning flyway 并使用 ansible 调用 gradle 任务。 Jenkins 调用 ansible,后者调用 gradle,后者调用 flyway。不确定这是由 flyway 超时还是 ansible 引起的。不过,我们不希望在生产中再次发生这种情况。

我们的解决方法是手动将条目放入 schema_version,这样脚本就不会重新 运行,然后重新应用迁移,这样它之后的脚本就会 运行 .

我们查看了数据库,大约在同一时间出现了巧合的连接峰值,所以可能 运行 进入了连接限制,但我认为如果 [=31] 连接已经打开=]编写脚本。

jenkins 的净化输出如下:

TASK: [flyway | run flywayMigrate] ******************************************** 
<db.server> REMOTE_MODULE command gradle -b /opt/product/rc/flyway-17.5.32.37534.d2bac4a/extracted/flyway.gradle flywayMigrate
failed: [db.server] => {"failed": true, "parsed": false}
invalid output was: SUDO-SUCCESS-plqsdlxwlfkdsujlxdafldpasvtllis

这很可能是由于 Flyway 用于元数据的连接 table 被基础设施的某些部分(数据库、代理等)关闭,导致 Flyway 无法写入行在长期 运行 迁移完成后到 table。