Flyway简介

article/2025/11/10 9:05:28

Flyway简介

总结:Flyway可以很方便的帮我们完成数据库部署和增量升级,很有用,但是版本回滚操作并不给力~~~

1、简介

1.1、Flyway是什么

Flyway是一款数据库迁移(migration)工具。简单点说,就是在你部署应用的时候,帮你执行数据库脚本的工具。Flyway支持SQL和Java两种类型的脚本,你可以将脚本打包到应用程序中,在应用程序启动时,由Flyway来管理这些脚本的执行,这些脚本被Flyway称之为migration。

就目前而言,我们部署应用的流程大概是这样的:

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

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

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

1.1、Flyway如何工作

最简单的理解方式是:简单我们在一个空数据库上部署集成了Flyway的应用:

这里写图片描述

Flyway将在这个空数据中创建一张表,用于记录migration的执行情况,表名称默认为:flyway_schema_histor,老版本的表名称:schema_version

这里写图片描述

紧接着,Flyway根据表中的记录决定是否执行应用程序包中提供的migration

这里写图片描述

最后将执行结果写入flyway_schema_histor并校验执行结果

这里写图片描述

下次版本迭代时,提供新的migration,会根据flyway_schema_histor的记录执行新migration

这里写图片描述

这里写图片描述

这里写图片描述

2、核心概念

2.1、Migration

Flyway将每一个数据库脚本称之为:migrations,flyway支持三种类型的migration:

  • Versioned migrations:最常用的migration,可以简单的理解为数据库升级脚本
  • Undo migrations:数据库版本回退脚本,需要Pro版本,忽略,而且使用过程存在较大风险,undo操作目前只能通过plugin或者command-line来执行
  • Repeatable migrations:可重复执行的migration,例如create or replace脚本,当脚本checksums改变时会重新执行

每个migration支持两种编写方式:

  • Java:通过实现 org.flywaydb.core.api.migration.jdbc.JdbcMigratio 接口来创建一个Java migration,也就是通过JDBC来执行SQL,对于类是CLOB或者BOLB这种不方便在SQL中实现的脚本比较有用,例如:
package db.migration;import org.flywaydb.core.api.migration.jdbc.JdbcMigration;
import java.sql.Connection;
import java.sql.PreparedStatement;/*** Example of a Java-based migration.*/
public class V1_2__Another_user implements JdbcMigration {public void migrate(Connection connection) throws Exception {PreparedStatement statement = connection.prepareStatement("INSERT INTO test_user (name) VALUES ('Obelix')");try {statement.execute();} finally {statement.close();}}
}
  • SQL:简单的SQL脚本文件,例如:
/* Single line comment */
CREATE TABLE test_user (name VARCHAR(25) NOT NULL,PRIMARY KEY(name)
);/*
Multi-line
comment
*/
-- Placeholder
INSERT INTO ${tableName} (name) VALUES ('Mr. T');

所有的migration都需要遵守命名规范:

这里写图片描述

确保版本号唯一,flyway按照版本号顺序执行。repeatable没有版本号,因为repeatable migrations会在内容改变时重复执行

默认情况下,flyway会将单个migration放在一个事物里执行,也可以通过配置将所有migration放在同一个事物里执行,感觉用处不大,这里就不介绍了~

2.2、Callbacks

Flyway在执行migrations时提供了一些列的hook,使你可以在执行过程中加入额外的操作:

这里写图片描述

这些hook均执行SQL和Java类型的migrations,只需要将migration的名称以hook名称开头即可,例如:beforeMigrate.sqlbeforeEachMigrate.sqlbeforeRepair__vacuum.sql ,Java类型的hook需要实现接口:org.flywaydb.core.api.callback.Callback

2.3、Error Handlers

需要Flyway Pro版本,忽略,参考链接:https://flywaydb.org/documentation/errorhandlers

2.4、Dry Runs

需要Flyway Pro版本,忽略,参考链接:https://flywaydb.org/documentation/dryruns

3、使用事例

3.1、集成Spring Boot

  • build.gradle
