使用Flyway来管理数据库版本

Flyway是什么

Flyway是一款数据库迁移(migration)工具。

它可以帮助我们在不同环境保持数据库的同步,减少手工操作,避免数据导入的顺序错误,同时也减少了遗漏的机会。

flyway可以集成在项目中,可以与Spring 框结合。在项目发版时,自动执行数据库脚本,无需人为执行数据库同步操作。

就目前而言,

我们部署应用的流程大概是这样的:

开发人员将应用程序打包、按顺序汇总并整理数据库升级脚本DBA拿到数据库升级脚本检查、备份、执行,以完成数据库升级应部署人员拿到应用部署包,备份、替换,以完成应用程序升级

引入Flyway之后的应用部署流程大概是这样的:

开发人员将应用程序打包应部署人员拿到应用部署包,备份、替换,以完成应用程序升(Flyway将自动执行升级/备份脚本)

Flyway的介绍

1、概念:

Flyway是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。用通俗的话讲,Flyway可以像git管理不同人的代码那样,管理不同人的sql脚本,从而做到数据库同步。

2、支持的数据库类型:

Oracle, SQL Server, SQL Azure, DB2, DB2 z/OS, MySQL (including Amazon RDS), MariaDB, Google Cloud SQL, PostgreSQL (including Amazon RDS and Heroku), Redshift, Vertica, H2, Hsql, Derby, SQLite, SAP HANA, solidDB, Sybase ASE and Phoenix。

3、sql脚本的命名规范:

V+版本号(版本号的数字间以".“或”_"分隔开)+双下划线(用来分隔版本号和描述)+文件描述+后缀名,例如:V2017.9.30__Update.sql。

4、Flyway读取sql脚本的默认位置:

项目的源文件夹下的db/migration目录。

5、指令:

一共就6个基本指令:migrate、clean、info、validate、baseline、repair。

Flyway的命令

Migrate:

manven命令 mvn flyway:migrate

将数据库迁移到最新版本。当数据如果不存在,Flyway 将自动创建示模式历史表。



Migrate是flyway工作流程的核心。它将扫描文件系统或您的类路径以获取可用的迁移。它将它们与应用于数据库的迁移进行比较。如果发现任何差异,它将迁移数据库以缩小差距。

Migrate最好在应用程序启动时执行,以避免数据库与代码期望之间的任何不兼容性。

示例 1: 我们有Migrate可用到版本 9, 数据库在版本 5 。Migrate将按顺序应用迁移 6、7、8 和 9。

示例 2: 我们有Migrate可用到版本 9,数据库位于第 9 版。迁移不起任何作用。

Clean:

  1. manven命令 mvn flyway:clean



Clean可以很好的帮助开发和测试。 它将有效地给你一个全新的开始,通过Clean来清除你的数据库。 所有对象(表、视图、过程…)将会删除。

不用说: 不要对生产数据库使用!

Info:

  1. manven命令 mvn flyway:info



打印有关所有Migrate的详细信息和状态信息。

Info让你知道你的立场。一目了然,您就会看到哪些Migrate已经应用,哪些其他Migrate仍在等待执行中,何时执行,以及它们是否成功。

Validate:

  1. manven命令 mvn flyway:validate



用于校验,范围包括已升级的脚本是否改名,已执行的版本内容是否修改。所有针对已执行的版本进行的改动都会导致校验失败。

执行migrate会自动进行校验,如果失败将不会做任何的migrate。

flyway希望用户提供的脚本是稳定的,以免造成额外的复杂性和混乱。

Undo:

  1. manven命令 mvn flyway:undo



撤消最近应用的版本迁移。

Baseline:

  1. manven命令 mvn flyway:baseline



对现有数据库进行基准测试,如果不存在flyway_schema_history文件,则会直接创建,并以当前状态为版本1

Repair:

  1. manven命令 mvn flyway:repair



修复Flyway模式历史记录表。这将执行以下操作:

