Liquibase 使用(全)
聊一个数据库脚本的版本工具 Liquibase,官网在这里 ,初次看到,挺神奇的,数据库脚本也可以有版本管理,同类型的工具还有 flyway 。
开发过程经常会有表结构和变更,让运维来维护的话,通常会有很大的沟通成本,有时在开发方案有问题的时候,提测失败整个项目需要回滚,代码回滚起来是很容易的,通常有备份,但数据库的话就要人工来逐行分析并写出回滚语句,Liquibase 这时候就有用了。
Liquibase 适用场景感觉不多,所以可能有人没听过它的名头; 首先这种自动执行的家伙肯定是不适合于生产环境的,然后在数据量大的时候是不可能用数据库自带的 alter 语句的,一般都是手动创建另一张表,然后用 sql 语句将数据批量复制过去,再者使用容器化也比它好,个人觉得它一般用于开发和测试环境,比较厉害的一个功能是可以比较两个库的差异然后生成补丁包,上线时可以这么玩。
这篇文章说得不错,我是在这篇基本上写的
核心概念
首先它是用于管理数据库版本的,所以就会有这些概念:版本号,管理的数据,差异比较,版本回滚
它的版本号由开发人员来维护,使用 author + id
管理的数据最小单元为 changeSet ,这个 changeSet 看官网说是可以用 xml,yaml,json,sql 来编写
提交数据,比较差异,版本回滚 可以使用命令行 或者 maven ,ant 等构建工具来完成
从命令行开始
看网上说的都是集成自 springboot ,但这种数据库脚本一般公司都是运维在维护,使用命令行是最方便的方式,所以我先说下使用命令行,官网示例
为先为了不每次都要写一大堆参数,可以在 liquibase 根目录加一个 liquibase.properties,用于配置数据库 jar 包,url ,用户名,密码等参数,配置详情
命令格式: liquibase [options] [command] [command parameters]
比较开发库和测试库的差异,并生成升级包
如果要升级哪个,则哪个要做为源,则配置中的 url 不是 referenceUrl,使用如下命令创建升级包
liquibase --changeLogFile="changeLogFiledevtest.postgresql.sql" diffChangeLog
changeLogFile 是有命名规则的,命名必须为 *.dbType.format ,如上所示
为测试库打一个标签
liquibase tag v1.0
使用差异升级源库
liquibase --changeLogFile="sqls/changeLogFiledevtest.postgresql.sql" update
升级有问题需要回滚
liquibase 有几种回滚策略,一种是根据标签回滚,回滚次数,和根据日期回滚;有 9 个与之对应的命令
回滚要求对应的 changeLogFile 有回滚标签 ,这个在后面文件格式说
# 按照 changeSet 次数回滚
liquibase --changeLogFile="sqls/changeLogFiledevtest.postgresql.sql" rollbackCount 1
# 按照标签回滚
liquibase --changeLogFile="sqls/changeLogFiledevtest.postgresql.sql" rollback v1.0
生成数据库脚本(新环境)
liquibase --changeLogFile="sqls/create_table.mysql.sql" generateChangeLog
原理
它会在你的目标数据库生成一张表 DATABASECHANGELOG 来管理版本 ,另一个 lock 的是防止多人同时操作数据库加的锁。
文件格式
其实各种文件格式使用生成数据库脚本就可以看到格式了,照着写就行
sql 文件格式
--liquibase formatted sql
--changeset <author>:<version>
sqls
--rollback rollback sqls
--comment: 注释都有特殊含义了,所以注释要这样加
详情见官网 sql 文件格式
XML 文件格式
xml 比 sql 更加可控,它可以加一个预判断条件,来判断这个后面的 changeSet 要不要执行,但相应的就必须照它的语法来写语句了,没 sql 方便了,还好提供了 xsd
<preConditions>
<runningAs username="liquibase"/>
</preConditions>
<!-- 版本 1 的修改-->
<changeSet id="1" author="sanri">
<addColumn tableName="person">
<column name="username" type="varchar(8)"/>
</addColumn>
</changeSet>
见官网 XML 文件格式
json 和 yaml 就不说了,更加不好控
使用构建工具
前面说了,我们也可以使用 maven 来执行这些操作,引入 maven 的一个插件就行
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>3.6.3</version>
<configuration>
<!--指定执行主文件 -->
<!-- <changeLogFile>${basedir}/src/main/resources/liquibase/master_changelog.xml</changeLogFile>-->
<!-- <diffChangeLogFile>${basedir}/src/main/resources/liquibase/changelog/${maven.build.timestamp}_changelog.xml</diffChangeLogFile>-->
<!-- <outputChangeLogFile>${basedir}/src/main/resources/liquibase/changelog/changelog_original.xml</outputChangeLogFile>-->
<propertyFile>src/main/resources/liquibase/liquibase.properties</propertyFile>
<dropFirst>false</dropFirst>
<verbose>true</verbose>
<logging>debug</logging>
<!-- 是否需要弹出确认框 -->
<promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
<!--输出文件的编码 -->
<outputFileEncoding>UTF-8</outputFileEncoding>
<!--执行的时候是否显示详细的参数信息 -->
<verbose>true</verbose>
<!--是否每次都重新加载properties -->
<propertyFileWillOverride>true</propertyFileWillOverride>
<rollbackTag>${project.version}</rollbackTag>
<tag>${project.version}</tag>
</configuration>
</plugin>
相应的命令做成了目标(goal),使用 -Dkey=value 来指定参数,如
# 执行更新 sql
mvn liquibase:update -DchangeLogFile="file"
# 打标签,这个版本号在插件中配置成项目版本了
mvn liquibase:tag
# 将当前库导出表结构
mvn liquibase:generateChangeLog
集成进 springboot ,在项目启动的时候执行版本管理
网上都说的这种,感觉这种最不靠谱,自动执行的,万一 sql 有个错误,虽然他是把每个 changeSet 做为一个事务,需要不断的重启项目, jenkins 每次构建很慢的,如果让运维来手动重启又不现实。
一点小推广
创作不易,希望可以支持下我的开源软件,及我的小工具,欢迎来 gitee 点星,fork ,提 bug 。
Excel 通用导入导出,支持 Excel 公式
博客地址:https://blog.csdn.net/sanri1993/article/details/100601578
gitee:https://gitee.com/sanri/sanri-excel-poi
使用模板代码 ,从数据库生成代码 ,及一些项目中经常可以用到的小工具
博客地址:https://blog.csdn.net/sanri1993/article/details/98664034
gitee:https://gitee.com/sanri/sanri-tools-maven
Liquibase 使用(全)的更多相关文章
- 国内最全的Spring Boot系列之二
历史文章 <国内最全的Spring Boot系列之一> 视频&交流平台 SpringBoot视频:http://t.cn/R3QepWG Spring Cloud视频:http:/ ...
- Liquibase 快速开始
Step 1 :创建Changelog文件,所有的数据库变动都会保存在Changelog文件中 <?xml version="1.0" encoding="UTF- ...
- Jquery的点击事件,三句代码完成全选事件
先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- Android UI体验之全屏沉浸式透明状态栏效果
前言: Android 4.4之后谷歌提供了沉浸式全屏体验, 在沉浸式全屏模式下, 状态栏. 虚拟按键动态隐藏, 应用可以使用完整的屏幕空间, 按照 Google 的说法, 给用户一种 身临其境 的体 ...
- 通往全栈工程师的捷径 —— react
腾讯Bugly特约作者: 左明 首先,我们来看看 React 在世界范围的热度趋势,下图是关键词“房价”和 “React” 在 Google Trends 上的搜索量对比,蓝色的是 React,红色的 ...
- 工欲善其事,必先利其器 之 VS2013全攻略(安装,技巧,快捷键,插件)!
如有需要WPF工具的朋友可以移步 工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧 之前一篇<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATI ...
- 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法
若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...
- Phoenix综述(史上最全Phoenix中文文档)
个人主页:http://www.linbingdong.com 简书地址:http://www.jianshu.com/users/6cb45a00b49c/latest_articles 网上关于P ...
- duang~免费的学习视频来啦:学霸君之全栈测试
学霸君向童鞋们推荐一款 同名学霸学习 视频教程 重点是完全免费收看学习噢!!! 今天 学霸君推荐腾讯课堂的学霸君之全栈测试 复制下方链接至腾讯课堂中报名学习 https://ke.qq.com/cou ...
随机推荐
- 【NS2】使用SourceInsight阅读NS源代码全攻略(转载)
NS的源码底层是C++,采用了C++/Tcl分裂对象模型,架构完善,堪称OOP编程的典范.但是NS源码体系庞大,源文件有2千多个,阅读起来不是特别方便,我推荐使用SourceInsight3.5.具体 ...
- 记忆化搜索(DFS)--How many ways
How many ways 这是一个简单的生存游戏,你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的终点(n,m).游戏的规则描述如下:1.机器人一开始在棋盘的起始点并有起始点所标有的能量.2. ...
- LightOJ 1236 Pairs Forming LCM【整数分解】
题目链接: http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1236 题意: 找与n公倍数为n的个数. 分析: ...
- [BZOJ3064][Tyvj1518] CPU监控
题目:[BZOJ3064][Tyvj1518] CPU监控 思路: 线段树专题讲的.以下为讲课时的课件: 给出序列,要求查询一些区间的最大值.历史最大值,支持区间加.区间修改.序列长度和操作数< ...
- [软考]之软件过程模型II 标签: 软件工程 2015-11-01 11:52 1612人阅读 评论(22) 收
上一篇博客总结了瀑布模型/V模型/增量模型这三种软件模型,然而我们还有一个很重要的问题忘了回答,那就是,什么是软件过程模型? 什么是软件过程模型? 软件过程是软件开发与维护的工作流程和工艺流程,是软件 ...
- [***]HZOJ 优美序列
又是一道神仙题.考试的时候居然打了一个回滚莫队,不知道我咋想的…… 先说一个某OJT80,洛谷T5分的思路(差距有点大): 可以把位置和编号映射一下,区间内最大值和最小值对应的位置,每次更新,直到找到 ...
- 模板—e-dcc缩点
int dfn[MAXN],low[MAXN],cnt; bool isbridge[MAXN]; void tarjan(int x,int edg) { low[x]=dfn[x]=++cnt; ...
- rcGIS API for JavaScript之基础篇(一)
ArcGIS API for JavaScript之基础篇(一)上一篇文章介绍了ArcGIS 10.4的安装指南也包含了所需要资源,需要的同学可以去公众号中查找.最近几天学习了2D地图.3D地图以及图 ...
- poj 1920 Towers of Hanoi
Towers of Hanoi Time Limit: 3000MS Memory Limit: 16000K Total Submissions: 2213 Accepted: 986 Ca ...
- Vue打包后放到服务器出现Loading chunk {n} failed 错误
导航栏点击切换时 会出现Loading chunk {n} failed ,刷新之后便不会出现.而且n在最新的build的文件中,n没有存在 偶然一次发现,项目更新迭代开发时上传测试环境后就会出现, ...