flyway配置mysql_Flyway快速上手教程

一、Flyway是什么

官网解释地非常全面,可先大致阅读一下。

简单地说,flyway是一个能对数据库变更做版本控制的工具。

二、为什么要用Flyway

在多人开发的项目中,我们都习惯了使用SVN或者Git来对代码做版本控制,主要的目的就是为了解决多人开发代码冲突和版本回退的问题。

其实,数据库的变更也需要版本控制,在日常开发中,我们经常会遇到下面的问题:

自己写的SQL忘了在所有环境执行;

别人写的SQL我们不能确定是否都在所有环境执行过了;

有人修改了已经执行过的SQL,期望再次执行;

需要新增环境做数据迁移;

每次发版需要手动控制先发DB版本,再发布应用版本;

其它场景...

有了flyway,这些问题都能得到很好的解决。

三、如何使用Flyway

3.1 准备数据库

首先,我们需要准备好一个空的数据库。(数据库的安装和账密配置此处忽略)

此处以mysql为例,在本地电脑上新建一个空的数据库,名称叫做flyway,我们通过dbeaver看到的样子如下:

567a8a161641

新建一个空的数据库

3.2 准备SpringBoot工程

在start.spring.io上新建一个SpringBoot工程,要求能连上自己本地新建的mysql数据库flyway,这个步骤也比较简单,就不再细讲。

但要注意的是,application.properties中数据库的配置务必配置正确,下述步骤中系统启动时,flyway需要凭借这些配置连接到数据库。这里贴一份:

# db config

spring.datasource.url=jdbc:mysql://localhost:3306/flyway?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT

spring.datasource.username=root

spring.datasource.password=root

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

3.3flyway的引入与尝试

首先,在pom文件中引入flyway的核心依赖包:

org.flywaydb

flyway-core

5.2.4

其次,在src/main/resources目录下面新建db.migration文件夹,默认情况下,该目录下的.sql文件就算是需要被flyway做版本控制的数据库SQL语句。

但是此处的SQL语句命名需要遵从一定的规范,否则运行的时候flyway会报错。命名规则主要有两种:

仅需要被执行一次的SQL命名以大写的"V"开头,后面跟上"0~9"数字的组合,数字之间可以用“.”或者下划线"_"分割开,然后再以两个下划线分割,其后跟文件名称,最后以.sql结尾。比如,V2.1.5__create_user_ddl.sql、V4.1_2__add_user_dml.sql。

可重复运行的SQL,则以大写的“R”开头,后面再以两个下划线分割,其后跟文件名称,最后以.sql结尾。。比如,R__truncate_user_dml.sql。

其中,V开头的SQL执行优先级要比R开头的SQL优先级高。

如下,我们准备了三个脚本,分别为:

V1__create_user.sql,其中代码如下,目的是建立一张user表,且只执行一次。

CREATE TABLE IF NOT EXISTS `USER`(

`USER_ID` INT(11) NOT NULL AUTO_INCREMENT,

`USER_NAME` VARCHAR(100) NOT NULL COMMENT '用户姓名',

`AGE` INT(3) NOT NULL COMMENT '年龄',

`CREATED_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,

`CREATED_BY` varchar(100) NOT NULL DEFAULT 'UNKNOWN',

`UPDATED_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,

`UPDATED_BY` varchar(100) NOT NULL DEFAULT 'UNKNOWN',

PRIMARY KEY (`USER_ID`)

)ENGINE=InnoDB DEFAULT CHARSET=utf8;

V2__add_user.sql,其中代码如下,目的是往user表中插入一条数据,且只执行一次。

insert into `user`(user_name,age) values('lisi',33);

R__add_unknown_user.sql,其中代码如下,目的是每次启动倘若有变化,则往user表中插入一条数据。

insert into `user`(user_name,age) values('unknown',33);

与之相对应的目录截图如下:

567a8a161641

项目目录结构

其中2.1.6、2.1.7和every的文件夹不会影响flyway对SQL的识别和运行,可以自行取名和分类。

到这一步,flyway的默认配置已经足够我们开始运行了。此时,我们启动SpringBoot的主程序,如果以上步骤没有配置错误的话,运行截图如下:

567a8a161641

flyway成功运行

此时,我们刷新数据库,可以看到flyway的历史记录表已经生成并插入了三个版本的记录:

567a8a161641

flyway_schema_history

而且,user表也已经创建好了并插入了两条数据:

567a8a161641

user

我们不改变任何东西,再次执行主程序,日志如下:

567a8a161641

再次执行flyway

两张数据库表中的内容也毫无任何变化。

可是,如果我们修改V2__add_user.sql中的内容,再次执行的话,就会报错,提示信息如下:

[ERROR] Migration checksum mismatch for migration version 2

如果我们修改了R__add_unknown_user.sql,再次执行的话,该脚本就会再次得到执行,并且flyway的历史记录表中也会增加本次执行的记录。

3.4 maven插件的使用

以上步骤中,每次想要migration都需要运行整个springboot项目,并且只能执行migrate一种命令,其实flyway还是有很多其它命令的。maven插件给了我们不需要启动项目就能执行flyway各种命令的机会。

在pom中引入flyway的插件,同时配置好对应的数据库连接。

org.flywaydb

flyway-maven-plugin

5.2.4

jdbc:mysql://localhost:3306/flyway?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT

root

root

com.mysql.cj.jdbc.Driver

然后更新maven插件列表,就可以看到flyway的全部命令了。

567a8a161641

flyway的各种命令

此时,我们双击执行上图中的flyway:migrate的效果和启动整个工程执行migrate的效果是一样的。

其它命令的作用如下列出,各位可自行实验体会:

baseline

对已经存在数据库Schema结构的数据库一种解决方案。实现在非空数据库新建MetaData表,并把Migrations应用到该数据库;也可以在已有表结构的数据库中实现添加Metadata表。

clean

清除掉对应数据库Schema中所有的对象,包括表结构,视图,存储过程等,clean操作在dev 和 test阶段很好用,但在生产环境务必禁用。

info

用于打印所有的Migrations的详细和状态信息,也是通过MetaData和Migrations完成的,可以快速定位当前的数据库版本。

repair

repair操作能够修复metaData表,该操作在metadata出现错误时很有用。

undo

撤销操作,社区版不支持。

validate

验证已经apply的Migrations是否有变更,默认开启的,原理是对比MetaData表与本地Migrations的checkNum值,如果值相同则验证通过,否则失败。

3.5 flyway补充知识

flyway执行migrate必须在空白的数据库上进行,否则报错;

对于已经有数据的数据库,必须先baseline,然后才能migrate;

clean操作是删除数据库的所有内容,包括baseline之前的内容;

尽量不要修改已经执行过的SQL,即便是R开头的可反复执行的SQL,它们会不利于数据迁移;

四、总结

在进行了如上的实验后,相信我们都已经掌握了flyway的初步使用,当需要做数据迁移的时候,更换一个新的空白数据库,执行下migrate命令,所有的数据库更改都可以一步到位地迁移过去,真的是太方便了。

附录

flyway的配置清单:

flyway.baseline-description对执行迁移时基准版本的描述.

flyway.baseline-on-migrate当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.

flyway.baseline-version开始执行基准迁移时对现有的schema的版本打标签,默认值为1.

flyway.check-location检查迁移脚本的位置是否存在,默认false.

flyway.clean-on-validation-error当发现校验错误时是否自动调用clean,默认false.

flyway.enabled是否开启flywary,默认true.

flyway.encoding设置迁移时的编码,默认UTF-8.

flyway.ignore-failed-future-migration当读取元数据表时是否忽略错误的迁移,默认false.

flyway.init-sqls当初始化好连接时要执行的SQL.

flyway.locations迁移脚本的位置,默认db/migration.

flyway.out-of-order是否允许无序的迁移,默认false.

flyway.password目标数据库的密码.

flyway.placeholder-prefix设置每个placeholder的前缀,默认${.

flyway.placeholder-replacementplaceholders是否要被替换,默认true.

flyway.placeholder-suffix设置每个placeholder的后缀,默认}.

flyway.placeholders.[placeholder name]设置placeholder的value

flyway.schemas设定需要flywary迁移的schema,大小写敏感,默认为连接默认的schema.

