Flyway

什么是Flyway

Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的原则。Flyway可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要复杂的配置。

为什么使用Flyway

通常在项目开始时会对数据库进行全局设计,但是在实际开发过程中,难免会遇到需要更新数据库Schema的情况,比如说添加新表,添加新字段或约束等。当开发人员完成了对数据库变更的SQL脚本之后,如何快速的在其他开发者机器上同步呢?如何在测试服务器上快速同步呢?如何保证集成测试能够顺利执行并通过呢?
假设以SpringBoot技术栈为例,有人可能会说,本地使用Hibernate自动更新数据库Schema模式,然后让QA或DEV到测试服务器上手动执行SQL脚本,同时写一个Gradle任务自动执行更新。但是实际上,Hibernate自动更新数据库,不靠谱,不透明,控制自由度不高,有时很容易就会犯错。比如说,SQL创建的某个字段是VARCHAR类型,而在Entity中配置的是CHAR类型,在集成测试时,虽然测试能通过,但是不是期望的行为。手动执行SQL脚本费时费力,有一个插件或库能更好的实现这个功能,何乐而不为呢。

Flyway的特性

  • 自动升级(自动发现更新项):Flyway会将任意版本的数据库升级到最新版本。
  • Flyway可以通过命令行执行,通过Ant脚本执行,通过Maven脚本执行(这样就可以在集成环境自动执行),并且可以在应用中执行(比如说在应用启动时执行)。
  • 规约优于配置:Flyway有一套默认的规约,所以不需要修改任何配置就可以正常使用。
  • 既支持SQL脚本,又支持Java代码:可以使用SQL脚本执行数据库更新,也可以使用Java代码来进行一些高级数据升级操作。
  • 高可靠性:在集群环境下进行数据库升级是安全可靠的。
  • 支持清除已存在的库表结构:Flyway可以清除已存在的库表结构,可以从零开始搭建库表结构,并管理数据库版本升级工作。
  • 支持失败修复:2.0以后的版本提供了repair功能,用于解决数据库更新失败的问题。

命名规范

![nameRules.PNG-14.5kB][1]
1.前缀(可配置,默认值:V)
2.版本(以点或下划线区分开来,只要你喜欢,你可以使用很多地方)
3.分隔符(两个下划线)
4.描述(下划线或空格分开)
5.后缀(可配置,默认情况下:sql)

Flyway的六种命令

1.migrate

Migrate是指把数据库Schema迁移到最新版本,是Flyway工作流的核心功能。Flyway在Migrate时会检查Metadata(元数据)表,如果不存在会创建Metadata表,Metadata表主要用于记录版本变更历史以及Checksum之类的。
Migrate时会扫描指定文件系统或Classpath下的Migrations(可以理解为数据库的版本脚本),并且会逐一比对Metadata表中的已存在的版本记录,如果有未应用的Migrations,Flyway会获取这些Migrations并按次序Apply到数据库中,否则不需要做任何事情。另外,通常在应用程序启动时应默认执行Migrate操作,从而避免程序和数据库的不一致性。

2.clean

清除掉对应数据库Schema中的所有对象,包括表结构,视图,存储过程,函数以及所有的数据等都会被清除。Clean操作在开发和测试阶段是非常有用的,它能够帮助快速有效地更新和重新生成数据库表结构,但特别注意的是:不应在Production的数据库上使用!

3. info

Info用于打印所有Migrations的详细和状态信息,其实也是通过Metadata表和Migrations完成的。 Info能够帮助快速定位当前的数据库版本,以及查看执行成功和失败的Migrations。

4.validate

验证已经Apply的Migrations是否有变更,Flyway是默认是开启验证的。

5.baseline

Baseline针对已经存在Schema结构的数据库的一种解决方案,即实现在非空数据库中新建Metadata表,并把Migrations应用到该数据库。
Baseline可以应用到特定的版本,这样在已有表结构的数据库中也可以实现添加Metadata表,从而利用Flyway进行新Migrations的管理了。

6.repair

Repair操作能够修复Metadata表,该操作在Metadata表出现错误时是非常有用的。
Repair会修复Metadata表的错误,通常有两种用途:

  • 移除失败的Migration记录,该问题只是针对不支持DDL事务的数据库。

  • 重新调整已经应用的Migratons的Checksums值,比如:某个Migratinon已经被应用,但本地进行了修改,又期望重新应用并调整Checksum值,不过尽量不要这样操作,否则可能造成其它环境失败。

    参考内容
    https://blog.waterstrong.me/flyway-in-practice/

你可能感兴趣的:(flyway)