文章目录

  • Changelog
    • 不同格式类型的Changelog能力支持
    • 更改类型:ChangeType(由Liquibase定义的DDL语句)
    • changeSet
      • changeSet节点的属性
        • 概述
        • labels - 标签名、组名 - 有部署权限建议使用这个
        • context - 上下文 - 无部署权限的建议使用这个
        • runOnChange - 变更集changeset节点内容修改时是否重新执行
        • runAlways - 每次部署该changeset节点都会运行,不管之前是否以部署过
        • runOrder - 当前changeset节点放置在开头或者最后执行
      • changeSet的子节点
        • preConditions
          • preConditions的属性
          • preConditions所有支持的子节点查看
          • 子节点:changeSetExecuted
          • 子节点:sqlCheck
    • 最佳实践
      • changelog文件如何拆分更好的管理
        • 划分-版本号
        • 划分-功能模块
        • 划分-功能模块+功能模块结合
      • changelog太大且生产部署了多次,即将拆分重构changelog文件
        • 风险
        • 方式1 - 学会使用databaseChangeLog的logicalFilePath属性
        • 方式2 - 不管以前的changelog文件,从此时此刻前按组分规定的拆分规范进行组织changelog文件的引入
      • liquibase运行部署太慢
        • 可能原因
        • 优化
          • 优化1:删除不必要的changeset节点
          • 优化2:合并历史changset节点 - 学会使用validCheckSum节点或clear-checksums命令
      • 多模式(Schema)部署 - 即不同的数据库名

Changelog

不同格式类型的Changelog能力支持

更改类型:ChangeType(由Liquibase定义的DDL语句)

官网: https://docs.liquibase.com/change-types/home.html

作用: 其实就是Liquibase定义的节点,让其同一种语句支持种数据库的部署,如使用liquibase定义的,不使用数据库本身的DDL语句CREATE TABLE ,因为这种DDL语句可能仅适用你当前所需部署的数据库,而不支持如mongoDB这些数据库,让官方定义的内部自动转成mongodDB支持的语句

changeSet

changeSet节点的属性

概述

全部的属性节点查看官网: https://docs.liquibase.com/concepts/changelogs/changelog-formats.html

labels - 标签名、组名 - 有部署权限建议使用这个

特别注意: 复杂的匹配表达式逻辑是写在命令行参数–labels上,而changeSet节点的labels是不可以写表达式逻辑只能是 “标签名1,标签名2,标签名3” - 所以我就为什么说labels适合无部署权限的人使用


官网: https://docs.liquibase.com/concepts/changelogs/attributes/labels.html?Highlight=Labels

作用: 提供了对其变更集进行分组和分类的能力,以控制执行哪些变更集。在 Liquibase 执行期间,可以提供一个标签表达式,该表达式将充当过滤器,以精确控制将执行哪些变更集

使用0: 符合标签表达式的hangeSet节点才可以被liquibase部署运行
使用1: changeSet节点的属性labels定义当前变更节点所属于的标签名
使用2: iquibase update --labels=标签表达式 或者 liquibase update --labelFilter=标签表达式,用于说明什么标签名的结果集需要被执行。但如果–labels、–labelFilter不定义则默认全部执行,无需过滤操作

注意: --labelFilter这个参数最新的liquibase版本已经被剔除了,所以只用–labels即可

#mermaid-svg-wnM5giwMoVs17l0j {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-wnM5giwMoVs17l0j .error-icon{fill:#552222;}#mermaid-svg-wnM5giwMoVs17l0j .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wnM5giwMoVs17l0j .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-wnM5giwMoVs17l0j .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wnM5giwMoVs17l0j .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wnM5giwMoVs17l0j .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wnM5giwMoVs17l0j .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wnM5giwMoVs17l0j .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wnM5giwMoVs17l0j .marker.cross{stroke:#333333;}#mermaid-svg-wnM5giwMoVs17l0j svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wnM5giwMoVs17l0j .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-wnM5giwMoVs17l0j .cluster-label text{fill:#333;}#mermaid-svg-wnM5giwMoVs17l0j .cluster-label span{color:#333;}#mermaid-svg-wnM5giwMoVs17l0j .label text,#mermaid-svg-wnM5giwMoVs17l0j span{fill:#333;color:#333;}#mermaid-svg-wnM5giwMoVs17l0j .node rect,#mermaid-svg-wnM5giwMoVs17l0j .node circle,#mermaid-svg-wnM5giwMoVs17l0j .node ellipse,#mermaid-svg-wnM5giwMoVs17l0j .node polygon,#mermaid-svg-wnM5giwMoVs17l0j .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wnM5giwMoVs17l0j .node .label{text-align:center;}#mermaid-svg-wnM5giwMoVs17l0j .node.clickable{cursor:pointer;}#mermaid-svg-wnM5giwMoVs17l0j .arrowheadPath{fill:#333333;}#mermaid-svg-wnM5giwMoVs17l0j .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wnM5giwMoVs17l0j .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wnM5giwMoVs17l0j .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-wnM5giwMoVs17l0j .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-wnM5giwMoVs17l0j .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wnM5giwMoVs17l0j .cluster text{fill:#333;}#mermaid-svg-wnM5giwMoVs17l0j .cluster span{color:#333;}#mermaid-svg-wnM5giwMoVs17l0j div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wnM5giwMoVs17l0j :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

标签表达式逻辑语句
and
or或者逗号,
!或者not:否定,经测试linux好像用不了感叹号,一直报错,所以使用not即可
():分组,用于复杂的逻辑语句
#mermaid-svg-qITbzoDgoJHuhYCf {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qITbzoDgoJHuhYCf .error-icon{fill:#552222;}#mermaid-svg-qITbzoDgoJHuhYCf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qITbzoDgoJHuhYCf .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-qITbzoDgoJHuhYCf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qITbzoDgoJHuhYCf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qITbzoDgoJHuhYCf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qITbzoDgoJHuhYCf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qITbzoDgoJHuhYCf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qITbzoDgoJHuhYCf .marker.cross{stroke:#333333;}#mermaid-svg-qITbzoDgoJHuhYCf svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qITbzoDgoJHuhYCf .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-qITbzoDgoJHuhYCf .cluster-label text{fill:#333;}#mermaid-svg-qITbzoDgoJHuhYCf .cluster-label span{color:#333;}#mermaid-svg-qITbzoDgoJHuhYCf .label text,#mermaid-svg-qITbzoDgoJHuhYCf span{fill:#333;color:#333;}#mermaid-svg-qITbzoDgoJHuhYCf .node rect,#mermaid-svg-qITbzoDgoJHuhYCf .node circle,#mermaid-svg-qITbzoDgoJHuhYCf .node ellipse,#mermaid-svg-qITbzoDgoJHuhYCf .node polygon,#mermaid-svg-qITbzoDgoJHuhYCf .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qITbzoDgoJHuhYCf .node .label{text-align:center;}#mermaid-svg-qITbzoDgoJHuhYCf .node.clickable{cursor:pointer;}#mermaid-svg-qITbzoDgoJHuhYCf .arrowheadPath{fill:#333333;}#mermaid-svg-qITbzoDgoJHuhYCf .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qITbzoDgoJHuhYCf .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qITbzoDgoJHuhYCf .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-qITbzoDgoJHuhYCf .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-qITbzoDgoJHuhYCf .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qITbzoDgoJHuhYCf .cluster text{fill:#333;}#mermaid-svg-qITbzoDgoJHuhYCf .cluster span{color:#333;}#mermaid-svg-qITbzoDgoJHuhYCf div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qITbzoDgoJHuhYCf :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