flyway.sql-migration-prefix迁移文件的前缀,默认为V.

flyway.sql-migration-separator迁移脚本的文件名分隔符,默认__

flyway.sql-migration-suffix迁移脚本的后缀,默认为.sql

flyway.tableflyway使用的元数据表名,默认为schema_version

flyway.target迁移时使用的目标版本,默认为latest version

flyway.url迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源

flyway.user迁移数据库的用户名

flyway.validate-on-migrate迁移时是否校验,默认为true

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql主从 单点_MySQL主从复制虽好,能完美解决数据库单点问题吗?

一、单个数据库 服务器 的缺点数据库服务器存在单点问题;数据库服务器资源无法满足增长的读写请求;高峰时数据库连接数经常超过上限。二、如何解决单点问题增加额外的数据库服务器,组建数据库集群;同一集群中的数据库服务器需要具…

java ora 28040_Oracle 11g与112c中ORA-28040 错误解决

今天遇到一个连接192.168.56.102这个库报错Java.sql.SQLException: ORA-28040: No matching authentication protocolOracle 12C下查询此报错oralce:/oracle/db/app/12.1.0/db/network/admin> oerr ora 2804028040, 0000, "No matching authentication protocol"/…

java实验_Java实验报告(实验一)

课程:Java程序设计 班级: 1351姓名:王玮怡 学号:20135116成绩: 指导教师:娄嘉鹏 实验日期:2015.04.15实验密级: 预习程度&#…

java web 文件上传工具类_JavaWeb中实现文件上传的方式有哪些?

上回我们说了下文件下载的方式有哪些,这次我们从不同的环境下简单来说说文件上传的方式有哪些。文件上传的方式Servlet2.5 方式Servlet3.0 方式SpringMVC 方式案例实操Servlet2.5 方式文件上传涉及到前台页面的编写和后台服务器端代码的编写,前台发送文件…

centos上如何装python_centos如何安装Python3

摘自:https://www.cnblogs.com/Mr-wangxd/p/7028285.htmlLinux下默认系统自带python2.6的版本,这个版本被系统很多程序所依赖,所以不建议删除,如果使用最新的Python3那么我们知道编译安装源码包和系统默认包之间是没有任何影响的&…

java 字节输出流_Java IO详解(三)------字节输入输出流

那么这篇博客我们讲的是字节输入输出流:InputStream、OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam、FileOutStream)1、字节输出流:OutputStreampublic abstract class OutputStreamextends Objectimplements C…

java 缩略图 库_Thumbnailator:一个高质量Java缩略图开发库

February 24, 2020: Thumbnailator 0.4.11 has been released! See Changes for details.Thumbnailator is now available through Maven!What is Thumbnailator?Thumbnailator is a thumbnail generation library for Java.Why Thumbnailator?Making high-quality thumbnail…

java数据段 静态区_回顾一下基础,关于栈与堆,常量池,静态区