在没有DDL事务的数据库上删除所有失败的迁移(留下的用户对象仍必须手动清理)

将可用迁移的校验和,描述和类型与可用迁移重新对齐

结合spring使用

pom.xml引入

  1. <!-- flyway -->
  2. <dependency>
  3. <groupId>org.flywaydb</groupId>
  4. <artifactId>flyway-core</artifactId>
  5. <version>5.2.4</version>
  6. </dependency>

参数配置

  1. flyway.baseline-description对执行迁移时基准版本的描述.
  2. flyway.baseline-on-migrate当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
  3. flyway.baseline-version开始执行基准迁移时对现有的schema的版本打标签,默认值为1.
  4. flyway.check-location检查迁移脚本的位置是否存在,默认false.
  5. flyway.clean-on-validation-error当发现校验错误时是否自动调用clean,默认false.
  6. flyway.enabled是否开启flywary,默认true.
  7. flyway.encoding设置迁移时的编码,默认UTF-8.
  8. flyway.ignore-failed-future-migration当读取元数据表时是否忽略错误的迁移,默认false.
  9. flyway.init-sqls当初始化好连接时要执行的SQL.
  10. flyway.locations迁移脚本的位置,默认db/migration.
  11. flyway.out-of-order是否允许无序的迁移,默认false.
  12. flyway.password目标数据库的密码.
  13. flyway.placeholder-prefix设置每个placeholder的前缀,默认${.
  14. flyway.placeholder-replacementplaceholders是否要被替换,默认true.
  15. flyway.placeholder-suffix设置每个placeholder的后缀,默认}.
  16. flyway.placeholders.[placeholder name]设置placeholdervalue
  17. flyway.schemas设定需要flywary迁移的schema,大小写敏感,默认为连接默认的schema.
  18. flyway.sql-migration-prefix迁移文件的前缀,默认为V.
  19. flyway.sql-migration-separator迁移脚本的文件名分隔符,默认__
  20. flyway.sql-migration-suffix迁移脚本的后缀,默认为.sql
  21. flyway.tableflyway使用的元数据表名,默认为schema_version
  22. flyway.target迁移时使用的目标版本,默认为latest version
  23. flyway.url迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源
  24. flyway.user迁移数据库的用户名
  25. flyway.validate-on-migrate迁移时是否校验,默认为true.

plugins配置

  1. <plugin>
  2. <groupId>org.flywaydb</groupId>
  3. <artifactId>flyway-maven-plugin</artifactId>
  4. <configuration>
  5. <url>url</url>
  6. <user>账号</user>
  7. <password>密码</password>
  8. <driver>com.mysql.cj.jdbc.Driver</driver>
  9. <locations>
  10. <location>地址</location>
  11. </locations>
  12. </configuration>
  13. </plugin>

idea

参考文章:

https://flywaydb.org/documentation/

福禄·研发中心
福小雄

