一、什么是Flyway ?
Flyway 是一款开源的数据库版本管理工具, 它更倾向于规约优于配置的方式。
Flyway 可以独立于应用实现管理并且跟踪数据库的变更。 支持数据库版本的自动升级,
自带有一套默认的规约,不需要复杂的配置。Migrations 可以写成SQL脚本,也可以集成到JAVA代码中,同时在分布式环境下能够安全可靠的升级数据库,支持失败恢复操作等。
而且flyway命令简单, 可以很快的上手使用。
Flyway主要基于6种基本命令:Migrate, Clean, Info, Validate, Baseline and Repair
目前支持的数据库主要有: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.
关于Flyway 的优势,支持的数据库以及其他数据库版本工具对比,可阅读Flyway官方介绍
二、Flway 可以做什么 ?
当用户遵循规范存放好数据库脚本,程序启动的时候,Flyway会连接数据源对应的数据库,并按照版本号进行版本检查,如果不是最新版本,则自动执行升级脚本。
这意味着,当程序连接的是一个全新的数据库的时候,Flyway 会自动初始化应用所需的表结构和基础数据;或者当程序连接到一个落后几个版本的测试数据库的时候,Flyway 会自动帮用户升级到最新的表结构和基础数据。
三、Flway 的获取
Flyway 的获取可以通过(官方网站:https://flywaydb.org/download/) 找到下载地址.
官方网站提供三种不同的版本:
- Community Edition : 社区版,此版本含有Flyway的核心功能
- Pro Edition:专业版本,提供一些高级命令例如回滚等。
- Enterprise Edition:企业版,此版本提供JDK 6的支持。
备注: Flyway 基于jre运行环境, 但无需另外下载,flyway自带运行环境。
四、Flway 的目录结构
1. 概述
如下图所示, Flyway 包含以下
- conf 配置文件存放的地方
- drivers 数据库连接驱动jar包存放的地方
- jars 如果是通过java 进行数据库升级,将升级jar包放在此文件夹下
- jre flyway 自带的jre运行环境
- lib flyway 的代码库
- sql 脚本文件存放的地方
2. sql 升级脚本存放
升级脚本在flyway中被称作 Migration , Migration 里面包含可执行的数据库脚本,用来进行数据库版本变更, 需要注意的是, 放在 sql 文件夹中的脚本, 需要按照 与Flyway约定的方式来命名脚本, Flyway 才能正确识别出你的脚本是用来干什么的, 是什么版本。 Flyway 根据你的脚本来进行分类 , 比如V开头的脚本是升级脚本, R开通的脚本是可重复执行的脚本,然后Flyway 会根据特定规则去对这些脚本进行排序, 然后一个个按顺序去执行它们。
sql 脚本命名类似于 V2__ADD_new_table.sql , 其中
V 是前缀, 位于文件命名的第一个字符,通常用来表示脚本的类型,此处代表是一个升级脚本
**2是版本号,**flyway 会根据此字符换来进行排序
__ 两个下划线是用来区分版本和版本描述的分隔符 , 两个下划线后面就接上这个脚本的描述说明
- 总结
核心的目录 有 sql conf 这两个, 需要记住这两个目录的使用方法。
五、Flway 使用
- 配置好数据源
数据源配置可以参考下图 , 需要制定url 和账户密码, 如果不进行配置,会在每次连接的时候提示你进行输入
- 在Flyway 根目录启动终端
windows 下
六、Flyway 相关概念
在正式使用flyway 的命令之前,先对Flyway中会提及的概念做一个介绍,通过了解这些概念,可以帮我们快速掌握Flyway的使用方法
- Migrations
在Flyway 中, 对数据库的所有操作都被称之为 **Migrations **
- migration 可以分为以下几类
- version migrations ( 版本升级 , 在Migrations命名中前缀为 V)
- undo migrations (版本回滚, 在Migrations命名中前缀为 U)
- Repeatable Migrations (可重复执行的操作 , 在Migrations命名中前缀为 R)
下图是基于SQL脚本的migrations的命名
- 执行方式又可以分为两种
- SQL_base Migrations (基于SQL脚本的Migrations)
- Java_base Migrations (基于JAVA代码的Migrations)
- migrations 的状态
| 状态名 | 状态解释 | 备注 |
|:----|:----|:----|
| pending | 准备状态中的Migrations , 还没被执行。 | 正常情况下,新版本未执行的脚本状态为 pending |
| success | 成功被执行的migrations | |
| 空 | 如果数据库支持DDL事务,在操作失败后将不会有任何显示 | |
| failed | 如果数据库不支持DDL事务,那么没有被成功执行的migrations会显示此状态,此时可能需要手动去处理DDL操作带来的变化 | |
| undone | 执行版本回滚后会显示此状态 | 针对 回滚脚本 |
| outdated | 自上次应用校验和更改后,可重复迁移被标记为过期,直到再次执行为止 | 针对 可重复执行脚本 |
| future | 当Flyway发现一个版本高于最高已知版本的应用版本migrations时(这通常发生在软件的新版本已经成功migrations),该migrations被标记为未来。 | |
- Callbacks
Callbacks 是指回调函数,Callbacks 能够使你在整个migrations的生命周期中插入新的操作。
下面这些是Flyway 支持的操作:
Name | Execution |
---|---|
beforeMigrate | Before Migrate runs |
beforeEachMigrate | Before every single migration during Migrate |
beforeEachMigrateStatement Flyway Pro | Before every single statement of a migration during Migrate |
afterEachMigrateStatement Flyway Pro | After every single successful statement of a migration during Migrate |
afterEachMigrateStatementError Flywa |