飞路错误故障
Posted
技术标签:
【中文标题】飞路错误故障【英文标题】:Flyway false failure 【发布时间】:2016-08-23 14:30:25 【问题描述】:前几天,我们的 jenkins 工作失败了,我们进行了一次飞行迁移。当我们查看数据库时,我们发现应用了脚本,但在“schema_version”表中没有为脚本创建条目。我们知道这个脚本需要很长时间才能应用(修改一个大约有 70M 行的表),并且我们使用了 SQL 语法,至少可以使更改成为非阻塞的(mysql 上的 ALGORITHM=INPLACE)。然而,当脚本完成后,flyway 以失败返回 jenkins 并且在这个漫长的之后没有运行任何脚本。
我们通过 gradle 插件(版本 3.2.1)运行 flyway 并使用 ansible 调用 gradle 任务。 Jenkins 调用 ansible,后者调用 gradle,后者调用 flyway。不确定这是否是由于飞行路径超时或可能造成的。不过,我们不希望在生产中再次发生这种情况。
我们的解决方法是手动将条目放入 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
【问题讨论】:
MySQL 是否在启用某种日志记录的情况下运行?最有可能的类型是用于复制/增量备份的 binlog。如果是,请检查 MySQL 日志(例如,对于 binlog,请使用mysqlbinlog
实用程序转储它),并尝试了解 MySQL 在那段时间所做的事情。请注意,binlog 只会记录实际修改了某些内容的更新,因此这不会为您提供全貌,但可能会提供一些线索。
感谢您的提示。由于这只发生在我们的生产服务器上,我实际上无法访问它(为了安全而锁定)。该脚本在我可以访问的 CERT 环境中成功,所以这不好。我也许可以让某人登录到生产环境,但这非常具有挑战性,哈哈。
【参考方案1】:
这很可能是由于 Flyway 用于元数据表的连接被您的基础架构的某些部分(数据库、代理、...)关闭,导致 Flyway 在长时间后无法将行写入表-运行迁移已完成。
【讨论】:
以上是关于飞路错误故障的主要内容,如果未能解决你的问题,请参考以下文章