flyway 管理数据库版本

Flyway 和 Liquibase 都是 Java 项目中常用的 DB migration 工具, 从使用简便性看,Flyway 比 Liquibase 更简单, 从 github 的 star 数量看, flyway 更受欢迎.

============================== 
flyway 命令行工具和 maven 插件
==============================
对于 SpringBoot 项目开发, 其实不需要专门安装 flyway 命令行工具和 maven 插件, SpringBoot 启动就会自动执行 DB migrate 操作. 对于其他的 flyway 操作, 就需要使用命令行工具或 maven 插件了.

flyway 提供命令行工具, 常用的命令包括:
Clean: 删除所有创建的数据库对象, 包括用户、表、视图等. 注意不要在生产库上执行 clean 操作. 
Migrate: 对数据库依次应用版本更改. 
Info: 获取目前数据库的状态. 那些迁移已经完成, 那些迁移待完成. 所有迁移的执行时间以及结果. 
Validate: 验证已 Apply 的脚本是否有变更, Flyway 的 Migration 默认先做 Validate. 
Baseline: 根据现有的数据库结构生成一个基准迁移脚本. 
Repair: 修复命令尽量不要使用, 修复场景有: 1. 移除失败的 migration 记录. 2.已经应用的 SQL 脚本被修改, 我们想重新应用该 SQL 脚本.

maven 插件, 最新 maven 插件见 https://mvnrepository.com/artifact/org.flywaydb/flyway-maven-plugin

<plugin>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-maven-plugin</artifactId>
    <version>4.0.3</version>
</plugin>

maven插件命令, mvn flyway:migrate

==============================
Flyway 的工作原理
==============================
flyway 需要在 DB 中先创建一个 metdata 表 (缺省表名为 flyway_schema_history), 在该表中保存着每次 migration 的记录, 记录包含 migration 脚本的版本号和 SQL 脚本的 checksum 值. 当一个新的 SQL 脚本被扫描到后, Flyway 解析该 SQL 脚本的版本号, 并和 metadata 表已 apply 的的 migration 对比, 如果该 SQL 脚本版本更新的话, 将在指定的 DB 上执行该 SQL 文件, 否则跳过该 SQL 文件.

两个 flyway 版本号的比较, 采用左对齐原则, 缺位用 0 代替. 举例如下: 
1.2.9.4 比 1.2.9 版本高. 
1.2.10 比 1.2.9.4 版本高. 
1.2.10 和 1.2.010 版本号一样高, 每个版本号部分的前导 0 会被忽略.

Flyway SQL 文件可以分为两类: Versioned 和 Repeatable. 
Versioned migration 用于版本升级, 每个版本有唯一的版本号并只能 apply 一次. 
Repeatable migration 是指可重复加载的 migration, 一旦 SQL 脚本的 checksum 有变动, flyway 就会重新应用该脚本. 它并不用于版本更新, 这类的 migration 总是在 versioned migration 执行之后才被执行.

默认情况下, Migration SQL的命名规则如下图:

其中的文件名由以下部分组成,除了使用默认配置外,某些部分还可自定义规则.

prefix: 可配置,前缀标识,默认值 V 表示 Versioned, R 表示 Repeatable
version: 标识版本号, 由一个或多个数字构成, 数字之间的分隔符可用点.或下划线_
separator: 可配置, 用于分隔版本标识与描述信息, 默认为两个下划线__
description: 描述信息, 文字之间可以用下划线或空格分隔
suffix: 可配置, 后续标识, 默认为.sql

flyway 的 metadata 表结果如下:

CREATE TABLE  flyway_schema_history
    (
        installed_rank INT NOT NULL,
        version VARCHAR(50),
        description VARCHAR(200) NOT NULL,
        type VARCHAR(20) NOT NULL,
        script VARCHAR(1000) NOT NULL,
        checksum INT,
        installed_by VARCHAR(100) NOT NULL,
        installed_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        execution_time INT NOT NULL,
        success TINYINT(1) NOT NULL,
        PRIMARY KEY (installed_rank),
        INDEX flyway_schema_history_s_idx (success)
    )
    ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

==============================
pom.xml
==============================
spring-boot-starter-parent 包没有使用最新的 2.0.5, 最新版总是导致 HikariPool 无法初始化, 所以选择的版本是 2.0.4

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

flyway 其实仅依赖 spring-boot-starter-jdbc 包,

    <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>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

加上 spring-boot-maven-plugin , 可生成 fat jar.

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>      

==============================
application.properties 参数
==============================

## 设定 db source 属性
spring.datasource.url=jdbc:mysql://localhost:3306/world
spring.datasource.username=root
spring.datasource.password=toor

