前几天,我们的 jenkins 工作失败了,我们的 flyway 迁移又回来了。当我们查看数据库时,我们发现脚本已被应用,但没有在脚本的“schema_version”表中创建条目。我们知道这个脚本需要很长时间才能应用(修改一个大约有 7000 万行的表)并且我们使用了至少可以使更改成为非阻塞的 SQL 语法(在 mysql 上为 ALGORITHM=INPLACE)。然而,当脚本完成时,flyway 返回到 jenkins 失败,并且在这个漫长的脚本之后没有运行任何脚本。
我们通过 gradle 插件(版本 3.2.1)运行 flyway,并使用 ansible 调用 gradle 任务。 Jenkins 调用 ansible,调用 gradle,调用 flyway。不确定这是由 flyway 超时还是 ansible 引起的。不过,我们不希望在生产中再次发生这种情况。
我们的解决方法是手动将条目放入 schema_version 中,这样脚本就不会重新运行,然后重新应用迁移,以便运行之后的脚本。
我们查看了数据库,大约在同一时间出现了巧合的连接峰值,所以它可能遇到了连接限制,但我认为如果它正在运行脚本,连接就已经打开了。
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 用于元数据表的连接被基础设施的某些部分(数据库、代理等)关闭,导致 Flyway 在长时间后无法将行写入表-运行迁移完成。
关于mysql - 飞路假故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36921219/