标签表达式案例
not v1:不执行标签名为v1的changeSet节点
v1,v2 and v3 等价于 v1 or (v2 and v3)
//帮助文档
liquibase update --help//符合的标签才进行部署的数据库中
liquibase update --label="标签表达式"//最新版本--labelFilter已经不支持,不要使用
liquibase update --labelFilter="标签表达式"

讲解

<!--这个变更节点有两个标签名即20220713以及v1-->
<changeSet id="2" author="LinRuChang" labels="20220713,v1" ><comment>创建表user_20220713_v1</comment><sql>CREATE TABLE `user_20220713_v1`(`id`          char(32) CHARACTER SET utf8 COLLATE utf8_bin        NOT NULL COMMENT '主键',`name`        varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '角色名',PRIMARY KEY (`id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='liquibase测试表'</sql><rollback><comment>删除表</comment><dropTable tableName="user_20220713_v1"></dropTable></rollback></changeSet>

过滤节点讲解

# 仅部署执行 标签名【同时是v1和20220713的changeset节点】或者 【标签名不是v1的节点】或者 【没有设置labels属性的changeset节点】
liquibase update --labels="(v1 and 20220713) or (not v1)"


context - 上下文 - 无部署权限的建议使用这个

特别注意: 复杂的匹配表达式逻辑是写在changeSet节点的context属性上的,而命令行参数–labels上是不可以写表达式逻辑只能是 “上下文名1,上下文名2,上下文名3” 这种值格式 - 所以我就为什么说context适合有部署权限的人使用


官网: https://docs.liquibase.com/concepts/changelogs/attributes/contexts.html

作用: 提供了对其变更集进行分组和分类的能力,以控制执行哪些变更集。在 Liquibase 执行期间,可以提供一个上下文表达式,该表达式将充当过滤器,以精确控制将执行哪些变更集

使用0: 符合上下文表达式的hangeSet节点才可以被liquibase部署运行
使用1: changeSet节点的属性context定义当前变更节点所属于的上下文名
使用2: iquibase update --contexts=“上下文名1,上下文名2,上下文名3” ,用于说明什么上下文名的结果集需要被执行。但如果–contexts不定义则默认全部执行,无需过滤操作

#mermaid-svg-z6by3sShG1tkgBWu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-z6by3sShG1tkgBWu .error-icon{fill:#552222;}#mermaid-svg-z6by3sShG1tkgBWu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-z6by3sShG1tkgBWu .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-z6by3sShG1tkgBWu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-z6by3sShG1tkgBWu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-z6by3sShG1tkgBWu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-z6by3sShG1tkgBWu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-z6by3sShG1tkgBWu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-z6by3sShG1tkgBWu .marker.cross{stroke:#333333;}#mermaid-svg-z6by3sShG1tkgBWu svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-z6by3sShG1tkgBWu .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-z6by3sShG1tkgBWu .cluster-label text{fill:#333;}#mermaid-svg-z6by3sShG1tkgBWu .cluster-label span{color:#333;}#mermaid-svg-z6by3sShG1tkgBWu .label text,#mermaid-svg-z6by3sShG1tkgBWu span{fill:#333;color:#333;}#mermaid-svg-z6by3sShG1tkgBWu .node rect,#mermaid-svg-z6by3sShG1tkgBWu .node circle,#mermaid-svg-z6by3sShG1tkgBWu .node ellipse,#mermaid-svg-z6by3sShG1tkgBWu .node polygon,#mermaid-svg-z6by3sShG1tkgBWu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-z6by3sShG1tkgBWu .node .label{text-align:center;}#mermaid-svg-z6by3sShG1tkgBWu .node.clickable{cursor:pointer;}#mermaid-svg-z6by3sShG1tkgBWu .arrowheadPath{fill:#333333;}#mermaid-svg-z6by3sShG1tkgBWu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-z6by3sShG1tkgBWu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-z6by3sShG1tkgBWu .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-z6by3sShG1tkgBWu .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-z6by3sShG1tkgBWu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-z6by3sShG1tkgBWu .cluster text{fill:#333;}#mermaid-svg-z6by3sShG1tkgBWu .cluster span{color:#333;}#mermaid-svg-z6by3sShG1tkgBWu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-z6by3sShG1tkgBWu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

上下文属性表达式逻辑语句
and
or或者逗号,
!或者not:否定,经测试linux好像用不了感叹号,一直报错,所以使用not即可
():分组,用于复杂的逻辑语句
#mermaid-svg-FgVtjiIplneUTuOZ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FgVtjiIplneUTuOZ .error-icon{fill:#552222;}#mermaid-svg-FgVtjiIplneUTuOZ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FgVtjiIplneUTuOZ .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-FgVtjiIplneUTuOZ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FgVtjiIplneUTuOZ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FgVtjiIplneUTuOZ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FgVtjiIplneUTuOZ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FgVtjiIplneUTuOZ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FgVtjiIplneUTuOZ .marker.cross{stroke:#333333;}#mermaid-svg-FgVtjiIplneUTuOZ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FgVtjiIplneUTuOZ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-FgVtjiIplneUTuOZ .cluster-label text{fill:#333;}#mermaid-svg-FgVtjiIplneUTuOZ .cluster-label span{color:#333;}#mermaid-svg-FgVtjiIplneUTuOZ .label text,#mermaid-svg-FgVtjiIplneUTuOZ span{fill:#333;color:#333;}#mermaid-svg-FgVtjiIplneUTuOZ .node rect,#mermaid-svg-FgVtjiIplneUTuOZ .node circle,#mermaid-svg-FgVtjiIplneUTuOZ .node ellipse,#mermaid-svg-FgVtjiIplneUTuOZ .node polygon,#mermaid-svg-FgVtjiIplneUTuOZ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-FgVtjiIplneUTuOZ .node .label{text-align:center;}#mermaid-svg-FgVtjiIplneUTuOZ .node.clickable{cursor:pointer;}#mermaid-svg-FgVtjiIplneUTuOZ .arrowheadPath{fill:#333333;}#mermaid-svg-FgVtjiIplneUTuOZ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-FgVtjiIplneUTuOZ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-FgVtjiIplneUTuOZ .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-FgVtjiIplneUTuOZ .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-FgVtjiIplneUTuOZ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-FgVtjiIplneUTuOZ .cluster text{fill:#333;}#mermaid-svg-FgVtjiIplneUTuOZ .cluster span{color:#333;}#mermaid-svg-FgVtjiIplneUTuOZ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-FgVtjiIplneUTuOZ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

上下文属性表达式案例
not v1:不执行标签名为v1的changeSet节点
v1,v2 and v3 等价于 v1 or (v2 and v3)
//帮助文档
liquibase update --help//符合的标签才进行部署的数据库中
liquibase update --contexts="上下文名1,上下名2"

讲解

    <!--输入的命令行参数context,同时有v2  v2lrc  20220713三个名字,则会执行--><changeSet id="3" author="LinRuChang" context="20220713 and v2 and v2lrc" ><comment>创建表user_20220713_v2_v2lrc</comment><sql>CREATE TABLE `user_20220713_v2_v2lrc`(`id`          char(32) CHARACTER SET utf8 COLLATE utf8_bin        NOT NULL COMMENT '主键',`name`        varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '角色名',PRIMARY KEY (`id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='liquibase测试表'</sql><rollback><comment>删除表</comment><dropTable tableName="user_20220713_v2_v2lrc"></dropTable></rollback></changeSet><!--输入的命令行参数context,无v2名字,则会执行--><changeSet id="5" author="LinRuChang" context="not v2" ><comment>创建表user_20220713_not_v2</comment><sql>CREATE TABLE `user_20220713_not_v2`(   `id`          char(32) CHARACTER SET utf8 COLLATE utf8_bin        NOT NULL COMMENT '主键',`name`        varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '角色名',PRIMARY KEY (`id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='liquibase测试表' </sql><rollback><comment>删除表</comment><dropTable tableName="user_20220713_not_v2"></dropTable></rollback></changeSet><!--输入的命令行参数context,有v2或v2lrc或20220713名字,则会执行--><changeSet id="4" author="LinRuChang" context="20220713 or v2 or v2lrc" ><comment>创建表user_20220713_v2_v2lrc_or</comment><sql>CREATE TABLE `user_20220713_v2_v2lrc`(   `id`          char(32) CHARACTER SET utf8 COLLATE utf8_bin        NOT NULL COMMENT '主键',`name`        varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '角色名',PRIMARY KEY (`id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='liquibase测试表' </sql><rollback><comment>删除表</comment><dropTable tableName="user_20220713_v2_v2lrc"></dropTable></rollback></changeSet>

过滤节点讲解

# 仅部署执行 上下文名是20220713或v1的以及没有定义context属性的changeset节点
liquibase update-sql --contexts="20220713,v1"

runOnChange - 变更集changeset节点内容修改时是否重新执行

官网: https://docs.liquibase.com/concepts/changelogs/attributes/runonchange.html

可能场景使用建议: 有些情况下存储过程(虽然不常用)的内容逻辑发生变更,可以定义使用该属性让其一旦内容跟发生变化则重新部署运行,而不需新起一个changeset节点部署运行

重新执行成功后: 在databasechangelog表根据ID、AUTHOR、FILENAME的值找到对应行记录修改其中的DATEEXECUTED、ORDEREXECUTED、EXECTYPE、MD5SUM、DEPLOYMENT_ID这几个列

#mermaid-svg-akOO1Plq3vkXoExJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-akOO1Plq3vkXoExJ .error-icon{fill:#552222;}#mermaid-svg-akOO1Plq3vkXoExJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-akOO1Plq3vkXoExJ .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-akOO1Plq3vkXoExJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-akOO1Plq3vkXoExJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-akOO1Plq3vkXoExJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-akOO1Plq3vkXoExJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-akOO1Plq3vkXoExJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-akOO1Plq3vkXoExJ .marker.cross{stroke:#333333;}#mermaid-svg-akOO1Plq3vkXoExJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-akOO1Plq3vkXoExJ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-akOO1Plq3vkXoExJ .cluster-label text{fill:#333;}#mermaid-svg-akOO1Plq3vkXoExJ .cluster-label span{color:#333;}#mermaid-svg-akOO1Plq3vkXoExJ .label text,#mermaid-svg-akOO1Plq3vkXoExJ span{fill:#333;color:#333;}#mermaid-svg-akOO1Plq3vkXoExJ .node rect,#mermaid-svg-akOO1Plq3vkXoExJ .node circle,#mermaid-svg-akOO1Plq3vkXoExJ .node ellipse,#mermaid-svg-akOO1Plq3vkXoExJ .node polygon,#mermaid-svg-akOO1Plq3vkXoExJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-akOO1Plq3vkXoExJ .node .label{text-align:center;}#mermaid-svg-akOO1Plq3vkXoExJ .node.clickable{cursor:pointer;}#mermaid-svg-akOO1Plq3vkXoExJ .arrowheadPath{fill:#333333;}#mermaid-svg-akOO1Plq3vkXoExJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-akOO1Plq3vkXoExJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-akOO1Plq3vkXoExJ .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-akOO1Plq3vkXoExJ .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-akOO1Plq3vkXoExJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-akOO1Plq3vkXoExJ .cluster text{fill:#333;}#mermaid-svg-akOO1Plq3vkXoExJ .cluster span{color:#333;}#mermaid-svg-akOO1Plq3vkXoExJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-akOO1Plq3vkXoExJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

默认
runOnChange值
false:检测到当前changset的md5发生变化,则抛出异常,终止liquibase部署运行,已经部署过得changeset节点不允许内容发生变化
true:每次liquibase检测到当前changeset的内容变更即MD5发生变化,则重新部署执行当前changeset节点

runAlways - 每次部署该changeset节点都会运行,不管之前是否以部署过

官网: https://docs.liquibase.com/concepts/changelogs/changelog-formats.html?Highlight=runAlways

注意: 如果你需要每次部署的执行,且该changeset的部署内容会发生变更,请将runAlways、runOnChange都设置为true,否则一旦你内容变化,则会导致当前changset内容md5跟之前部署不一致,导致后续的liquibse节点部署失败

#mermaid-svg-VEwsZ2V0VasFyWvL {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-VEwsZ2V0VasFyWvL .error-icon{fill:#552222;}#mermaid-svg-VEwsZ2V0VasFyWvL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-VEwsZ2V0VasFyWvL .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-VEwsZ2V0VasFyWvL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-VEwsZ2V0VasFyWvL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-VEwsZ2V0VasFyWvL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-VEwsZ2V0VasFyWvL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-VEwsZ2V0VasFyWvL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-VEwsZ2V0VasFyWvL .marker.cross{stroke:#333333;}#mermaid-svg-VEwsZ2V0VasFyWvL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-VEwsZ2V0VasFyWvL .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-VEwsZ2V0VasFyWvL .cluster-label text{fill:#333;}#mermaid-svg-VEwsZ2V0VasFyWvL .cluster-label span{color:#333;}#mermaid-svg-VEwsZ2V0VasFyWvL .label text,#mermaid-svg-VEwsZ2V0VasFyWvL span{fill:#333;color:#333;}#mermaid-svg-VEwsZ2V0VasFyWvL .node rect,#mermaid-svg-VEwsZ2V0VasFyWvL .node circle,#mermaid-svg-VEwsZ2V0VasFyWvL .node ellipse,#mermaid-svg-VEwsZ2V0VasFyWvL .node polygon,#mermaid-svg-VEwsZ2V0VasFyWvL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-VEwsZ2V0VasFyWvL .node .label{text-align:center;}#mermaid-svg-VEwsZ2V0VasFyWvL .node.clickable{cursor:pointer;}#mermaid-svg-VEwsZ2V0VasFyWvL .arrowheadPath{fill:#333333;}#mermaid-svg-VEwsZ2V0VasFyWvL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-VEwsZ2V0VasFyWvL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-VEwsZ2V0VasFyWvL .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-VEwsZ2V0VasFyWvL .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-VEwsZ2V0VasFyWvL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-VEwsZ2V0VasFyWvL .cluster text{fill:#333;}#mermaid-svg-VEwsZ2V0VasFyWvL .cluster span{color:#333;}#mermaid-svg-VEwsZ2V0VasFyWvL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-VEwsZ2V0VasFyWvL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

默认
runAlways值
false:如果之前有部署过即databasechangelog找到执行记录,则不会在执行该节点的部署内容
true:每次部署必执行,不管之前有没部署过

runOrder - 当前changeset节点放置在开头或者最后执行

小知识: 官方说一般配合runAlways使用,当然不配合也是可以

#mermaid-svg-0C5ljTxcnMNz2jZ6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .error-icon{fill:#552222;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .marker.cross{stroke:#333333;}#mermaid-svg-0C5ljTxcnMNz2jZ6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .cluster-label text{fill:#333;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .cluster-label span{color:#333;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .label text,#mermaid-svg-0C5ljTxcnMNz2jZ6 span{fill:#333;color:#333;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .node rect,#mermaid-svg-0C5ljTxcnMNz2jZ6 .node circle,#mermaid-svg-0C5ljTxcnMNz2jZ6 .node ellipse,#mermaid-svg-0C5ljTxcnMNz2jZ6 .node polygon,#mermaid-svg-0C5ljTxcnMNz2jZ6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .node .label{text-align:center;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .node.clickable{cursor:pointer;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .arrowheadPath{fill:#333333;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .cluster text{fill:#333;}#mermaid-svg-0C5ljTxcnMNz2jZ6 .cluster span{color:#333;}#mermaid-svg-0C5ljTxcnMNz2jZ6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0C5ljTxcnMNz2jZ6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

默认
runAlways值
空:按当前changset在当前changelog文件的内容顺序执行
first:不管changeset内容顺序,一开始就立即执行
last:不管changeset内容顺序,放置到最后执行

changeSet的子节点

preConditions

官网: https://docs.liquibase.com/concepts/changelogs/preconditions.html

preConditions的属性
#mermaid-svg-iltrOflr02WjU0NU {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-iltrOflr02WjU0NU .error-icon{fill:#552222;}#mermaid-svg-iltrOflr02WjU0NU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-iltrOflr02WjU0NU .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-iltrOflr02WjU0NU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-iltrOflr02WjU0NU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-iltrOflr02WjU0NU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-iltrOflr02WjU0NU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-iltrOflr02WjU0NU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-iltrOflr02WjU0NU .marker.cross{stroke:#333333;}#mermaid-svg-iltrOflr02WjU0NU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-iltrOflr02WjU0NU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-iltrOflr02WjU0NU .cluster-label text{fill:#333;}#mermaid-svg-iltrOflr02WjU0NU .cluster-label span{color:#333;}#mermaid-svg-iltrOflr02WjU0NU .label text,#mermaid-svg-iltrOflr02WjU0NU span{fill:#333;color:#333;}#mermaid-svg-iltrOflr02WjU0NU .node rect,#mermaid-svg-iltrOflr02WjU0NU .node circle,#mermaid-svg-iltrOflr02WjU0NU .node ellipse,#mermaid-svg-iltrOflr02WjU0NU .node polygon,#mermaid-svg-iltrOflr02WjU0NU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-iltrOflr02WjU0NU .node .label{text-align:center;}#mermaid-svg-iltrOflr02WjU0NU .node.clickable{cursor:pointer;}#mermaid-svg-iltrOflr02WjU0NU .arrowheadPath{fill:#333333;}#mermaid-svg-iltrOflr02WjU0NU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-iltrOflr02WjU0NU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-iltrOflr02WjU0NU .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-iltrOflr02WjU0NU .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-iltrOflr02WjU0NU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-iltrOflr02WjU0NU .cluster text{fill:#333;}#mermaid-svg-iltrOflr02WjU0NU .cluster span{color:#333;}#mermaid-svg-iltrOflr02WjU0NU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-iltrOflr02WjU0NU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

preConditions属性
onFail:先决条件得到的结果是false的情况下的处理方案
onError:先决条件执行的过程中发生异常情况下的处理方案
onFailMessage:先决条件为false时的日志信息
onErrorMessage:先决条件发生异常时的日志信息
onSqlOutput:这玩意看文档没看懂是干嘛的
#mermaid-svg-K9jJbu5lHDEMNVu2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-K9jJbu5lHDEMNVu2 .error-icon{fill:#552222;}#mermaid-svg-K9jJbu5lHDEMNVu2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-K9jJbu5lHDEMNVu2 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-K9jJbu5lHDEMNVu2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-K9jJbu5lHDEMNVu2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-K9jJbu5lHDEMNVu2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-K9jJbu5lHDEMNVu2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-K9jJbu5lHDEMNVu2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-K9jJbu5lHDEMNVu2 .marker.cross{stroke:#333333;}#mermaid-svg-K9jJbu5lHDEMNVu2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-K9jJbu5lHDEMNVu2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-K9jJbu5lHDEMNVu2 .cluster-label text{fill:#333;}#mermaid-svg-K9jJbu5lHDEMNVu2 .cluster-label span{color:#333;}#mermaid-svg-K9jJbu5lHDEMNVu2 .label text,#mermaid-svg-K9jJbu5lHDEMNVu2 span{fill:#333;color:#333;}#mermaid-svg-K9jJbu5lHDEMNVu2 .node rect,#mermaid-svg-K9jJbu5lHDEMNVu2 .node circle,#mermaid-svg-K9jJbu5lHDEMNVu2 .node ellipse,#mermaid-svg-K9jJbu5lHDEMNVu2 .node polygon,#mermaid-svg-K9jJbu5lHDEMNVu2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-K9jJbu5lHDEMNVu2 .node .label{text-align:center;}#mermaid-svg-K9jJbu5lHDEMNVu2 .node.clickable{cursor:pointer;}#mermaid-svg-K9jJbu5lHDEMNVu2 .arrowheadPath{fill:#333333;}#mermaid-svg-K9jJbu5lHDEMNVu2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-K9jJbu5lHDEMNVu2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-K9jJbu5lHDEMNVu2 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-K9jJbu5lHDEMNVu2 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-K9jJbu5lHDEMNVu2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-K9jJbu5lHDEMNVu2 .cluster text{fill:#333;}#mermaid-svg-K9jJbu5lHDEMNVu2 .cluster span{color:#333;}#mermaid-svg-K9jJbu5lHDEMNVu2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-K9jJbu5lHDEMNVu2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

默认值
建议都设置成这个
onFail的属性值:校验是false的情况
HALT:暂停整个更改日志的执行,项目直接抛出异常导致项目启动失败
CONTINUE:跳过变更集。下次更新时将再次尝试执行变更集。下次启动项目会尝试继续执行该changeSet节点
MARK_RAN:跳过变更集,但将其标记为已执行,下次启动项目不在执行该changeSet节点
WARN:发送警告并继续正常执行当前变更集,即是校验失败也继续执行changeSet节点中定义的SQL语句,依然可能会导致启动失败,如创表语句必失败,但修改表结构可能不会失败
#mermaid-svg-RS2K89y65gxl9VDk {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-RS2K89y65gxl9VDk .error-icon{fill:#552222;}#mermaid-svg-RS2K89y65gxl9VDk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-RS2K89y65gxl9VDk .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-RS2K89y65gxl9VDk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-RS2K89y65gxl9VDk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-RS2K89y65gxl9VDk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-RS2K89y65gxl9VDk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-RS2K89y65gxl9VDk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-RS2K89y65gxl9VDk .marker.cross{stroke:#333333;}#mermaid-svg-RS2K89y65gxl9VDk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-RS2K89y65gxl9VDk .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-RS2K89y65gxl9VDk .cluster-label text{fill:#333;}#mermaid-svg-RS2K89y65gxl9VDk .cluster-label span{color:#333;}#mermaid-svg-RS2K89y65gxl9VDk .label text,#mermaid-svg-RS2K89y65gxl9VDk span{fill:#333;color:#333;}#mermaid-svg-RS2K89y65gxl9VDk .node rect,#mermaid-svg-RS2K89y65gxl9VDk .node circle,#mermaid-svg-RS2K89y65gxl9VDk .node ellipse,#mermaid-svg-RS2K89y65gxl9VDk .node polygon,#mermaid-svg-RS2K89y65gxl9VDk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-RS2K89y65gxl9VDk .node .label{text-align:center;}#mermaid-svg-RS2K89y65gxl9VDk .node.clickable{cursor:pointer;}#mermaid-svg-RS2K89y65gxl9VDk .arrowheadPath{fill:#333333;}#mermaid-svg-RS2K89y65gxl9VDk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-RS2K89y65gxl9VDk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-RS2K89y65gxl9VDk .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-RS2K89y65gxl9VDk .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-RS2K89y65gxl9VDk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-RS2K89y65gxl9VDk .cluster text{fill:#333;}#mermaid-svg-RS2K89y65gxl9VDk .cluster span{color:#333;}#mermaid-svg-RS2K89y65gxl9VDk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-RS2K89y65gxl9VDk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

默认值
建议都设置成这个
onError的属性值:校验语句发生异常的时候
HALT:暂停整个更改日志的执行,项目直接抛出异常导致项目启动失败
CONTINUE:跳过变更集。下次更新时将再次尝试执行变更集。下次启动项目会尝试继续执行该changeSet节点
MARK_RAN:跳过变更集,但将其标记为已执行,下次启动项目不在执行该changeSet节点
WARN:发送警告并继续正常执行变更集,即是校验失败也继续执行changeSet节点中定义的SQL语句,依然可能会导致启动失败,如创表语句必失败,但修改表结构可能不会失败
preConditions所有支持的子节点查看

官网: https://docs.liquibase.com/concepts/changelogs/preconditions.html?Highlight=changeSetExecuted

子节点:changeSetExecuted

官网: https://docs.liquibase.com/concepts/changelogs/preconditions.html

作用: 指定的更改集是否已被执行。

<preConditions onFail="HALT"><changeSetExecuted id="1" author="liquibase" changelog-file="changelog.xml" />
</preConditions>

子节点:sqlCheck

官网: https://docs.liquibase.com/concepts/changelogs/preconditions.html

作用: 执行一个SQL字符串并检查返回值。SQL结果必须是单行单列的数据

<preConditions onFail="WARN"><sqlCheck expectedResult="1">SELECT COUNT(1) FROM pg_tables WHERE TABLENAME = 'myRequiredTable'</sqlCheck>
</preConditions>

最佳实践

changelog文件如何拆分更好的管理

官方: https://learn.liquibase.com/unit/view/id:2661

注意: 划分的模块,使用 或 进行将所有切割changelog模块组织起来

#mermaid-svg-vq6HXhjIaxaKi2Am {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-vq6HXhjIaxaKi2Am .error-icon{fill:#552222;}#mermaid-svg-vq6HXhjIaxaKi2Am .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vq6HXhjIaxaKi2Am .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-vq6HXhjIaxaKi2Am .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vq6HXhjIaxaKi2Am .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vq6HXhjIaxaKi2Am .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vq6HXhjIaxaKi2Am .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vq6HXhjIaxaKi2Am .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vq6HXhjIaxaKi2Am .marker.cross{stroke:#333333;}#mermaid-svg-vq6HXhjIaxaKi2Am svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vq6HXhjIaxaKi2Am .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-vq6HXhjIaxaKi2Am .cluster-label text{fill:#333;}#mermaid-svg-vq6HXhjIaxaKi2Am .cluster-label span{color:#333;}#mermaid-svg-vq6HXhjIaxaKi2Am .label text,#mermaid-svg-vq6HXhjIaxaKi2Am span{fill:#333;color:#333;}#mermaid-svg-vq6HXhjIaxaKi2Am .node rect,#mermaid-svg-vq6HXhjIaxaKi2Am .node circle,#mermaid-svg-vq6HXhjIaxaKi2Am .node ellipse,#mermaid-svg-vq6HXhjIaxaKi2Am .node polygon,#mermaid-svg-vq6HXhjIaxaKi2Am .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vq6HXhjIaxaKi2Am .node .label{text-align:center;}#mermaid-svg-vq6HXhjIaxaKi2Am .node.clickable{cursor:pointer;}#mermaid-svg-vq6HXhjIaxaKi2Am .arrowheadPath{fill:#333333;}#mermaid-svg-vq6HXhjIaxaKi2Am .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vq6HXhjIaxaKi2Am .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vq6HXhjIaxaKi2Am .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-vq6HXhjIaxaKi2Am .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-vq6HXhjIaxaKi2Am .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vq6HXhjIaxaKi2Am .cluster text{fill:#333;}#mermaid-svg-vq6HXhjIaxaKi2Am .cluster span{color:#333;}#mermaid-svg-vq6HXhjIaxaKi2Am div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vq6HXhjIaxaKi2Am :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

拆分
第一种:以应用部署版本号令起一个changelog文件,如changelog-2.1.3.xml
第二种:以应用功能模块名令起一个changelog文件,如changelog-cert.xml
第三种:前面两种的结合,版本号是目录名,每个版本号下划分功能changelog文件
划分-版本号

划分-功能模块

划分-功能模块+功能模块结合

changelog太大且生产部署了多次,即将拆分重构changelog文件

风险

文章: https://learn.liquibase.com/unit/view/id:2634

#mermaid-svg-BhzombAY5uywDv6X {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BhzombAY5uywDv6X .error-icon{fill:#552222;}#mermaid-svg-BhzombAY5uywDv6X .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BhzombAY5uywDv6X .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-BhzombAY5uywDv6X .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BhzombAY5uywDv6X .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BhzombAY5uywDv6X .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BhzombAY5uywDv6X .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BhzombAY5uywDv6X .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BhzombAY5uywDv6X .marker.cross{stroke:#333333;}#mermaid-svg-BhzombAY5uywDv6X svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BhzombAY5uywDv6X .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BhzombAY5uywDv6X .cluster-label text{fill:#333;}#mermaid-svg-BhzombAY5uywDv6X .cluster-label span{color:#333;}#mermaid-svg-BhzombAY5uywDv6X .label text,#mermaid-svg-BhzombAY5uywDv6X span{fill:#333;color:#333;}#mermaid-svg-BhzombAY5uywDv6X .node rect,#mermaid-svg-BhzombAY5uywDv6X .node circle,#mermaid-svg-BhzombAY5uywDv6X .node ellipse,#mermaid-svg-BhzombAY5uywDv6X .node polygon,#mermaid-svg-BhzombAY5uywDv6X .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BhzombAY5uywDv6X .node .label{text-align:center;}#mermaid-svg-BhzombAY5uywDv6X .node.clickable{cursor:pointer;}#mermaid-svg-BhzombAY5uywDv6X .arrowheadPath{fill:#333333;}#mermaid-svg-BhzombAY5uywDv6X .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BhzombAY5uywDv6X .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BhzombAY5uywDv6X .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-BhzombAY5uywDv6X .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-BhzombAY5uywDv6X .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BhzombAY5uywDv6X .cluster text{fill:#333;}#mermaid-svg-BhzombAY5uywDv6X .cluster span{color:#333;}#mermaid-svg-BhzombAY5uywDv6X div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BhzombAY5uywDv6X :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

风险
1. 更新失败,因为没有识别变更集依赖关系
2. 校验和错误的发生是因为变更集在部署后被修改 - DATABASECHANGELOG表的MD5SUM
3. liquibase的逻辑主键是(id、author、FILENAME)组成,拆分肯定会导致文件名不一样,所以主键不一样,更新被重新部署到数据库
4. 环境会变得不同步,因为更改集在应用到管道中的所有数据库之前会被删除
方式1 - 学会使用databaseChangeLog的logicalFilePath属性

官网: https://docs.liquibase.com/concepts/changelogs/attributes/logicalfilepath.html?Highlight=logicalFilepath

方式2 - 不管以前的changelog文件,从此时此刻前按组分规定的拆分规范进行组织changelog文件的引入

意义: 由于拆分历史臃肿庞大的changelog文件,比较费时费力(要做足够多的测试),毕竟涉及到数据库的变更,历史的东西能不动就不动。但是如果你的changelog文件不是很臃肿,当然还是建议你按组内新的规范进行拆分为好,方便后续维护。

liquibase运行部署太慢

小贴士: 官方说自己的liquibase产品效率足够快,liquibase部署的慢很可能是使用者自身的问题

可能原因
#mermaid-svg-iwuD4HA0kVEYZ4fE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-iwuD4HA0kVEYZ4fE .error-icon{fill:#552222;}#mermaid-svg-iwuD4HA0kVEYZ4fE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-iwuD4HA0kVEYZ4fE .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-iwuD4HA0kVEYZ4fE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-iwuD4HA0kVEYZ4fE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-iwuD4HA0kVEYZ4fE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-iwuD4HA0kVEYZ4fE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-iwuD4HA0kVEYZ4fE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-iwuD4HA0kVEYZ4fE .marker.cross{stroke:#333333;}#mermaid-svg-iwuD4HA0kVEYZ4fE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-iwuD4HA0kVEYZ4fE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-iwuD4HA0kVEYZ4fE .cluster-label text{fill:#333;}#mermaid-svg-iwuD4HA0kVEYZ4fE .cluster-label span{color:#333;}#mermaid-svg-iwuD4HA0kVEYZ4fE .label text,#mermaid-svg-iwuD4HA0kVEYZ4fE span{fill:#333;color:#333;}#mermaid-svg-iwuD4HA0kVEYZ4fE .node rect,#mermaid-svg-iwuD4HA0kVEYZ4fE .node circle,#mermaid-svg-iwuD4HA0kVEYZ4fE .node ellipse,#mermaid-svg-iwuD4HA0kVEYZ4fE .node polygon,#mermaid-svg-iwuD4HA0kVEYZ4fE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-iwuD4HA0kVEYZ4fE .node .label{text-align:center;}#mermaid-svg-iwuD4HA0kVEYZ4fE .node.clickable{cursor:pointer;}#mermaid-svg-iwuD4HA0kVEYZ4fE .arrowheadPath{fill:#333333;}#mermaid-svg-iwuD4HA0kVEYZ4fE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-iwuD4HA0kVEYZ4fE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-iwuD4HA0kVEYZ4fE .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-iwuD4HA0kVEYZ4fE .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-iwuD4HA0kVEYZ4fE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-iwuD4HA0kVEYZ4fE .cluster text{fill:#333;}#mermaid-svg-iwuD4HA0kVEYZ4fE .cluster span{color:#333;}#mermaid-svg-iwuD4HA0kVEYZ4fE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-iwuD4HA0kVEYZ4fE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

效率慢原因
1. 某些changeset节点增加毫无必要的runAlways=true的设置,即每次部署都会执行该节点
2. 毫无必要的全局前置条件,changelog肯定会有做部署文件拆分,changelog1有全局前置条件(历史),但是新的部署内容在changelog2,这就导致每次部署必会运行changelog1的前置条件
3. 重建索引,可能你每次部署运行的时候,都要删除,在重建某个表的索引,增加表的查询效率,数据越多,键索引时间越久
优化
#mermaid-svg-knSfWAjRG3LABSIu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-knSfWAjRG3LABSIu .error-icon{fill:#552222;}#mermaid-svg-knSfWAjRG3LABSIu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-knSfWAjRG3LABSIu .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-knSfWAjRG3LABSIu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-knSfWAjRG3LABSIu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-knSfWAjRG3LABSIu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-knSfWAjRG3LABSIu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-knSfWAjRG3LABSIu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-knSfWAjRG3LABSIu .marker.cross{stroke:#333333;}#mermaid-svg-knSfWAjRG3LABSIu svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-knSfWAjRG3LABSIu .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-knSfWAjRG3LABSIu .cluster-label text{fill:#333;}#mermaid-svg-knSfWAjRG3LABSIu .cluster-label span{color:#333;}#mermaid-svg-knSfWAjRG3LABSIu .label text,#mermaid-svg-knSfWAjRG3LABSIu span{fill:#333;color:#333;}#mermaid-svg-knSfWAjRG3LABSIu .node rect,#mermaid-svg-knSfWAjRG3LABSIu .node circle,#mermaid-svg-knSfWAjRG3LABSIu .node ellipse,#mermaid-svg-knSfWAjRG3LABSIu .node polygon,#mermaid-svg-knSfWAjRG3LABSIu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-knSfWAjRG3LABSIu .node .label{text-align:center;}#mermaid-svg-knSfWAjRG3LABSIu .node.clickable{cursor:pointer;}#mermaid-svg-knSfWAjRG3LABSIu .arrowheadPath{fill:#333333;}#mermaid-svg-knSfWAjRG3LABSIu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-knSfWAjRG3LABSIu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-knSfWAjRG3LABSIu .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-knSfWAjRG3LABSIu .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-knSfWAjRG3LABSIu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-knSfWAjRG3LABSIu .cluster text{fill:#333;}#mermaid-svg-knSfWAjRG3LABSIu .cluster span{color:#333;}#mermaid-svg-knSfWAjRG3LABSIu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-knSfWAjRG3LABSIu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

学会使用validCheckSum节点或clear-checksums命令
优化手段
1. 删除不必要的changeset节点
2. 合并changset节点
优化1:删除不必要的changeset节点

案例: 例如:一个changset节点是创表a,另一个是删除a,其实两者一合起来就是啥都没做,可以考虑将这两个changeset节点直接从xml删掉即可

优化2:合并历史changset节点 - 学会使用validCheckSum节点或clear-checksums命令

官网validCheckSum: https://docs.liquibase.com/concepts/changelogs/changelog-formats.html?Highlight=validCheckSum

官网clear-checksums: https://docs.liquibase.com/commands/maintenance/clear-checksums.html?Highlight=clear

案例: 例如changelog文件中有3个历史changeset节点,一个是创空表a,一个是在a中加字段B,一个是在a中加字段C,可以将这3个changeset合并一个changeset,即创表的时候就增加字段B、C即可

#mermaid-svg-dT8zGwYEWl6sWMAw {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dT8zGwYEWl6sWMAw .error-icon{fill:#552222;}#mermaid-svg-dT8zGwYEWl6sWMAw .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dT8zGwYEWl6sWMAw .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-dT8zGwYEWl6sWMAw .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dT8zGwYEWl6sWMAw .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dT8zGwYEWl6sWMAw .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dT8zGwYEWl6sWMAw .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dT8zGwYEWl6sWMAw .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dT8zGwYEWl6sWMAw .marker.cross{stroke:#333333;}#mermaid-svg-dT8zGwYEWl6sWMAw svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dT8zGwYEWl6sWMAw .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-dT8zGwYEWl6sWMAw .cluster-label text{fill:#333;}#mermaid-svg-dT8zGwYEWl6sWMAw .cluster-label span{color:#333;}#mermaid-svg-dT8zGwYEWl6sWMAw .label text,#mermaid-svg-dT8zGwYEWl6sWMAw span{fill:#333;color:#333;}#mermaid-svg-dT8zGwYEWl6sWMAw .node rect,#mermaid-svg-dT8zGwYEWl6sWMAw .node circle,#mermaid-svg-dT8zGwYEWl6sWMAw .node ellipse,#mermaid-svg-dT8zGwYEWl6sWMAw .node polygon,#mermaid-svg-dT8zGwYEWl6sWMAw .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dT8zGwYEWl6sWMAw .node .label{text-align:center;}#mermaid-svg-dT8zGwYEWl6sWMAw .node.clickable{cursor:pointer;}#mermaid-svg-dT8zGwYEWl6sWMAw .arrowheadPath{fill:#333333;}#mermaid-svg-dT8zGwYEWl6sWMAw .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dT8zGwYEWl6sWMAw .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dT8zGwYEWl6sWMAw .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-dT8zGwYEWl6sWMAw .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-dT8zGwYEWl6sWMAw .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dT8zGwYEWl6sWMAw .cluster text{fill:#333;}#mermaid-svg-dT8zGwYEWl6sWMAw .cluster span{color:#333;}#mermaid-svg-dT8zGwYEWl6sWMAw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-dT8zGwYEWl6sWMAw :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

二选一
二选一
changeset节点合并步骤开始
在当前changelog文件中新启一个changeset节点,但是id、author属性字段必须跟其中一个待删的changset节点一致
2. 新节点内添加一个节点,内容是原先旧的id、author节点的md5值,自行使用calculate-checksum命令计算出来,或者直接从DATABASECHANGELOG表的对应行的MD5SUM复制过来
3. 运行 liquibase --changelogFIle=当前changeLog文件路径 clear-checksums,清空MD5SUM字段值
删除或注释掉旧的合并前的changeset节点

使用节点进行删除合并





使用clear-checksums命令进行删除合并 = 这个更简单

多模式(Schema)部署 - 即不同的数据库名

理念: 将不同的数据库名的单独作为一个xml管理,且设置context用来标记这个XML部署到哪个数据库的,最后liquibase update部署运行的时候需要指定 --contexts 采用哪个changelog文件运行 以及 -default-schema-name 或者 --default-catalog-name 指定部署的数据库名

iquibase.bat update --contexts="lrc_blog2" --defaultSchemaName="lrc_blog2"


lrc_blog1-changelog.xml

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLogxmlns="http://www.liquibase.org/xml/ns/dbchangelog"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"xmlns:pro="http://www.liquibase.org/xml/ns/pro"xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangeloghttp://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsdhttp://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsdhttp://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-latest.xsd"context="lrc_blog3"
><changeSet id="0" author="lrc" ><tagDatabase tag="blog3_version"></tagDatabase></changeSet><changeSet id="1" author="lrc" ><createTable tableName="user3"><column name="id" type="int" remarks="主键"><constraints primaryKey="true"></constraints></column><column name="year" type="int" remarks="年龄"></column></createTable></changeSet></databaseChangeLog>


Liquibase学习4 - 管理changelog相关推荐

  1. 数据库动态变化管理工具(Liquibase)学习

    Liquibase 学习 1)概述: 2)基本使用 1)概述: iquibase 是一个用于跟踪,管理和应用数据库变化的开源的数据库重构工具.它将所有数据库的变化(包括结构和数据) 都保存在XML文件 ...

  2. liquibase学习和使用

    文章目录 liquibase学习 介绍 数据库更新日志和数据库更新日志锁定 相关概念 changelog changeset的属性 precondition sql样例 Contexts sql样例 ...

  3. Liquibase学习

    Liquibase学习 1)概述: 2)基本使用 ① Liquibase编写规范: ② SpringBoot整合Liquibase 1)概述: iquibase 是一个用于跟踪,管理和应用数据库变化的 ...

  4. Linux内核学习--内存管理模块

    Linux内核学习--内存管理模块 首先,Linux内核主要由五个部分组成,他们分别是:进程调度模块.内存管理模块.文件系统模块.进程间通信模块和网络接口模块. 本部分所讲的内存是内存管理模块,其主要 ...

  5. UNIX再学习 -- 内存管理

    C 语言部分,就一再的讲内存管理,参看:C语言再学习 -- 再论内存管理  UNIX.Linux 部分还是要讲,足见其重要. 一.存储空间布局 1.我们先了解一个命令 size,继而引出我们今天要讲的 ...

  6. 不要在学习启动管理器和元编程上浪费时间

    为什么说不要浪费时间在启动管理器上 启动管理器是指引导操作系统启动的一段程序.常见的启动管理器有windows boot manager和grub,这两个都是x86 PC体系里的,macOS和Andr ...

  7. 学习时间管理,让程序猿一生过得更加自由

    最近跟随老师去学习易效能时间管理公开课,虽然只是个公开课,但是也收获满满的,改善了我的拖延症,做事效率提高了很多,时间的分配比以前也科学多了-可见易效能时间管理课程叶武滨老师的功力非凡啊! 下面分享一 ...

  8. 这绝对是你见过的最全深度学习服务器管理配置手册,学不会你打我

    这绝对是你见过的最全深度学习服务器管理/配置手册,学不会你打我 最近在配置服务器,遇到了不少问题,在此整理记录一下.主要是以下几个方面:多用户管理.服务器环境配置.Anaconda虚拟环境安装Tens ...

  9. ssm毕设项目学生出国境学习交流管理87153(java+VUE+Mybatis+Maven+Mysql+sprnig)

    ssm毕设项目学生出国境学习交流管理87153(java+VUE+Mybatis+Maven+Mysql+sprnig) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + ...