## 设定 flyway 属性
spring.flyway.cleanDisabled = true
  # flyway 的 clean 命令会删除指定 schema 下的所有 table, 杀伤力太大了, 应该禁掉.
spring.flyway.enabled = true
  # 启用或禁用 flyway
spring.flyway.locations =classpath:db/migration
  # 设定 SQL 脚本的目录,多个路径使用逗号分隔, 比如取值为 classpath:db/migration,filesystem:/sql-migrations
spring.flyway.baselineOnMigrate=true
  # 如果指定 schema 包含了其他表,但没有 flyway schema history 表的话, 在执行 flyway migrate 命令之前, 必须先执行 flyway baseline 命令.
  # 设置 spring.flyway.baseline-on-migrate 为 true 后, flyway 将在需要 baseline 的时候, 自动执行一次 baseline.
spring.flyway.baselineVersion=1
  # 指定 baseline 的版本号,缺省值为 1, 低于该版本号的 SQL 文件, migrate 的时候被忽略.
#spring.flyway.encoding=
  # Encoding of SQL migrations (default: UTF-8)
spring.flyway.table=flyway_schema_history_myapp
  # 设定 flyway 的 metadata 表名, 缺省为 flyway_schema_history
spring.flyway.outOfOrder=true
  # 开发环境最好开启 outOfOrder, 生产环境关闭 outOfOrder .
#spring.flyway.schemas=
  # 需要 flyway 管控的 schema list, 缺省的话, 使用的时 dbsource.connection直连上的那个 schema, 可以指定多个schema, 但仅会在第一个schema下建立 metadata 表, 也仅在第一个schema应用migration sql 脚本. 但flyway Clean 命令会依次在这些schema下都执行一遍. 

更多参数见 https://flywaydb.org/documentation/configfiles , 需要说明的是, 这些参数配到springboot2 项目中, 需要加上 spring. 前缀.

==============================
flyway 最佳实践
============================== 
1. SQL 的文件名
开发环境和生产环境的 migration SQL 不共用. 开发过程往往是多人协作开发, DB migration 也相对比较频繁, 所以 SQL 脚本会很多. 而生产环境 DB migration 往往由 DBA 完成, 每次升级通常需要提交一个 SQL 脚本.

(1). 开发环境 SQL 文件建议采用时间戳作为版本号. 
开发环境 SQL 文件建议采用时间戳作为版本号, 多人一起开发不会导致版本号争用, 同时再加上生产环境的版本号, 这样的话, 将来手工 merge 成生产环境 V1.2d migration 脚本也比较方便, SQL 文件示例:
V20180317.10.59__V1.2_Unique_User_Names.sql
V20180317.14.59__V1.2_Add_SomeTables.sql

(2). 生产环境 SQL 文件, 应该是手动 merge 开发环境的 SQL 脚本, 版本号按照正常的版本, 比如 V2.1.5_001__Unique_User_Names.sql

2. migration 后的SQL 脚本不应该再被修改.

3. spring.flyway.outOfOrder 取值 true /false
对于开发环境, 可能是多人协作开发, 很可能先 apply 了自己本地的最新 SQL 代码, 然后发现其他同事早先时候提交的 SQL 代码还没有 apply, 所以 开发环境应该设置 spring.flyway.outOfOrder=true, 这样 flyway 将能加载漏掉的老版本 SQL 文件; 而生产环境应该设置 spring.flyway.outOfOrder=false

4. 多个系统公用要 DB schema 
很多时候多个系统公用一个 DB schema , 这时候使用 spring.flyway.table 为不同的系统设置不同的 metadata 表, 缺省为 flyway_schema_history

转自:https://www.cnblogs.com/harrychinese/p/springboot_flyway.html

原文地址:https://www.cnblogs.com/itplay/p/10974701.html

时间: 2024-11-08 14:25:22

flyway 管理数据库版本的相关文章

企业分布式微服务云SpringCloud SpringBoot mybatis (十五)Spring Boot中使用Flyway来管理数据库版本

Flyway简介 Flyway是一个简单开源数据库版本控制器(约定大于配置),主要提供migrate.clean.info.validate.baseline.repair等命令.它支持SQL(PL/SQL.T-SQL)方式和Java方式,支持命令行客户端等,还提供一系列的插件支持(Maven.Gradle.SBT.ANT等). 官方网站:https://flywaydb.org/ 本文对于Flyway的自身功能不做过多的介绍,读者可以通过阅读官方文档或利用搜索引擎获得更多资料.下面我们具体说说

Flyway 助力数据库脚本自动化管理攻略