plugins {id 'java'id 'org.springframework.boot' version '2.0.2.RELEASE'
}group 'com.chenlei'
version '1.0-SNAPSHOT'sourceCompatibility = 1.8repositories {mavenCentral()
}dependencies {compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.0.2.RELEASE'compile group: 'org.springframework.boot', name: 'spring-boot-starter-jdbc', version: '2.0.2.RELEASE'compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.46'compile group: 'org.flywaydb', name: 'flyway-core', version: '5.1.1'testCompile group: 'junit', name: 'junit', version: '4.12'
}
  • application.yml
server:port: 8080
spring:datasource:url: jdbc:mysql://192.168.119.123:3306/flyway?useUnicode=true&characterEncoding=utf8&useSSL=falseusername: flywaypassword: Flyway@1234driver-class-name: com.mysql.jdbc.Driverflyway:locations: classpath:com/chenlei/flyway/db/mysql
  • 完整代码地址:https://github.com/chenlein/flyway-springboot

这里写图片描述

3.2、Gradle插件

  • build.gradle
plugins {id 'java'id 'org.springframework.boot' version '2.0.2.RELEASE'id "org.flywaydb.flyway" version "5.1.1"
}flyway {url = 'jdbc:mysql://192.168.119.123:3306/flyway?useUnicode=true&characterEncoding=utf-8&useSSL=false'user = 'flyway'password = 'Flyway@1234'locations = ['classpath:com/chenlei/flyway/db/mysql']encoding = 'UTF-8'
}group 'com.chenlei'
version '1.0-SNAPSHOT'sourceCompatibility = 1.8repositories {mavenCentral()
}dependencies {compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.0.2.RELEASE'compile group: 'org.springframework.boot', name: 'spring-boot-starter-jdbc', version: '2.0.2.RELEASE'compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.46'compile group: 'org.flywaydb', name: 'flyway-core', version: '5.1.1'testCompile group: 'junit', name: 'junit', version: '4.12'
}

完整配置:https://flywaydb.org/documentation/gradle/migrate

注意:

  • Clean会将数据库schema下的所有内容清空,谨慎执行
  • Baseline的版本号和migration冲突时,migration不会执行
  • Repeatable仅在check sum发送改变时会再次执行,Java migration需要实现 org.flywaydb.core.api.migration.MigrationInfoProvider 接口
  • Gradle查询无法执行实现 org.flywaydb.core.api.migration.spring.SpringJdbcMigration 接口的migrations,只能是实现 org.flywaydb.core.api.migration.jdbc.JdbcMigration 的migrations
  • Undo需要Pro版本

这里写图片描述

Maven插件与此类似~

4、参考资料

  • https://flywaydb.org/documentation/

http://chatgpt.dhexx.cn/article/c1EZ08Xx.shtml

相关文章

数据库版本管理工具 Flyway 使用

目录 一、简介 二、核心概念 1、Schema History Table 2、Migration 3、Versioned migrations 三、集成 SpringBoot 1、pom文件中引入依赖 2、application.yml配置 3、sql 脚本编写 四、初始化数据库 五、注意事项 一、简介 Flyway是一款开源的数据库版本管理工具&am…

Flyway简介及使用

Flyway简介及使用 1、简介 1.1 Flyway是什么? Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。 Flyway可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约&#xff0…

Flyway基础简介

1. 概述 Flyway是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。 自动升级(自动发现更新项):Flyway 会将任意版本的数据库升级到最新版本。Flyway 可以脱离JVM 环境通过命令行执行,可以通过Ant 脚本执行&#…

flyway的学习总结

一、简单介绍 Flyway 是一款开源的数据库版本管理工具。它可以很方便的在命令行中使用,或者在Java应用程序中引入,用于管理我们的数据库版本。 在项目或产品中,很难一开始就把业务理清楚,把数据库表设计好,因此数据表…

Flyway——配置和使用(入门)

文章目录 介绍测试环境依赖引入配置数据库连接启动类设置脚本项目结构概览项目启动,观察日志和数据库结果测试R开头的脚本直接重启项目修改 R__add_user_info.sql 后重启 变更数据库字段验证 V 只能执行一次的问题验证 R 可执行多次验证只有一个_会报错技能扩充参考…

flyway的快速入门教程

目录 一、简单介绍 二、为什么要使用flyway 三、flyway是如何工作的 四、如何使用flyway 1、先要初始化一个SpringBoot项目,引入依赖 2、在application.yml中添加相关配置 3、根据配置文件中填写的脚本存放路径,创建文件夹 4、添加需要运行的sql…