使用Flyway来管理数据库版本的更多相关文章

  1. Spring Boot教程(四十)使用Flyway来管理数据库版本

    在上面的使用JdbcTemplate一文中,主要通过spring提供的JdbcTemplate实现对用户表的增删改查操作.在实现这个例子的时候,我们事先在MySQL中创建了用户表.创建表的过程我们在实 ...

  2. Flyway:Spring Boot中使用Flyway来管理数据库版本

    Flyway简介 Flyway是一个简单开源数据库版本控制器(约定大于配置),主要提供migrate.clean.info.validate.baseline.repair等命令.它支持SQL(PL/ ...

  3. Spring Boot中使用Flyway来管理数据库版本

    flyway是一个开源的数据库迁移工具.类似于数据库的版本控制工具.flyway的数据库修改文件默认放在resource下的db.migration文件夹中,以V{version_number}__{ ...

  4. Spring Boot 2.x基础教程:使用Flyway管理数据库版本

    之前已经介绍了很多在Spring Boot中使用MySQL的案例,包含了Spring Boot最原始的JdbcTemplate.Spring Data JPA以及我们国内最常用的MyBatis.同时, ...

  5. 使用 Liquibase 管理数据库版本 - SpringBoot 2.7 .2 实战基础

    优雅哥 SpringBoot 2.7 .2 实战基础 - 05 -使用 Liquibase 管理数据库版本 在企业开发中,数据库版本管理好像是一个伪命题,大多项目都是通过 Power Designer ...

  6. SpringBoot系列: 使用 flyway 管理数据库版本

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

  7. 转:SpringBoot系列: 使用 flyway 管理数据库版本

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

  8. flyway 管理数据库版本

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

  9. Team Foundation Server (TFS)集成Flyway,实现数据库的版本管理

    1 概述 在系统开发过程中,我们对软件源代码的版本管理,已经有了比较成熟的解决方案.通过使用TFVC或GIT等源代码管理工具,可以非常方便的对软件代码实现回退.比较.分支合并等版本操作.对于软件依赖的 ...

随机推荐

  1. easyui datagrid 自定义单元格单击与双击事件(Day_38)

    $(function(){ $('#tableId').datagrid({//单击事件   onClickRow:function(rowIndex,rowData){  alert("单 ...

  2. Git 系列教程(14)- 远程分支

    远程分支 远程引用是对远程仓库的引用(指针),包括分支.标签等等 你可以通过 git ls-remote <remote> 来显式地获得远程引用的完整列表 polo@B-J5D1MD6R- ...

  3. HTML的一些标签以及表单

    HTML的一些标签以及表单 图片标签 属性 说明 src 图像的路径 alt 图像不能显示时的替换文字 title 鼠标悬停时显示的内容 border 设置图像边框的宽度 align 对齐方式 相对路 ...

  4. 归一化方法总结 | 又名“BN和它的后浪们“

    前言: 归一化相关技术已经经过了几年的发展,目前针对不同的应用场合有相应的方法,在本文将这些方法做了一个总结,介绍了它们的思路,方法,应用场景.主要涉及到:LRN,BN,LN, IN, GN, FRN ...

  5. 3D网页小实验-基于Babylon.js与recast.js实现RTS式单位控制

    一.运行效果 1.建立一幅具有地形起伏和不同地貌纹理的地图: 地图中间为凹陷的河道,两角为突出的高地,高地和低地之间以斜坡通道相连. 水下为沙土材质,沙土材质网格贴合地形,河流材质网格则保持水平. 2 ...

  6. 在浏览器上运行 VS Code——GitHub 热点速览 v.21.22

    作者:HelloGitHub-小鱼干 和小程序类似,如果平时开发所用到的软件也能运行在浏览器中,"用完即走"岂不妙哉?code-server 便是一个让人在浏览器运行 VS Cod ...

  7. mybatis运行出现org.apache.ibatis.binding.BindingException

    今天学习mybatis的第一天,发现用junit测试报出了次异常:org.apache.ibatis.binding.BindingException: Type interface cn.dzp.d ...

  8. NNVM Compiler,AI框架的开放式编译器

    NNVM Compiler,AI框架的开放式编译器 深度学习已变得无处不在且不可或缺.在多种平台(例如手机,GPU,IoT设备和专用加速器)上部署深度学习工作负载的需求不断增长.宣布了TVM堆栈,以弥 ...

  9. 如何保证Qt状态机的最佳性能

    如何保证Qt状态机的最佳性能 How to ensure the best Qt state machine performance 如果您使用Qt进行应用程序开发,并且使用状态机,那么很可能您正在使 ...

  10. 如何在CentOS 7上搭建LAMP环境(使用YUM或编译)

    什么是LAMP? LAMP是Linux,Apache,MySQL和PHP的缩写. 它是一堆应用程序的堆栈,它们在Web服务器上一起工作以托管网站. 话虽如此,每个程序都有不同的目的: 在LAMP中, ...