如何删除数据库中最后执行的Liquibase changeset且避免数据不一致?
问题结论
首先明确:仅在该changeset尚未同步到共享测试/生产环境、仅在本地或小范围开发环境执行过的前提下,删除DATABASECHANGELOG对应记录+手动回滚数据库变更的操作不会导致数据不一致,是开发阶段调整错误changeset的常规操作。
操作前提验证
如果满足以下所有条件,可以按你的计划执行:
- 该changeset仅在你本地开发数据库执行,未推送至团队共享的测试、预发、生产环境
- 未将包含该错误changeset的代码提交至公共代码仓库,或即使提交也没有其他同事拉取执行过
正确操作步骤
- 手动执行SQL删除目标列:
ALTER TABLE METER_DATA DROP COLUMN PAYLOAD_SIZE;
- 匹配ID和作者删除DATABASECHANGELOG对应记录,避免误删其他同ID的变更记录:
DELETE FROM DATABASECHANGELOG WHERE ID = 'ADD_PAYLOADSIZE' AND AUTHOR = '你的原changeset作者名';
- 修改原changeset内容为你需要的逻辑,原changeset参考如下:
<changeSet author="*****" id="ADD_PAYLOADSIZE"> <addColumn tableName="METER_DATA"> <column name="PAYLOAD_SIZE" type="BIGINT" defaultValue="0"></column> </addColumn> </changeSet>
- 重新执行
liquibase update验证修改后的changeset能正常执行,表结构符合预期
注意事项
- 如果该changeset已经同步到了共享环境,禁止用该方案,必须新增回滚changeset或者通过liquibase rollback命令操作,否则会导致多环境changelog记录不一致,后续更新报错
- 操作前建议对METER_DATA、DATABASECHANGELOG表做临时备份,避免误删数据
- 若代码已提交公共仓库,需同步所有相关开发人员执行同样的本地调整,避免后续执行冲突
内容的提问来源于stack exchange,提问作者Ashwini Raghu
相关产品推荐
相关产品推荐