原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」.一群同频者,一起成长,一起精进,打破认知的局限性. 今天,探讨一个有趣的话题:我们可以通过 Git 来实现项目版本控制:通过?Jenkins 进行持续集成,那么对于数据库层面,我们仍然依赖于纯手工运行 SQL 脚本,对此,我们在多环境(开发环境.测试环境.预发环境.生产环境)中如何确保其 SQL 脚本的最新性和正确性? 众所周知,人工的操作非常容易出问题,我们应该让程序帮忙自动进行管理和

Spring Boot集成Flyway实现数据库版本控制?

今天给大家介绍一款比较好用的数据库版本控制工具Flyway.在通过Spring Boot构建微服务的过程中,一般情况下在拆分微服务的同时,也会按照系统功能的边界对其依存的数据库进行拆分.在这种情况下,微服务的数据库版本管理对于研发工程管理来说,就会是一个比较棘手的问题. 在正常的代码管理流程中,从产品研发研发的过程看,一般会经历功能开发.研发测试.集成测试.预发布测试.上线等多个环节.而对于同一个产品功能,可能还会涉及对多个微服务代码及数据库结构的改动. 而这些改动需要我们在以上流程中每发布一个

【转】使用PowerDesigner的建模创建升级管理数据库

使用PowerDesigner的建模创建升级管理数据库 PowerDesigner是一种著名的CASE建摸工具,最开始为数据库建模设计,即物理模型(Physical Data Model)用于生成数据库表结构,还有面向对象模型(Object Oriented Model),用于建立UML模型的结构,可以直接生成CS代码,还有其他的模型等等,不同的模型之间可以相互的转化.我最中意的就是它的物理模型直接设计生成数据库,给我们对数据库的生成升级维护带来极大的方便,下面主要来讲一下它的物理模型设计. 1

ASP进阶教程Ⅷ:数据库版本的留言簿

在前面我们介绍了文件版本的留言簿,现在我们不妨来设想一下:如果留言文件里面的留言很多,而你又急于想寻找其中的某条留言时,这时打开txt留言文件,对着一段段的留言记录,你敢担保你不会当场晕倒吗?而且文件留言簿最令人讨厌还远不只是这个原因,更气人的是:譬如你已经找到了你要找的留言,而且是非要将其删除不可(当然是因为那段留言竟毫不留情地往你脸上抹黑的缘由啦),那么此时其余想对你大发赞赏之言的朋友,就会因为你正在做留言删除的操作而不能留言了.看,这有多可惜!不过,你也无须叹气,虽然留言文件不能供多人共用

[转]Oracle DB 管理数据库存储结构

? 描述块中表行数据的存储 ? 创建和管理表空间 ? 获取表空间信息 表数据的存储方式 创建表时,还会创建一个用于保存其数据的段.表空间包含一个段集合. 从逻辑上来说,表包含许多行列值.行最终以行片段的形式存储在数据库块中.之所以称其为行片段,是因为在某些情况下可能不会在一个位置存储完整的行.当插入的行太大而无法装入单个块时(链接行),或当更新导致现有行超出当前块的可用空闲空间时(迁移行),就会发生这种情况.当表中的列多于255 列时,也会使用行片段.在这种情况下,这些行片段可能位于同一个块(块

配置管理之数据库版本控制策略

软件配置管理(Software Configuration Management,SCM)是界定软件的组成部分,对每个部分的变更进行版本控制,并维护不同部分之间的版本关联,以使软件在开发过程中任一时间的内容都可以被追溯的管理过程.软件配置管理通常包括版本控制.变更控制和过程支持三个大的方面,涉及配置项.工作空间管理.版本控制.变更控制.状态报告.配置审计等具体活动,软件配置管理一般会贯穿到整个软件研发生命周期以及各个知识领域,本文不做具体展开. 数据库版本是研发过程中需要把控的一个方面,但实际操

sybase数据库版本

日常运维的产品有Symantec 的netbackup,内嵌的是Sybase数据库,为了方便查询一些数据,决定安装个Sybase数据库软件,可以通过语句更灵活的进行管理.之前只使用过SybaseIQ,它是数据仓库软件,在网上搜了一下发现Sybase数据库有ASE.ASA. 他们之间有什么区别:ASE,Adaptive Server Enterprise,也就是说企业版的,应用于企业级:ASA,Adaptive Server Anywhere,轻量级,应用于移动设备,嵌入式设备等等. sybase

Windows Azure创建管理数据库

上一篇我们介绍了,windows azure上的功能,今天主要介绍如何在windows azure上创建sql 数据库及管理数据库.在Azure上创建的数据库,只能通过sql manage studio进行远程管理,同时设置允许链接ip进行远程管理,同时在windows Azure上的数据库操作管理只能通过SQL语句进行操作管理.哈哈,给我的感觉又回到了学校时代,老师教大家通过sql语句进行管理数据库,这次有用武之地了. 我们首先打开windows azure控制面板,选择SQL数据库功能菜单,