最新文章

  1. linux mint 19 内核4.9,检查Linux Mint 19系统版本号和代号的方法
  2. 借双慧眼识别钓鱼欺诈网站
  3. deepin深度启动盘制作工具下载地址
  4. 在网页中嵌入任意字体的解决方案 (insert any font)
  5. 感知器算法超详细讲解实战【原理+手撸代码实现】+spark应用实践
  6. 华为交换机导入配置_华为交换机配置文件导入 华为s5700交换机配置教程
  7. device-monitoring-studio(串口监控软件)的使用方法
  8. scratch做了个病毒大战的游戏,欢迎朋友们试玩,多提意见
  9. 全国计算机的照片规格,照片纸尺寸大小 照片尺寸规格大全
  10. gcf,gca,gco的区别
  11. requests Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en
  12. F-Groundhog Looking Dowdy2020牛客暑期多校训练营(第九场)(尺取法)
  13. vue的基础知识-vue基础入门
  14. Unity Profiler
  15. windows常用命令及相关命令
  16. 8种在JavaScript数组中查找指定元素的方法
  17. Unity WebGL错误集锦
  18. 学习数据结构--第六章:查找(查找)
  19. 转自kuangbin的AC自动机(赛前最后一博)
  20. springboot 使用 redis 监听 key 的过期回调( 模拟设置订单号超时时间, 触发修改订单状态业务逻辑)

热门文章

  1. 使用directives进行拖拽
  2. 服务器虚拟机ping不通百度,未知的名称或服务,解决方法
  3. for循环语句执行顺序
  4. VMware Workstation 12 Pro虚拟机下载(含序列号)
  5. 中国各类医院排行(仅供参考)
  6. iOS面试题汇总(一)
  7. 「安全系列之CSRF」如何防范csrf攻击
  8. 【VMD-SSA-LSSVM】基于变分模态分解与麻雀优化Lssvm的负荷预测【多变量】(Matlab代码实现)
  9. C# 索引器(Indexer) this关键字的作用
  10. flink sql 如何upsert 到一张hologres表中