jenkins 移液器故障时Liquibase更新

pw136qt2  于 2022-11-01  发布在  Jenkins
关注(0)|答案(1)|浏览(173)

我正在使用CI CD管道部署liquibase脚本。在某些情况下,liquibase变更集事务可能会花费很长时间,并且在此期间pod可能会停止运行。例如,变更集将新的非空列添加到已包含一百万条记录的现有表中。默认值将添加到表的现有行中。我想知道当pod在几行更新为默认值后关闭时会发生什么。

ddhy6vgd

ddhy6vgd1#

答案在一定程度上取决于您的数据库,以及它实际上是被杀死的。liquibase尝试做的是:
首先,将databasechangeloglock表更新为“已锁定”并提交它
然后,对于每个***变更集***
1.启动事务
1.执行changeSet中的每个更改,执行所需的SQL语句
1.在databasechangelog表中将变更集标记为已运行
1.提交事务处理
最后,将databasechangeloglock表更新为“unlocked”并提交它。
如果分离舱在这个过程中被随机杀死,其影响将取决于它被杀死的确切位置和发生了什么。
时间百分比在上面的#2中,所以这很可能是它被杀死的地方。因为我们试图在一个事务中运行,当连接被切断时,数据库应该自动回滚事务。***但是:***一些语句是自动提交的,可能会把它搞砸,让事情只做了一部分。
如果您的变更集正在更新所有行,而pod在此期间被终止,则大多数数据库可以回滚该更新,不会更新任何行,下次运行liquibase时,它会知道变更集尚未运行,并将重试更新。
如果您有一个添加列并更新行的变更集,并且在更新过程中被终止,则大多数数据库都已提交“添加列”,因此回滚只会撤消值的更新。而且,由于该变更集未标记为已运行,因此下一次更新将尝试再次运行它,并将失败,并出现“列已存在”异常。
因此,最好每个changeSet都有一个更改,除非它们都可以在一个事务中运行。
如果在该过程中的其他任何地方失败,则仍然是相同的“数据库将回滚当前事务,因此这取决于当前事务中发生了什么”。
无论它在changeSet中的哪个位置失败,您都将遇到“解锁databasechangeloglock表”步骤未运行的问题。下一次liquibase运行将阻塞,直到它被解锁。对于托管CICD系统,基础架构可以比liquibase在“确保只有一个版本的liquibase正在运行”方面做得更好。所以你可以添加一个“liquibase解锁”作为你的吊舱安全的第一步。

相关问题