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

x33g5p2x  于2022-07-13 转载在 其他  
字(7.9k)|赞(0)|评价(0)|浏览(913)

全局参数选项

logLevel-日志等级

官网: https://docs.liquibase.com/parameters/log-level.html?Highlight=loglevel

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

日志级别SEVERE:显示可能阻止程序执行的严重故障sql:显示liquibase每条changset做了什么动作(非SQL,仅是描述性语言而已,如果想看SQL,日志级别改成debug)WARNING:显示程序执行的潜在问题INFO:显示信息性消息FINE或者debug:显示程序执行和小故障的跟踪信息,完整SQL会打印出来OFF:隐藏、关闭所有日志消息

命令

检测

validate - 检测changeLog文件语法

官网: https://docs.liquibase.com/commands/maintenance/validate.html

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

liquibase validate

update-testing-rollback - 检测验证当前未部署的changset,【部署、回滚、在部署】的能力,最终还是部署上去

官网: https://docs.liquibase.com/commands/update/update-testing-rollback.html

liquibase update-testing-rollback

SQL查看

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

官网: https://docs.liquibase.com/commands/rollback/future-rollback-sql.html

liquibase futureRollbackSQL

回滚

概述

官网: https://docs.liquibase.com/commands/home.html#database-rollback-commands

查看即将回滚的SQL命令

所有回滚操作的命令

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

官网: https://docs.liquibase.com/commands/rollback/rollback-by-tag.html

特别注意: 如果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节点 - 个人更建议使用这个

官方: https://docs.liquibase.com/change-types/tag-database.html?Highlight=tagDatabase

注意: 每次都是创建一个新记录到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 标签名

备份当前数据库状态

官网: https://docs.liquibase.com/commands/home.html#snapshot-commands

概述
所有备份数据库的命令

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

官网: https://docs.liquibase.com/commands/snapshot/snapshot.html

注意: 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文件输出到时可以部署到新数据库中

官网: https://docs.liquibase.com/commands/snapshot/generate-changelog.html

//查看snapshot的命令选项
liquibase generate-changelog --help

//当前数据库结构状态
liquibase generate-changelog --changelog-file=20220711snapshot.xml

//部署到新数据库中
liquibase --changelog-file=20220711snapshot.xml  update

数据库比对

官网: https://docs.liquibase.com/commands/home.html#diff-commands

库与库的比对

最简单的自行摸索

库与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文件直接部署)- 最常用

官网: https://docs.liquibase.com/commands/update/update.html

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

官网: https://docs.liquibase.com/commands/update/update-to-tag.html

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

//查看运行update-to-tag的SQL操作
liquibase update-to-tag-sql 标签名(回滚点)

//根据标签进行部署changelog文件
liquibase update-to-tag 标签名(回滚点)

changelog-sync

官网: https://docs.liquibase.com/commands/maintenance/changelog-sync.html

作用: 仅仅只是将changeLogFile里面的每条的changeset记录在DATABASECHANGELOG表中标记已经执行(但其实没执行任何有关changeLogFile里面的DDL语句)

使用场景: 某个项目中途引入了liquibase管理表结构SQL,一开始先使用generate-changelog生成当前数据库的表结构changelog文件,但是当你update的时候会直接报错,因为这些表都已经在当前数据库存在了,现在你只需要运行change-sync,默认当前changelog文件里面的SQL都是已经执行过的,在DATABASECHANGELOG表生成每个changeset执行记录,且EXECTYPE标记为已经执行EXECUTED,然后在udpate就不会报错了

clearCheckSums

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

运行场景

官方定义: https://learn.liquibase.com/unit/view/id:2217

  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

官网: https://docs.liquibase.com/commands/maintenance/mark-next-changeset-ran.html

应用场景: 生产紧急情况,你手动上数据库进行更新数据库结构未经过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是待部署状态

官网: https://docs.liquibase.com/commands/status/status.html?Highlight=status

liquibase status --help

//仅显示未部署的条数
liquibase status

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

history:查看历史部署

官网: https://docs.liquibase.com/commands/status/history.html

liquibase history

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

官网: https://docs.liquibase.com/commands/maintenance/unexpected-changesets.html

//仅提示异常数量
liquibase unexpected-changesets

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

db-doc

官网: https://docs.liquibase.com/commands/docs/db-doc.html

liquibase db-doc

文档生成

nginx指定db-doc目录

浏览器查看-文档内容

文件

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

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

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

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

相关文章

目录