Flyway详解(使用说明及避坑指南、一文搞懂flyway)

一、简介 1.1 Flyway是什么? Flyway是一款开源的数据库版本管理工具,可以实现管理并跟踪数据库变更,支持数据库版本自动升级,而且不需要复杂的配置,能够帮助团队更加方便、合理的管理数据库变更。 例:创建…

MySQL数据库的集群解决方案(一)

读写分库架构 我们一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是说采用数据库集群的方案: 其中一个是主库,负责写入数据,我们称之为:写库; 其它都是…

MySQL数据库集群实战(1)——MySQL数据库基础知识

文章目录 一、为什么使用数据库?二、数据库概念数据库(DataBase,DB)数据库管理系统(DataBase Management System,DBMS)SQL概述 三、数据库存储文件的特点四、MySQL常见的数据对象五、MySQL数据类…

mysql-集群概述

mysql-主从模式 mysql-集群概述 可用性设计 站点高可用,冗余站点服务高可用,冗余服务 数据高可用,冗余数据 保证高可用的方法是冗余。但是数据冗余带来的问题是数据一致性问题 实现高可用的方案有以下几种架构模式: 主从模式 简…

MySQL数据库集群的原理与搭建

【1.应用背景】 在最近做的项目中,因为有一个短时间内很多人访问服务,会频繁访问数据库,看到这里不免有些人会想起数据库集群。我们组长也想到了用数据库集群,于是就带着我们几个研究起来了mysql数据库集群的搭建。因为我们几个的…

MySQL 数据库主从集群搭建

文章目录 1 准备工作2 配置主数据库3 配置从库4 从库设置只读用户5 推荐参考资料 1 准备工作 1 选择一个服务器当做主服务器,将服务器上需要的数据进行备份 2 安装从库的 MySQL,需要与主服务器的版本保持一致 3 将主服务器上的数据同步到从库中(主从集…

MySQL数据库主从集群架构搭建

一、相关概念 二、配置一主一从 三、配置一主多从 四、配置主从从 五、配置主主结构 六、配置半同步复制模式 一、相关概念 1.1 主从同步介绍: 存储数据的服务结构,分为2种角色: 主服务器(master):接受客户端访问连接 从服务器(sl…

谈谈mysql数据库集群

现在,随着上网人数的激增,一些大型的网站开始使用数据库集群来提高数据库的可靠性和数据库的性能。那么在介绍数据库集群之前首先需要弄清楚几个问题。 1.为什么要用数据库集群 (1)通过使用数据库集群可以使读写分离,提…

MySQL集群配置

1. MySQL集群简介 MySQL Cluster 是MySQL适合于分布式计算环境的高实用、高冗余版本。它采用了NDB Cluster 存储引擎,允许在1个 Cluster 中运行多个MySQL服务器。MySQL Cluster 是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的 Cluster 。…

MySQL数据库集群(双主双从)

文章目录 MySQL数据库集群(双主双从)实验环境双主双从双主双从进行测试 MySQL数据库集群(双主双从) 实验环境 保证每台centos7服务器配置静态的IP,初始化服务器,关闭防火前和selinux,保证四台服务器之间可以互相通信,并且做好hosts域名解析…

数据库与集群

数据库与集群 1、数据库集群 概念:数据库集群,顾名思义,就是利用至少两台或者多台数据库服务器,构成一个虚拟单一数据库逻辑映像,像单数据库系统那样,向客户端提供透明的数据服务。 数据库集群两个关键定…

数据库-mysql集群方案总结

一 概念解读 1 数据库高可用 高可用指的是:如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的 可用性,保证业务不会因为数据库的故障而中断。 另外,数据库高可用还要数据一致性,如下: (1) 用作备份、只读副…

数据库集群

目录 主从复制集群单机数据库的问题单机到集群主从复制传统主从复制异步复制半同步复制 组复制(MGR MySQL Group Replication MGR ) 主从复制演示准备两个MySQL服务实例修改主数据库MySQL_A的my.ini中的[mysqld]配置项下的配置如下修改从数据库MySQL_B的…

MySQL数据库的集群方案

1.简介 我们一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是说采用数据库集群的方案: 其中一个是主库,负责写入数据,我们称之为:写库; 其它都是从库&…