Liquibase学习3 - logLevel日志等级、常用命令

432 阅读9分钟

文章目录

全局参数选项

logLevel-日志等级

官网: docs.liquibase.com/parameters/…

注意: 越低级别的日志等级,显示的信息越多

命令

检测

validate - 检测changeLog文件语法

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

注意: 不会检测SQL语法是否正确

liquibase validate

在这里插入图片描述

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…

  1. 已升级 Liquibase 并希望使用最新版本重新计算校验和
  2. 开发中,您可能已经创建了多个更改,并希望通过操作changelog将这些更改组合成一个单一的变更集。您可能需要清除校验和才能完成此任务。
  3. 对存储的逻辑进行了更改,并使用与以前相同的文件,并希望使用新的存储逻辑来代替(这不是最佳实践,但可以这样做,因为存储的逻辑可以一遍又一遍地运行)。
  4. 想要克服错误,但不希望更改在下一次更新时运行。
  5. 开发人员修改了几个已经部署的脚本,现在 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

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

db-doc

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

liquibase db-doc

文档生成
在这里插入图片描述

nginx指定db-doc目录
在这里插入图片描述

浏览器查看-文档内容
在这里插入图片描述

文件

Liquibase支持的自动生成回滚语句

官网: docs.liquibase.com/change-type…

总结1: 涉及新增的结构、约束才支持回滚即生成回滚语句是:删除结构、约束,反过来则不支持自动回滚语句生成,需要自己自定义回滚语句节点

总结2: 如果不想语句有回滚语句,则在changeSet节点里面添加个空的节点