热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Java中Flyway的使用详解

这篇文章主要介绍了Java中Flyway的使用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

Flyway的使用

环境:SpringBoot 2.0.4.RELEASE

为什么要用Flyway?

开发人员在合作的时候经常遇到以下场景:

1.开发人员A在自己的本地数据库做了一些表结构的改动,并根据这些改动调整了DAO层的代码,然后将代码上传到svn或git等版本控制服务器上。此时如果开发人员B拉取了A的代码改动,在运行项目的时候很可能会报错,因为B的本地SQL数据库并没有修改。

2.在项目上线的时候,当服务器拉取的版本控制服务器的最新修改后,必须同时运行SQL数据库的修改脚本,如果忘了跑数据库脚本,那么会出现严重的问题。

传统的解决方案就是在一个固定的文件夹中,将需要跑的SQL脚本放在里面。开发人员在合作的时候,A修改了数据库,在B遇到问题的时候,可能需要交流沟通一下,去跑需要的脚本。在项目上线的过程中,也是运维人员在规定的文件夹中,找到需要跑的SQL脚本。运行它们。

Flyway等migration工具就是要把开发人员和运维人员从以上这些场景的繁琐工作中解放出来,如果使用maven的话,那么在项目编译(SpringBoot运行Application)的时候,SQL数据库的改动就自动进入数据库,只要启动成功,开发或者运维人员对SQL数据库的migrate过程是无感知的,项目依然可以照常运行。

Flyway是什么?

官方网站:https://flywaydb.org/

Flyway是一个简单开源数据库版本控制器(约定大于配置),主要提供migrate、clean、info、validate、baseline、repair等命令。它支持SQL(PL/SQL、T-SQL)方式和Java方式,支持命令行客户端等,还提供一系列的插件支持(Maven、Gradle、SBT、ANT等)。

Flyway最核心的就是用于记录所有版本演化和状态的MetaData表,Flyway首次启动会创建默认名为SCHEMA_VERSION的元素局表。 表中保存了版本,描述,要执行的sql脚本等;

sql脚本的格式:V + 版本号 + 双下划线(__) + 描述 + 结束符(.sql)

例如:V1__INIT_DATABASE.sql

命令解释:

Migrate

Migrate 是指把数据 Schema 迁移到最新版本,在 Migrate 时会检查 MetaData 元数据表,如果不存在就创建 MetaData 表,MetaData 用于记录数据库历史变更等信息;

Migrate会扫描指定文件系统或者 classpath 下的 Migrations。会与 MetaData 中的记录进行对比,进行版本升级;

clean

清除掉对应数据库 Schema 中所有的对象,包括表结构,视图,存储过程等,clean 操作在 dev 和 test 阶段很好用;

info

用于打印所有的 Migrations 的详细和状态信息,也是通过 MetaData 和 Migrations 完成的,可以快速定位当前的数据库版本;

validate

验证以及apply的Migrations是否有变更,默认开启的;原理是对比MetaData表与本地Migrations的checkNum值,如果值相同则验证通过,否则失败

baseline

对已经存在数据库Schema结构的数据库一种解决方案。实现在非空数据库新建MetaData表,并把Migrations应用到该数据库;也可以应用到已有表结构的数据库中也可以实现添加Metadata表

repair

repair操作能够修复metaData表,该操作在metadata出现错误时很有用

用途:

1):移除失败的Migration记录,只针对不支持DDL事务的数据库

SpringBoot中使用Flyway管理数据库版本

一、添加maven依赖及插件



	org.flywaydb
	flyway-core
	5.0.7



 org.flywaydb
 flyway-maven-plugin

添加插件的目的是为了使用上面讲到的一些命令:如下图:

在这里插入图片描述

二、开启Flyway支持、配置Flyway

######################FlyWay#######################
# 在没有元数据表的情况下,针对非空Schema执行迁移时是否自动调用基线。 (默认值:false)
spring.flyway.baseline-on-migrate=true
# 下面几个配置不写也行,都是默认配置,这里写了是方便以后改
# 执行基线时用来标记已有Schema的版本。(默认值:1)
spring.flyway.baseline-version=1
spring.flyway.enabled=true
spring.flyway.sql-migration-prefix=V
spring.flyway.locatiOns=classpath:db/migration

三、在resource目录下创建db/migration目录添加sql脚本

如图:

在这里插入图片描述

下面是 V1.0.0.20190509.0957__flyway_test.sql 脚本

use `spring_boot_building`;

DROP TABLE IF EXISTS `table1`;

CREATE TABLE `table1` (
 `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(20) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

spring_boot_building 是我的项目连接的数据库

四、验证是否成功

启动项目,看启动日志:

在这里插入图片描述

打开数据库管理工具,查看数据库:

在这里插入图片描述

五、SQL文件版本号命名的规范

每个公司的规范肯定不一样.开发时,只需要项目内遵循该规范即可,规范的确定并没有对错.提供一种sql文件命名规范仅供大家参考。

在这里插入图片描述

遇到的问题

因为我的项目数据库连接池使用的是Druid,在启动项目时发现报异常sql injection violation, part alway true condition not allow,原因是Flyway通过 SQL 脚本来执行数据库的建立与更新。当同时集成了 Druid 和 Flyway 之后,Druid 的 wall 防火墙极可能直接干预 SQL 脚本的操作,继而导致 Flyway 执行中断。

网上教程是去掉wall防火墙配置,我试了确实可以,但是个人觉得这种做法不安全,应该还有其他的方法。

参考:

Spring Boot项目使用Flyway
Spring Boot中使用Flyway来管理数据库版本
SpringBoot项目集成Flyway进行数据库版本控制
Flyway详解以及Springboot集成Flyway

到此这篇关于Java 中Flyway的使用详解的文章就介绍到这了,更多相关java Flyway 使用内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 探讨密码安全的重要性
    近期,多家知名网站如CSDN、人人网、多玩、开心网等的数据库相继被泄露,其中大量用户的账户密码因明文存储而暴露无遗。本文将探讨黑客获取密码的常见手段,网站如何安全存储用户信息,以及用户应如何保护自己的密码。 ... [详细]
  • 在Ubuntu 18.04上使用Nginx搭建RTMP流媒体服务器
    本文详细介绍了如何在Ubuntu 18.04上使用Nginx和nginx-rtmp-module模块搭建RTMP流媒体服务器,包括环境搭建、配置文件修改和推流拉流操作。适用于需要搭建流媒体服务器的技术人员。 ... [详细]
  • 本文介绍了GitHub上的一些Python开源项目,特别是IM(即时通讯)技术的应用。通过Sealtalk项目,探讨了如何利用开源SDK提升开发效率。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • 网络安全实验:Telnet与SSH服务对比及抓包分析
    本实验旨在对比Telnet和SSH两种安全通信协议的服务差异,并通过搭建服务器和使用Wireshark抓包工具进行详细分析。 ... [详细]
  • Linux环境下MySQL的安装与配置
    本文详细介绍了在Linux系统上安装和配置MySQL的步骤,包括安装前的准备工作、下载和解压安装包、初始化数据库、配置文件编辑、启动服务以及设置开机自启动等。 ... [详细]
  • 尽管Medium是一个优秀的发布平台,但在其之外拥有自己的博客仍然非常重要。这不仅提供了另一个与读者互动的渠道,还能确保您的内容安全。本文将介绍如何使用Bash脚本将Medium文章迁移到个人博客。 ... [详细]
  • CentOS7通过RealVNC实现多人使用服务器桌面
    背景:公司研发团队通过VNC登录到CentOS服务器的桌面实现软件开发工作为防止数据外泄,需要在RealVNC设置禁止传输文件、访问粘贴板等策略过程&# ... [详细]
  • 1.前言PAP和CHAP协议是目前的在PPP(MODEM或ADSL拨号)中普遍使用的认证协议,CHAP在RFC1994中定义,是一种挑战响应式协议&#x ... [详细]
  • 开发笔记:empireCMS 帝国cms功能总结 ... [详细]
  • 本文详细介绍了如何在 CentOS 7 及其衍生发行版(如 Red Hat, Oracle, Scientific Linux 7)上安装和完全卸载 GitLab。包括安装必要的依赖关系、配置防火墙、安装 GitLab 软件包以及常见问题的解决方法。 ... [详细]
  • 浏览器提示网站‘不安全’的原因及解决方法
    在日常上网过程中,我们经常会遇到浏览器提示网站‘不安全’的情况。面对这种情况,不同的人有不同的处理方式,但浏览器为什么会发出这样的警告?本文将详细解析其中的原因,并提供相应的解决方案。 ... [详细]
  • 本文介绍了 PHP 的基本概念、服务器与客户端的工作原理,以及 PHP 如何与数据库交互。同时,还涵盖了常见的数据库操作和安全性问题。 ... [详细]
  • 本文总结了设计、开发和部署Web应用程序时应遵循的一些最佳实践,这些实践结合了个人经验和权威资料,旨在帮助开发者提高Web应用的安全性。 ... [详细]
  • GreenPlum采纳ShareNothing的架构,良好的施展了便宜PC的作用。自此IO不在是DW(datawarehouse)的瓶颈,相同网络的压力会大很多。然而GreenPlum的查问优化策略可能防止尽量少的网络替换。对于首次接触GreenPlum的人来说,必定耳目一新。 ... [详细]
author-avatar
mobiledu2502904893
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有