一文了解数据库迁移工具—Flyway

一文了解数据库迁移工具—Flyway

Flyway是一个数据库版别办理东西,能够十分简略的将数据库的schema从一个版别搬迁到别的一个版别,而且支撑MySql,Oracle,Postgre等多种联系型数据库

What is Flyway

Flyway主要便是通过搬迁(Migration)来对数据库进行版别的控制,对于Flyway而言在数据库上的一切操作都能够称之为搬迁;Flyway有两种搬迁方法:版别化搬迁(Versioned Migration)和可重复的搬迁(Repeatable Migration

Versioned Migrations

Flyway的版别化搬迁有两种方法:

  • 常规的版别晋级(Regular
  • 版别吊销回退(Undo

版别化搬迁包括一个版别,描绘和checksum;版别是仅有的,描绘是用来告知他人这个版别履行了什么操作,校验和(checksum)用于查看当时履行脚本是否有改变,假如有改变那么就会履行失利,由于版别化搬迁中一切的sql脚本只会履行一次

Repeatable Migration

可重复搬迁包括一个描绘(description)和一个校验和(checksum),但没有版别;在可重复搬迁中,只需它的校验和(checksum)发生改变就会履行,校验和便是脚本文件的内容改变

在单次的搬迁操作中,假如一起存在Versioned MigrationRepeatable Migration,那么优先按版别顺序履行Versioned Migration等一切的版别搬迁履行之后,才会履行Repeatable Migration

Migration Format

默许的情况下,版别化搬迁和可重复搬迁能够用SQLJava编写,而且能够包括多个句子;目前Flyway也支撑用脚本语言进行搬迁,目前支撑.ps1, .bat, .cmd, .sh, .bash, .py等脚本

SQL-Based Migration

常用的搬迁方法便是根据sql的搬迁,由于这很容易就能够掌握,而且不需求学习其他的知识,而且能够灵敏的满足各种需求

根据SQL搬迁的文件有如下的命名规矩:

一文了解数据库迁移工具—Flyway

文件名由如下几部分组成:

  • 前缀:V表明版别化,U表明吊销回退,R表明可重复搬迁
  • 版别:版别一般为数字,多个数字之间用点分割,比方:V1.1,V1
  • 分隔符:__双下划线
  • 描绘:表明当时脚本履行的操作类型
  • 后缀:.sql

上面的这些组成部分都是能够进行装备的,假如想装备能够参考这个文档

Java-Based Migration

根据java搬迁是为了更好的满足不易于sql履行的搬迁操作,比方:

  • 二进制数据的更改
  • 批量数据的更改

根据java搬迁的脚本文件和根据SQL搬迁的脚本文件有一些不同:

一文了解数据库迁移工具—Flyway

根据java的搬迁没有了后缀,其他的都是类似的,具体可参考!Flyway文档

Flyway会主动的在文件系统和java classpath中查找搬迁文件;为了追踪搬迁的状况Flyway会在数据库的当时schema中增加表flyway_schema_history对每次搬迁进行记录

Why Flyway

为什么需求Flyway呢?下面咱们通过一个例子来简略的说明咱们为什么需求Flyway,以及Flyway到底能帮咱们处理什么问题

假设,现在咱们有一个项目:Shiny,该项目连接了一个数据库:Shiny DB,它们作为一个全体进行交给;用一个简略的示意图表明为:

一文了解数据库迁移工具—Flyway

在项目的开发周期中,会一起有多个开发者参加到项目,项目完结之后还需求进行继续集成,测验,然后上线到出产,整个流程的示意图能够简略的表明为如下这样:

一文了解数据库迁移工具—Flyway

在整个交给的过程中:

  • 咱们有代码版别控制东西git,确保交给的代码和本地共同
  • 咱们有docker能够打包运用环境,依靠确保和咱们本地有相同的构建环境
  • 而且还有DockerHub之类的镜像仓库来办理镜像版别

一文了解数据库迁移工具—Flyway

但数据库呢?怎么才干确保本地履行的脚本和出产的共同呢

一文了解数据库迁移工具—Flyway

现在很多项目仍是依靠手动履行脚本,但这会引起一些问题:

  • 当时机器上的运用对应的数据库处在什么状况(也便是,履行了那些sql脚本,又有那些没履行)
  • 当时的脚本是应该履行仍是不应该履行呢
  • 在出产中快速修正的问题是否在后面的测验中运用了呢
  • 怎么去布置一个新的数据库实例呢

其实大多数的时分,咱们底子不知道,由于一般一个运用会有很多人操作,但是底子没人会记录当时数据库所在的状况,以致于一点改动都需求花很长的时间去查看,布置

Flyway作为数据搬迁东西很好的处理了这种混乱的状况,它能够让你:

  • 很快的从头创立一个数据库实例
  • 清楚的知道当时数据库所在的状况
  • 以一种确认的方法从当时一个版别搬迁到一个新的版别

SpringBoot With Flyway

SpringBoot中引入Flyway是十分方便的,首先是增加Flyway和相关的依靠;假如运用Maven能够在pom.xml文件中增加如下装备:

<dependency>
  <groupId>org.flywaydb</groupId>
  <artifactId>flyway-core</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>

假如运用Gradle能够在build.gradle中增加如下的依靠装备

compile('org.flywaydb:flyway-core')
compile('org.springframework.boot:spring-boot-starter-jdbc')
compile('org.springframework.boot:spring-boot-starter-web')
compile('mysql:mysql-connector-java')

接下来便是在application.properties中增加数据库和Flyway相关的装备

spring.application.name = flywayapp 
​
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/USERSERVICE?autoreconnect=true
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.testOnBorrow = true
spring.datasource.testWhileIdle = true
spring.datasource.timeBetweenEvictionRunsMillis = 60000
spring.datasource.minEvictableIdleTimeMillis = 30000
spring.datasource.validationQuery = SELECT 1
spring.datasource.max-active = 15
spring.datasource.max-idle = 10
spring.datasource.max-wait = 8000flyway.baselineOnMigrate= false
flyway.outOfOrder= false

flyway相关的装备能够在官方文档中查看

由于flyway默许是在resource/db/migration目录下查找脚本文件,所以咱们在这个目录下创立脚本文件进行数据库的搬迁,命名为:V1__Initial.sql,增加如下的sql句子

CREATE TABLE USERS (ID INT AUTO_INCREMENT PRIMARY KEY, USERID VARCHAR(45));
INSERT INTO USERS (ID, USERID) VALUES (1, 'tutorialspoint.com');

SpringBoot中装备了Datasource之后,当程序发动的之后就会主动注入到Flyway中,所以完结如上的装备之后就能够发动程序进行验证了

参考连接:

flywaydb.org/documentati…

www.tutorialspoint.com/spring_boot…#