添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
气宇轩昂的蜡烛  ·  com.microsoft.sqlserve ...·  1 年前    · 
坐怀不乱的罐头  ·  .net - Call has been ...·  1 年前    · 
要出家的大熊猫  ·  Java ...·  1 年前    · 
  • validate - 检测changeLog文件语法
  • update-testing-rollback - 检测验证当前未部署的changset,【部署、回滚、在部署】的能力,最终还是部署上去
  • SQL查看
  • future-rollback-sql - 查看未部署运行的changeSet的回滚语句
  • 查看即将回滚的SQL命令
  • 所有回滚操作的命令
  • 回滚、更新部署方式通过标签-设置回滚点(标签方式 tag 标签名)、rollback 标签名
  • 回滚点创建方式
  • 方式1:命令行 - 官方推荐
  • 方式2:xml节点 - 个人更建议使用这个
  • update、update-sql(整个changelog文件直接部署)- 最常用
  • update-to-tag、update-to-tag-sql(changelog文件阶段性分部分(回滚点)的部署)- 建议常用这个取代update
  • changelog-sync
  • clearCheckSums
  • mark-next-changeset-ran、mark-next-changeset-ran-sql
  • status:查看还有多少changeset是待部署状态
  • history:查看历史部署
  • unexpected-changesets:排查出databasechangelog有部署日志但changlog文件没有changeset节点的databasechangelog记录(以整个databasechangelog表为准)
  • db-doc
  • Liquibase支持的自动生成回滚语句
  • update-testing-rollback - 检测验证当前未部署的changset,【部署、回滚、在部署】的能力,最终还是部署上去

    官网: docs.liquibase.com/commands/up…

    liquibase update-testing-rollback 
    

    SQL查看

    future-rollback-sql - 查看未部署运行的changeSet的回滚语句

    官网: docs.liquibase.com/commands/ro…

    liquibase futureRollbackSQL
    

    官网: docs.liquibase.com/commands/ho…

    查看即将回滚的SQL命令
    所有回滚操作的命令

    回滚、更新部署方式通过标签-设置回滚点(标签方式 tag 标签名)、rollback 标签名

    官网: docs.liquibase.com/commands/ro…
    特别注意: 如果liquibase update的时候不是使用liquibase.properties里面定义的changeLogFile文件,而是命令行特别指定的文件即–changeLogFile的文件,则你回滚标签的时候也是需要指定你update时的–changeLogFile文件,这样liquibase才会知道你需要回滚的东西是什么
    官方推荐实践1: 每次新部署前,最好先设置一个回滚点即新标签作为回滚标记 liquibase tag 新标签名
    官方推荐实践2: 运行 【rollback 标签名】 回滚前,请先运行 【rollback -sql 标签名】 确认即将执行的回滚SQL是你想要的,毕竟回滚很可能涉及到删表操作,谨慎为主哦!

    回滚点创建方式
    方式1:命令行 - 官方推荐

    注意: 如果DATABASECHANGELOG表无记录,运行此命令会创建一条记录出来,如果DATABASECHANGELOG有记录,则将最后一条(最新一条)记录中tag属性设置为回滚点标签名

    liquibase tag  回滚点标签名
    
    方式2:xml节点 - 个人更建议使用这个

    官方: docs.liquibase.com/change-type…
    注意: 每次都是创建一个新记录到DATABASECHANGELOG表中

    changelog.xml

    <?xml version="1.1" encoding="UTF-8" standalone="no"?>
    <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-4.12.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">
        <!--回滚点version_1.3-->
        <changeSet  author="liquibase-docs"  id="tagDatabase-example">  
          <tagDatabase  tag="version_1.3"/>  
        </changeSet>
        <changeSet author="root (generated)" id="1657564981926-1">
            <createTable tableName="person_a8">
                <column name="id" type="INT">
                    <constraints nullable="false" primaryKey="true"/>
                </column>
                <column name="name" type="VARCHAR(50)">
                    <constraints nullable="false"/>
                </column>
                <column name="address1" type="VARCHAR(50)"/>
                <column name="address2" type="VARCHAR(50)"/>
                <column name="city" type="VARCHAR(30)"/>
            </createTable>
        </changeSet>
        <changeSet author="root (generated)" id="1657564981926-2">
            <createTable tableName="test">
                <column name="id" type="INT">
                    <constraints nullable="false" primaryKey="true"/>
                </column>
            </createTable>
        </changeSet>
    </databaseChangeLog>
    
    //然后运行部署
    liquibase update
    
    //设置当前的数据库状态为 标签名1
    //其实质就是在DATABASECHANGELOG表的最新一条记录的tag列加上【标签名】
    //如果没有DATABASECHANGELOG没有记录,也会补一条DESCRIPTION=empty的行记录作为标记
    liquibase tag 标签名
    //执行更新
    liquibase update
    //将数据库的结构状态回滚到执行liquibase update更新之前的结构
    liquibase rollback 标签名
    

    备份当前数据库状态

    官网: docs.liquibase.com/commands/ho…

    所有备份数据库的命令

    snapshot - 仅仅只是用来看的并不能重新部署到数据库

    官网: docs.liquibase.com/commands/sn…

    注意: yml、json格式可用于到时比对源库用于生成diffChangelog文件的,建议–snapshot-format设置为这两种格式,而不是使用默认的

    //查看snapshot的命令选项
    liquibase snapshot --help
    //当前数据库结构状态
    liquibase snapshot
    //控制台输出:三种格式输出:txt(默认)、json、yaml
    //yml、json格式可用于生成diffChangelog文件
    liquibase snapshot --snapshot-format=json
    //输出到文件中
    liquibase snapshot --snapshot-format=json --output-file=文件名.json
    

    控制台输出

    generate-changelog - 将当前的数据库状态以changelog文件输出到时可以部署到新数据库中

    官网: docs.liquibase.com/commands/sn…

    //查看snapshot的命令选项
    liquibase generate-changelog --help
    //当前数据库结构状态
    liquibase generate-changelog --changelog-file=20220711snapshot.xml
    //部署到新数据库中
    liquibase --changelog-file=20220711snapshot.xml  update 
    

    数据库比对

    官网: docs.liquibase.com/commands/ho…

    库与库的比对

    最简单的自行摸索

    库与snapshot文件的比对

    本地数据库结构Url编写: offline:数据库类型?snapshot=snapshot文件路径

    //备份当前lrc_blog3的数据库状态以lrc_blog3_snapshot.yml文件形式保存
    liquibase snapshot --output-file=lrc_blog3_snapshot.yml  --snapshot-format=yml
    //比对源库lrc_blog与目标库lrc_blog3_snapshot.yml 数据库结构直接的区别,然后生成diffChangeLog.xml文件,到时直接将changlog-file设置成diffChangeLog.xml,然后update就可以将lrc_blog3的数据库结构变成跟lrc_blog一样
    liquibase   --url=offline:mysql?snapshot=lrc_blog3_snapshot.yml diffChangeLog  --changelog-file=diffChangeLog.xml
    //将lrc_blog3的结构变成lrc_blog
    liquibase --changelog-file=diffChangeLog.xml  update
    

    部署、维护

    update、update-sql(整个changelog文件直接部署)- 最常用

    官网: docs.liquibase.com/commands/up…

    update-to-tag、update-to-tag-sql(changelog文件阶段性分部分(回滚点)的部署)- 建议常用这个取代update

    官网: docs.liquibase.com/commands/up…
    作用: 由于liquibase是按changeset节点在changelog的位置,按顺序的执行,这就导致可以在changeset之间设置一个标签(回滚点) () ,此命令只会部署当前节点以及当前标签节点之前的changeset节点,后面的直接忽略

    //查看运行update-to-tag的SQL操作
    liquibase update-to-tag-sql 标签名(回滚点)
    //根据标签进行部署changelog文件
    liquibase update-to-tag 标签名(回滚点)
    

    changelog-sync

    官网: docs.liquibase.com/commands/ma…
    作用: 仅仅只是将changeLogFile里面的每条的changeset记录在DATABASECHANGELOG表中标记已经执行(但其实没执行任何有关changeLogFile里面的DDL语句)
    使用场景: 某个项目中途引入了liquibase管理表结构SQL,一开始先使用generate-changelog生成当前数据库的表结构changelog文件,但是当你update的时候会直接报错,因为这些表都已经在当前数据库存在了,现在你只需要运行change-sync,默认当前changelog文件里面的SQL都是已经执行过的,在DATABASECHANGELOG表生成每个changeset执行记录,且EXECTYPE标记为已经执行EXECUTED,然后在udpate就不会报错了

    clearCheckSums

    官网: docs.liquibase.com/commands/ma…

    官方定义: learn.liquibase.com/unit/view/i…

  • 已升级 Liquibase 并希望使用最新版本重新计算校验和
  • 开发中,您可能已经创建了多个更改,并希望通过操作changelog将这些更改组合成一个单一的变更集。您可能需要清除校验和才能完成此任务。
  • 对存储的逻辑进行了更改,并使用与以前相同的文件,并希望使用新的存储逻辑来代替(这不是最佳实践,但可以这样做,因为存储的逻辑可以一遍又一遍地运行)。
  • 想要克服错误,但不希望更改在下一次更新时运行。
  • 开发人员修改了几个已经部署的脚本,现在 Liquibase update由于校验和错误而失败。
  • 注意: 即使databasechangelog的记录标记已经执行,但只要update,liquibase都会去校验每条changset的MD5值,然后跟数据库存储的md5值进行不对,如果对不上则报错,没有则会填充进去数据库,然后下次update的时候在进行比对

    mark-next-changeset-ran、mark-next-changeset-ran-sql

    官网: docs.liquibase.com/commands/ma…
    应用场景: 生产紧急情况,你手动上数据库进行更新数据库结构未经过liquibase运行,但你还是会在liquibase备份一份作为曾经执行过的DDL,但是该条changeset由于没有经liquibase执行,导致databasechangelog没有记录,则liquibase又会在执行一遍到时就报错了,所以避免这种由于紧急情况手动更改数据库但在liquibase有留changeset记录的,则使用markNextChangeSetRan命令让liquibase基于changelog生成一份已执行的databasechangelog记录,但不会将changset的SQL又重新作用于liquibase,相对于update,其实就是少执行了changset里面的SQL语句而已

    //基于changlog生成一条未在databasechangelog存在的记录,并将其标记为已经执行
    liquibase markNextChangeSetRan
    //查看运行markNextChangeSetRan的话将执行的SQL语句
    liquibase markNextChangeSetRanSQL
    

    status:查看还有多少changeset是待部署状态

    官网: docs.liquibase.com/commands/st…

    liquibase status --help
    //仅显示未部署的条数
    liquibase status
    //建议使用这个:显示未部署条数以及哪些changeset没部署
    liquibase status --verbose
    

    history:查看历史部署

    官网: docs.liquibase.com/commands/st…

    liquibase history
    

    unexpected-changesets:排查出databasechangelog有部署日志但changlog文件没有changeset节点的databasechangelog记录(以整个databasechangelog表为准)

    官网: docs.liquibase.com/commands/ma…

    //仅提示异常数量
    liquibase unexpected-changesets
    //异常数量以及棘具体异常的标识也显示出来id、author
    liquibase unexpected-changesets --verbose
    

    官网: docs.liquibase.com/change-type…
    总结1: 涉及新增的结构、约束才支持回滚即生成回滚语句是:删除结构、约束,反过来则不支持自动回滚语句生成,需要自己自定义回滚语句节点
    总结2: 如果不想语句有回滚语句,则在changeSet节点里面添加个空的节点

    分类:
    后端
    标签: