【工具链】用Flyway做数据库版本控制

用Flyway做数据库版本控制

产品升级时,你被数据库升级虐过吗?

某个表字段不存在

经过多次升级,不确定有没有漏掉过某个表

拿到升级代码,又不确定升级顺序

……

现在,有了Flyway,一切变得如此简单

了解Flyway

Flyway 是款开源数据库迁移工具,与其它工具相比,它极力主张简单和约定

它用于管理数据库版本,可以在命令行中使用,也可以在Java应用程序中引入。

在项目或产品中,很难一次性把数据表设计好,基本每个迭代都伴随着数据库升级,数据表也随着迭代周期不断更新。

使用Flyway ,能快速且有效地迭代数据库表结构,保证开发环境、测试环境、生产环境数据表一致,且有历史记录可查询

Flyway支持的数据库很多,从官网摘抄如下:

支持的数据库包括 Oracle, SQL Server(包括Amazon RDS和Azure SQL数据库), Azure Synapse(以前称为数据仓库), DB2, MySQL(包括Amazon RDS,Azure数据库和Google Cloud SQL), Aurora MySQL, MariaDB, Percona XtraDB集群, TestContainers, PostgreSQL(包括Amazon RDS,Azure数据库,Google Cloud SQL和Heroku), Aurora PostgreSQL, Redshift, CockroachDB, SAP HANA, Sybase ASE, Informix, H2, HSQLDB, Derby, Snowflake, SQLite和 Firebird。

更多的特性,可直接在官网上查询。

为什么要用Flyway

1、 使用简单

之前进行迁移需要考虑数据库当前状态,脚本是不是被执行过,在这个环境修复的问题,在另一个环境存在吗?现在,只需要一个命令,Flyway就为你完成比较并升级。

2、 很好地解决数据库版本管理和迁移问题

版本管理我们用git、svn进行代码迭代,数据库版本管理呢?之前并无合适的工具,只能人工比对,现在,当然用Flyway。大家遵守共同的规则,我们自己对数据库的改动可以提交,同事对数据库的修改也可以及时知道

3、 专为CI/CD设计,让持续集成与发布如此简单

之前反复迭代时,都是数据库手工升级并检查,使用Jenkins完成前后台升级,现在数据库升级也可以集成在流水线了!

Flyway怎么用

1、 下载

社区版下载地址:https://Flywaydb.org/download/community

2、 安装

下载后解压缩就可运行,解压后,目录结构及作用如下

flyway-7.8.1
   conf
     flyway.conf  配置文件
   drivers         JDBC 驱动程度
   jars            基于JAVA迁移 (如 jars)
   jre
   lib
   licenses
   sql             SQL 迁移
   flyway         macOS/Linux 可执行文件
   flyway.cmd     Windows 可执行文件

3、 JDBC驱动程序

为了连接数据库,需要在drivers目录中加入适当的JDBC驱动程序。

Flyway自带一些常用驱动,不常用的,就需要下载并放入。

4、 使用命令行进行数据库迁移、清理等

进行数据库迁移,只需要配置和使用命令就可

(如果你正好是数据库管理人员,除了迁移外,还需要为大家提供数据库脚本,那你需要看下一节)

配置:主要配置使用的数据库类型、版本、地址、端口及sql脚本所在目录,例如:

flyway.driver=oracle.jdbc.OracleDriver flyway.url=jdbc:oracle:thin:@//192.168.1.1:1521/orclpdb 
flyway.user=test 
flyway.password=5ertqeio 
flyway.placeholderReplacement=false 
flyway.locations=E:\db\dbsql 
flyway.encoding=GBK 

迁移:Flyway migrate

将架构迁移到最新版本,如果Flyway不存在,它将自动创建架构历史记录表;如果存在,则与已有数据库比较,发现差异时迁移数据库

> flyway migrate

Flyway 7.8.1 by Redgate

Database: jdbc:h2:file:flyway.db (H2 1.3)
Successfully validated 5 migrations (execution time 00:00.010s)
Creating Schema History table: "PUBLIC"."flyway_schema_history"
Current version of schema "PUBLIC": << Empty Schema >>
Migrating schema "PUBLIC" to version 1 - First
Migrating schema "PUBLIC" to version 1.1 - View
Successfully applied 2 migrations to schema "PUBLIC" (execution time 00:00.030s).

Flyway clean

删除已配置架构中所有对象,注意:千万不要对生产DB用这个命令!

Flyway info

打印有关迁移的详细信息和状态信息,可以看到哪些迁移在执行,那些已成功,什么时候执行的等信息。

Flyway仅有7个基本命令:Migrate, Clean, Info, Validate, Undo, Baseline and Repair.

分别对应 迁移, 清理, 信息, 验证, 撤消, 基线和 修复。

社区版常用的主要是Migrate, Clean这两个。

Flyway版本迁移规则

Flyway把所有的数据库变更都写入数据库叫做数据迁移。数据迁移包含两种方式,一种是按照版本来迁移,第二种是重复迁移

推荐使用按版本迁移

版本迁移要求:

必须有一个版本号且版本号必须唯一

版本迁移必须包含版本,描述信息和校验

每个版本只会被执行一次

迁移按照版本号顺序迁移

完全重复的脚本不会被多次执行,只会执行一次。

用途:

- 创建/修改/删除 表/索引/外键/enums/UDTs/…

- 数据更新

- 用户数据修改

版本号定义:

可以使用数字,下划线和点来连接版本号,但是版本号必须唯一。

- 1

- 001

- 5.2

- 1.2.3.4.5.6.7.8.9

- 205.68

- 20130115113556

- 2013.1.15.11.35.56

- 2013.01.15.11.35.56

开发团队须做好数据库脚本命名规范,并按规范进行版本号定义

之后,就可以方便地用Flyway进行数据库版本迁移啦

目前 Flyway 提供了有两个版本:Community edition 和 Teams edition。其中社区版(Community edition)是免费的。

从近三年使用情况看,社区版提供的功能足以满足我们日常数据库版本迭代需求

实用,好用!

推荐给大家