内容更新于9月2025
核心要点
• 基于状态的部署会将当前数据库状态与目标状态进行对比,便于检测偏差并快速生成脚本。
• 基于迁移的部署采用增量式、带版本的变更,可提升协作性、可追溯性及与DevOps的契合度。
• 选择哪种方式取决于你的目标——速度与简洁性,还是控制力与长期可靠性。
• 正确的方法可确保发布更顺畅、数据质量更高,并优化数据库变更管理。
当你的流程涉及数据库时,保持其更新对于支撑应用、团队及数据流至关重要。管理数据库变更主要有两种策略:
• 基于状态:将当前数据库状态与定义的目标状态进行对比,然后识别所需变更
• 基于迁移:应用一系列特定的增量式变更,每项变更都有明确的定义和跟踪
选择合适的数据库变更管理方法并非偏好问题,而是要找到最适合你需求的方案。
基于状态的部署提供了一种快速、直接的变更脚本生成方式,有助于分析及检测环境间的偏差。不过,由于其简洁性,作为主要变更管理方法的可靠性较低。基于迁移的部署需要投入更多精力进行创建、测试和部署,但它与DevOps实践相契合,能为你提供控制力、灵活性、协作性及可追溯性,所有这些都能保障数据质量与完整性。对于大多数团队而言,基于迁移的部署是管理持续变更的最佳选择。
基于迁移的方法是高效数据库变更管理的基础。通过将架构与数据变更打包为小型、协作式的增量更新,它们支撑数据库DevOps工作流。这些变更也可作为工件,便于通过CI/CD流程进行测试和部署。
换句话说,现在不再是在基于状态或基于迁移的部署之间做选择,两者都有其作用。要理解它们如何协同,让我们详细回顾每种方法。

什么是基于状态的数据库部署?
基于状态的方法侧重于对比与同步。你从目标状态开始,使用工具将其与当前数据库对比,然后生成脚本使数据库符合你的目标。

数据库管理员青睐这种方法,因为它让他们能密切审查和管理所有变更。从技术上讲,基于状态的部署仍然是迁移——它们会更新架构以匹配你的预期设计。
主要差异:关乎快照
基于状态的部署旨在达到特定的目标状态。该过程通常包括:
• 捕获当前数据库状态
• 定义所需的目标状态,包括结构和数据配置
• 将当前状态与目标状态对比
• 生成使当前状态与目标状态对齐所需的变更
主要目标是确保数据库匹配定义的终点,最大限度减少不一致性。这种方法提供了高层概览,支持广泛规划。
基于状态的部署的挑战
虽然基于状态的部署能快速识别所需变更,但它们需要大量监督。工具必须推断用户意图,因此与基于迁移的脚本相比,审查通常更长。管理数据变更通常需要额外步骤,这可能会重复工作。基于状态的部署不太适合DevOps工作流中常见的频繁小型更新。
在多环境下,协作也变得更困难,因为团队成员可能基于不同的快照工作。这可能导致不一致,使同步变得困难。
最大的问题是可重复性。每个从差异生成的脚本都是唯一的,难以跟踪变更并确保数据质量。需要手动审查以避免错误,这会减慢速度。
例如,如果开发者重命名了列,基于状态的工具可能会将其解释为删除列并创建新列,除非有人干预,否则会有数据丢失的风险。相比之下,基于迁移的脚本可以显式重命名列,保留数据并减少手动工作量。
另一个挑战出现在回滚时。如果你需要撤销有问题的变更,基于状态的方法会提出难题:
• 你将使用哪个数据库快照来撤销变更?
• 如何确认你有正确的快照?
• 回滚脚本是否会预先生成,增加更多不确定性?
• 这些回滚脚本需要哪些测试?
• 回滚是简单地撤销所有变更,还是可以选择特定变更?
没有清晰的可追溯性,使用基于状态的方法进行回滚既危险又复杂。
什么是基于迁移的数据库部署?
基于迁移的部署侧重于遵循清晰的分步流程。这种方法吸引开发者,因为它让他们能在编码时捕获单个变更脚本。它使数据库变更管理更贴近应用代码的管理方式,实现更快的反馈和更精简的部署。
以迁移为核心的工具使自定义脚本变得更容易,让团队能更精准地控制发生的内容和时间。