先来张简单的图:1.jpg------------------分割------------------------栈内存:1.操作比较快速.但是为私有.2.线程之间不共享.所以存放一些基本数据类型,局部变量(方法走完就回收了),3.对于引用数据类型的地址引用.堆内存:1.new出来的实例2.成员变量的值(如果是基本数据类型,比如…

java项目如何更改路径_Java修改eclipse中web项目的server部署路径问题

和MyEclipse不一样,在Eclipse中做的Web项目默认是不支持将项目发布到Web服务器上的,会发布到工作空间的某个目录,因此无法在外部启动Tomcat来运行Web项目,只有打开Eclipse中的服务器,才能运行Web项目。所以要对Eclipse…

java xpdf 转换成html_java将Word/Excel/PDF文件转换成HTML整理

项目开发过程中,需求涉及到了各种文档转换为HTML或者网页易显示格式,现在将实现方式整理如下:一、使用Jacob转换Word,Excel为HTML“JACOB一个Java-COM中间件.通过这个组件你可以在Java应用程序中调用COM组件和Win32 libraries。”首先下载Jac…

mysql 出现 quot_MYSQL 新版出现 Client does_mysql _ 搞代码

mysql 帮助:A.2.3 Client does not support authentication protocolMySQL 4.1 and up uses an authentication protocol based on a password hashing algorithm that is incompatible with that used by older clients. If you upgrade the server to 4.1, attemp…

Java可移动性不强_java地位无可撼动的原因

如今,面对曾经在程序员中被各种新技术掩盖直至堙灭的技术值得怀念。犹如COBOL这当年被老程序员们尊为神器的语言如今也基本没有价值。而Java作为现代程序员的中坚力量在这点上会不会成为下一个COBOL?有关JAVA的技术卖出多少本书已经是一个很久远的记忆了…

php数据回显是什么意思,jquery回显是什么意思

首先来看一下回显是什么意思?在数据提交出现错误的时候, 已填写的信息仍在文本框中, 比如用户登录, 当用户输入错误的密码之后, 用户名仍在文本框, 只是密码框清空。对于一些要填写很多信息的表单, 如果因为一些错误导致已经填写的整个表单信息重新填写, 对于用户非…

Java摩托车汽车轮胎数量,摩托车轮子上的知识,你知道多少?

原标题:摩托车轮子上的知识,你知道多少?摩托车轮子好比人的两条腿,决定了车子跑得远,跑得快和跑得是否安稳。摩友们似乎对轮子的关心不多,因为它是易损件,概念中轮子轮胎出了问题,随便找路边的“风火补胎”…

php配置文件加盐解密,PHP实现支持加盐的图片加密解密

一个简单的图片加解密函数&#xff0c;使用client跑&#xff0c;不要使用浏览器跑话不多说&#xff0c;直接上代码/*** Created by hello.* User: qq 845875470* Date: 2016/4/2* Time: 11:21*/$notice <<为了稳定性&#xff0c;必须在客户端跑格式 &#xff1a;php pat…

Oracle导入dmp文件报12504,ORA-12504:TNS :监听程序在 CONNECT_DATA 中未获得SERVICE_NAME...

使用本地的SQLPlus连接服务器上的Oracle数据库&#xff0c;这是由于本地有安装了Oracle数据库服务&#xff0c;所以才会系统先提示&#xff1a;ORA-12504:TNS: 监听程序在 CONNECT_DATA 中未获得 SERVICE_NAME再次输入用户名密码系统又提示&#xff1a;ORA-12560: TNS: 协议适配…

linux+有趣的指令,6个有趣的Linux命令(乐趣终端) - 第二部分

在我们过去的以下文章中&#xff0c;我们展示了一些关于Linux的有趣命令的有用文章&#xff0c;这表明Linux并不像看起来那么复杂&#xff0c;如果我们知道如何使用它&#xff0c;就会很有趣。 Linux命令行可以非常容易地完成任何复杂的任务&#xff0c;可以有趣和快乐。有趣的…

dvwa安装包linux,dvwa安裝、配置、使用教程(Linux)

一、搭建LAMP環境二、安裝DVWA2.1 下載dvwa2.2 解壓安裝將下載的應用解壓到apache默認的主目錄/var/www/html&#xff1a;unzip DVWA-master.zip -d /usr/www/html2.3 啟用功能dvwa上的漏洞&#xff0c;需要些刻意的配置才能被利用。訪問&#xff1a;http://172.0.0.2/dvwa如下…

八数码c语言编程深度搜索,广度优先搜索解 八数码, 求意见, 求bug/

已结贴√问题点数&#xff1a;100 回复次数&#xff1a;31广度优先搜索解 , 求意见&#xff0c; 求bug/我得去买票了&#xff0c;....#include #include #include #define NUM 5typedef struct bgMatrix{int v, w;char matrix[NUM][NUM];int pre;}Matrix;typedef struct bgQueu…

linux定时任务每两天执行,Linux定时任务 crontab每秒执行 实现2种方法

linux crontab 命令&#xff0c;最小的执行时间是一分钟&#xff0c; 如果要在小于一分钟执行。就要换个方法来实现&#xff0c;下面分别以两种方法来实现&#xff1a;tolog.phpfile_put_contents(/home/fujieace/php/crontab/run.log, date(Y-m-d H:i:s)."\r\n", FI…