flyway数据库版本管理工具
背景
在项目开发中,程序代码可以使用svn或者git来管理版本。但是在数据库开发中,版本的控制一直是个比较头疼的问题,通过调研,spring的官方支持flyway和liquibase的数据库版本管理工具
flyway
flyway 是一个敏捷工具,用于数据库的移植。采用 Java 开发,支持所有兼容 JDBC 的数据库。
主要用于在你的应用版本不断升级的同时,升级你的数据库结构和里面的数据
https://link.juejin.cn/?target=https%3A%2F%2Fflywaydb.org%2F
支持的数据库:
Oracle、SQL Server、DB2、MySQL、Aurora MySQL、MariaDB、Percona XtraDB群集、PostgreSQL、Aurora PostgreSQL、Redshift、CockroachDB、SAP HANA、Sybase ASE、Informix、H2、HSQLDB、Derby、SQLite、Firebird
工作原理
flyway通过历史记录表(flyway_schema_history)来记录版本历史。每次随项目启动时将会自动扫描在resources/db/migration下的文件并查询flyway_schema_history判断是否为新增文件。如果是新增的文件,则执行该迁移文件。如果不是,则忽略
flyway_schema_history 表结构1
2
3
4
5
6
7
8
9
10
11
12
13
14CREATE TABLE `flyway_schema_history` (
`installed_rank` int(11) NOT NULL,
`version` varchar(50) DEFAULT NULL,
`description` varchar(200) NOT NULL,
`type` varchar(20) NOT NULL,
`script` varchar(1000) NOT NULL,
`checksum` int(11) DEFAULT NULL,
`installed_by` varchar(100) NOT NULL,
`installed_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`execution_time` int(11) NOT NULL,
`success` tinyint(1) NOT NULL,
PRIMARY KEY (`installed_rank`),
KEY `flyway_schema_history_s_idx` (`success`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
第一次执行:在一个空数据库上执行时。会创建一个flyway_schema_history。这个表用来记录和追踪数据库版本的状态,然后flyway会扫描文件系统或者项目下classpath路径下的数据库文件
再次执行:flyway会再次扫描迁移文件,然后将迁移文的版本号与历史记录表中的版本号进行对比。flyway会忽略版本号小于等于表中当前最大版本的迁移文件,剩余待执行迁移文件会按版本号升序执行。(译者注:并非真正忽略,而是会校验checksum值是否一致,以此来保证历史版本文件未被篡改。)
SpringBoot集成flyway
1 添加依赖
这里可以不用指定flyway的版本号,因为springboot父类依赖中已经指定了版本号, 如果执行可能会包版本冲突1
2
3
4
5<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
</parent>1
2
3
4
5
6
7
8
9<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
2 添加配置
1 | # 开启 |
实际配置1
2
3
4
5
6
7
8
9
10
11
12
13
14spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/renren-fast?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
username:
password:
flyway:
baseline-on-migrate: true
enabled: true
locations: classpath:db/migration
baseline-version: 1
3 添加配置文件
在resources目录下创建db/migration文件夹
在db/migration目录下创建版本迁移文件 V1__initial.sql
命名规则
在src/resources下创建 db/migration目录,在其中创建对应的SQL文件,其中又分为不同的文件类型,基于约定由于配置的原则,通过文件命名方式进行区分
版本迁移以V开头,只会执行一次;回退迁移以U开头,一般不使用;可重复执行迁移以R开头,每次修改后都会重新执行