基于迁移的部署以小型、可控的步骤交付变更。每个脚本详细说明特定更新,按设定顺序应用。你不是从差异生成一个大脚本,而是构建一系列清晰的增量变更。
这种方法提高了开发者的生产力并支持自动化。团队可以部署变更而无需等待手动审查,他们受益于成熟的DevOps实践:
• 频繁的小型更新
• 所有代码的一致流程
• 更快的反馈周期
• 对功能的细粒度控制
• 改进的测试
主要差异:关乎分步流程
基于迁移的部署侧重于一系列增量更新。该过程包括:
• 开发者为每个变更创建脚本,详细捕获每项更新
• 像管理应用代码一样通过版本控制管理这些脚本
• 与CI/CD流程集成以进行可靠的测试和验证
这种序列提供了更多灵活性和更好的跟踪。每次更新都有文档记录并经过审查,便于根据需要进行测试和回滚。结果是部署失败的风险更低。
基于迁移的部署的挑战
管理大量变更脚本可能很复杂。需要仔细组织以避免冲突和错误,尤其是随着脚本数量的增长。不过,将迁移脚本作为工件——就像应用代码一样——可提升控制力、一致性和效率。
工件与自动化:最大化两种方法的优势
Liquibase通过将基于迁移的部署转变为基于工件的流程,推进了数据库变更管理。
通过这种方法,每个变更脚本(变更集)都被视为一等工件。变更集被分组为变更日志,它们经过版本控制、测试,并以与应用二进制文件相同的严格程度部署。这让团队能完全采用“一次构建,多次部署”的方法。

通过将迁移脚本作为变更集进行管理,你能获得更好的控制力和一致性。每个变更集都被跟踪,允许精确回滚、自动化验证和改进协作。这确保每项变更都可见、可追溯,并准备好集成到CI/CD工作流中。
每个阶段的最佳方法
基于状态的方法易于设置,适用于分析和偏差检测。不过,在快速发展的CI/CD环境中,基于迁移的部署提供了持续变更所需的控制力、可靠性和可维护性。通过在你的CI/CD流程(数据库CI/CD)中处理迁移脚本作为代码,你能确保平稳、可预测的数据库架构变更。

按流程阶段划分的技术总结
基于状态的部署最适合:
开发阶段
• 数据库分析
• 脚本生成
测试阶段
• 偏差检测
• 环境重置
生产阶段
• 偏差检测
基于迁移的部署最适合:
开发阶段
• 脚本整理与参数化
• 脚本测试
• 合并贡献
测试阶段
• 脚本测试
• 脚本优化
• 部署预演
生产阶段
• 部署
对于主要变更管理,基于迁移的变更为团队提供了加速流程所需的细粒度、可追溯性和可靠性。
合适的工具
作为全面的数据库DevOps平台,Liquibase采用以迁移为驱动的架构管理方法。通过将部署脚本提前到流程中,开发者能更好地控制变更的实施方式。迁移脚本会提前测试以获得快速反馈。Liquibase的工具和集成确保迁移与应用代码一起被版本控制,支持源和架构管理。CI和CD可通过预构建任务设置,使用迁移来构建和部署数据库架构。
基于迁移的变更支持Liquibase的高级功能,包括:
• 变更创建
• 版本控制
• 策略检查用于自动化测试和策略执行
• 结构化日志
• 跟踪和可观测性
Liquibase还利用基于状态的变更推导用于:
• 偏差检测
• 偏差警报
• 差异(对比)
• 环境重置(测试)
如需了解何时使用基于迁移和基于状态的变更以降低风险、加快交付并提升流程质量的专家讨论,请观看网络研讨会。它包含Liquibase中两种方法的现场演示。

常见问题
什么是基于状态的数据库部署?
答:基于状态的部署将当前数据库与定义的目标状态对比,并生成脚本使它们匹配。
什么是基于迁移的数据库部署?
答:基于迁移的部署应用增量式、带版本的变更,以可控方式演进数据库架构。
哪种方法更适合DevOps?
答:基于迁移的部署与DevOps实践更契合,因为它提供可追溯性、协作性和版本控制。
我可以同时使用基于状态和基于迁移的方法吗?
答:可以。许多团队使用基于状态的部署进行分析或偏差检测,使用基于迁移的部署进行生产变更。
我如何决定使用哪种部署方法?
答:如果你需要速度和简洁性,基于状态的方法效果很好。对于可靠性、治理和长期可扩展性,基于迁移的方法通常是最佳选择。