官网: https://docs.liquibase.com/parameters/log-level.html?Highlight=loglevel
注意: 越低级别的日志等级,显示的信息越多
官网: https://docs.liquibase.com/commands/maintenance/validate.html
注意: 不会检测SQL语法是否正确
liquibase validate
官网: https://docs.liquibase.com/commands/update/update-testing-rollback.html
liquibase update-testing-rollback
官网: https://docs.liquibase.com/commands/rollback/future-rollback-sql.html
liquibase futureRollbackSQL
官网: https://docs.liquibase.com/commands/home.html#database-rollback-commands
官网: 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是你想要的,毕竟回滚很可能涉及到删表操作,谨慎为主哦!
注意: 如果DATABASECHANGELOG表无记录,运行此命令会创建一条记录出来,如果DATABASECHANGELOG有记录,则将最后一条(最新一条)记录中tag属性设置为回滚点标签名
liquibase tag 回滚点标签名
官方: https://docs.liquibase.com/change-types/tag-database.html?Highlight=tagDatabase
注意: 每次都是创建一个新记录到DATABASECHANGELOG表中
changelog.xml
<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">
<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
官网: 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
控制台输出
文化输出
官网: 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
最简单的自行摸索
本地数据库结构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
官网: https://docs.liquibase.com/commands/update/update.html
官网: 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 标签名(回滚点)
官网: 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就不会报错了
官网: https://docs.liquibase.com/commands/maintenance/clear-checksums.html
官方定义: https://learn.liquibase.com/unit/view/id:2217
已升级 Liquibase 并希望使用最新版本重新计算校验和
开发中,您可能已经创建了多个更改,并希望通过操作changelog将这些更改组合成一个单一的变更集。您可能需要清除校验和才能完成此任务。
对存储的逻辑进行了更改,并使用与以前相同的文件,并希望使用新的存储逻辑来代替(这不是最佳实践,但可以这样做,因为存储的逻辑可以一遍又一遍地运行)。
想要克服错误,但不希望更改在下一次更新时运行。
开发人员修改了几个已经部署的脚本,现在 Liquibase update由于校验和错误而失败。
注意: 即使databasechangelog的记录标记已经执行,但只要update,liquibase都会去校验每条changset的MD5值,然后跟数据库存储的md5值进行不对,如果对不上则报错,没有则会填充进去数据库,然后下次update的时候在进行比对
官网: 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
官网: https://docs.liquibase.com/commands/status/status.html?Highlight=status
liquibase status --help
//仅显示未部署的条数
liquibase status
//建议使用这个:显示未部署条数以及哪些changeset没部署
liquibase status --verbose
官网: https://docs.liquibase.com/commands/status/history.html
liquibase history
官网: https://docs.liquibase.com/commands/maintenance/unexpected-changesets.html
//仅提示异常数量
liquibase unexpected-changesets
//异常数量以及棘具体异常的标识也显示出来id、author
liquibase unexpected-changesets --verbose
官网: https://docs.liquibase.com/commands/docs/db-doc.html
liquibase db-doc
官网: https://docs.liquibase.com/change-types/home.html
总结1: 涉及新增的结构、约束才支持回滚即生成回滚语句是:删除结构、约束,反过来则不支持自动回滚语句生成,需要自己自定义回滚语句节点
总结2: 如果不想语句有回滚语句,则在changeSet节点里面添加个空的节点