Flyway是一种开源数据库迁移工具。它强烈支持简单性和约定而不是配置。
Flyway是一种开源数据库版本管理工具,往往比配置更面向常规。 Flyway可以独立于应用程序来管理和跟踪数据库更改,支持数据库版本的自动升级,并且具有一组不需要复杂配置的默认法规。迁移可以写为SQL脚本或Java代码。它不仅支持命令行和Java API,而且还支持构建工具和弹簧启动等。它可以安全可靠地在分布式环境中升级数据库,还可以支持失败的恢复。
Flyway主要基于6个基本命令:迁移,清洁,信息,验证,基线和维修,并将稍后再分析和解释。当前支持的主要数据库包括:Oracle,SQL Server,SQL Azure,DB2,DB2 Z/OS,MySQL,MySQL(包括Amazon RDS),MariaidB,Google Cloud SQL,Postgresql,Postgresql(包括Amazon RDS和Heroku),Redshift,Redshift,Vertica,vertica,h2,h2,hs hs hssql,syb syb s s s s s s sap hana,sap hana,sap hana,sap hana,sap hana,sap hana,sap hana,sap hana,凤凰。
对于Flyway的优势,受支持的数据库和与其他数据库版本工具的比较,您可以阅读Flyway官方网站的介绍。
为什么要使用Flyway?
通常,数据库是在项目开始时在全球设计的,但是在开发新产品功能的过程中,不可避免地需要更新数据库模式,例如:添加新表格,添加新的字段和约束等。这种情况通常在实际项目中发生。因此,当开发人员完成SQL脚本以更新数据库时,他们如何快速同步其他开发人员的计算机?以及如何快速在测试服务器上同步?以及如何确保可以顺利执行并通过集成测试?
假设以Spring Boot Technology堆栈项目为例,有些人可能会说,本地使用Hibernate自动更新数据库架构模式,然后让QA或DEV到Test Server手动执行SQL脚本,同时,您可以编写Gradle任务以自动执行更新。
就我个人而言,我认为这感觉不可靠,不透明,冬眠的低控制自由,有时很容易犯错。例如,使用SQL创建的字段是VARCHAR类型,并且在实体中配置的一个字段是CHAR类型,然后在运行集成测试时,自动创建的数据库表中的字段是CHAR类型的,并且实际的SQL脚本期望VARCHAR类型。尽管测试通过了,但这不是预期的行为,在本地启动或服务器上运行服务时会失败。此外,在每个测试服务器上手动执行SQL脚本是耗时且辛苦的。为什么不自动化它?当然,对于高级和产品环境,DBA仍需要由DBA手动执行。最后,最好编写自动执行更新的自动化程序。因此,如果您已经有一些插件或库可以帮助您更好地实施此类功能,为什么不充分利用它们呢?当然,如果是出于学习目的,那么重新创建轮子是可以理解的。
实际上,可以通过飞行工具解决上述问题。 Flyway可以实现自动化数据库版本管理,并可以记录数据库版本更新记录。 Flyway的官方网站详细说明了为什么数据库迁移与示例结合使用。如果您有兴趣,请参考。
Flyway如何工作?
Flyway的数据库版本管理主要由元数据表和6个命令完成。元数据主要用于记录元数据。每个命令都有不同的功能和问题。以下解释了元数据表和这些命令。示意图全部来自Flyway的官方文件。
元数据表
Flyway的最核心部分是用于记录所有版本演变和状态的元数据表。 Flyway首次启动时,将创建带有默认名称schema_version的元数据表。表结构是(以MySQL为例):
fieldTypenullKeyDefaultVersion_rankInt(11)nomulnull安装_rankint(11)nomulnullversionvarchar(50)noprinull Description Varchar(200)无nulltypevarchar(20)no nullscriptVarchar(1000)no nullscriptVarchar(1000)no nullchecksumint(11)YullCheckSumint(11) current_timestampexecution_timeint(11)无nullsuccesstinyint(1)nomulnull
在Flyway的官方网站上提供了一个非常明显的示例,您可以参考。
迁移
迁移是指将数据库架构迁移到最新版本。它是Flyway工作流程的核心功能。迁移时,Flyway将检查元数据(元数据)表。如果不存在,将创建一个元数据表。元数据表主要用于记录版本更改历史记录和校验和检查。
迁移时,它会扫描指定的文件系统或ClassPath下的迁移(可以将其理解为数据库版本脚本),并比较元数据表中的现有版本记录。如果有未应用的迁移,Flyway将获得这些迁移并将其应用于数据库,否则您无需做任何事情。此外,通常应在应用程序启动时默认执行迁移操作,从而避免程序和数据库之间的不一致之处。
干净的
清洁相对易于理解,即清除相应数据库架构中的所有对象,包括表结构,视图,存储过程,功能和所有数据。
清洁操作在开发和测试阶段非常有用。他们可以帮助快速有效地更新和再生数据库表结构,但特别值得注意:不应在生产数据库中使用它们!
信息
信息用于打印所有迁移的详细信息和状态。实际上,它也通过元数据表和迁移完成。下图很好地显示了信息打印的信息。
信息可以帮助快速找到当前的数据库版本,并查看执行成功和失败的迁移。
证实
验证是指验证应用迁移是否发生任何变化。默认情况下启用飞行。
验证原理是将元数据表的校验和值与本地迁移进行比较。如果值相同,则将通过验证,否则验证将失败,这可以防止对已应用于数据库的本地迁移的无意修改。
基线
基线对具有模式结构的数据库的解决方案是在非空数据库中创建一个新的元数据表,并将迁移应用于数据库。
基线可以应用于特定版本,以便可以在具有现有表结构的数据库中添加元数据表,以便使用飞行来管理新迁移。
维修
维修操作可以修复元数据表,当元数据表中存在错误时,这非常有用。
维修修复了元数据表中的错误,通常有两个目的:
删除了失败的迁移记录,问题仅用于不支持DDL事务的数据库。重新调整已应用已应用的迁移的校验和值,例如:已应用了一个迁移,但已在本地进行了修改,并有望重新应用并调整校验和值。但是,尽量不要这样操作,否则可能会导致其他环境的故障。如何使用飞行?
在这里,我们将主要集中于在Gradle和Spring Boot中集成和使用Flyway。该数据库通常会使用MySQL,PostgreSQL,H2或HSQL等。
正确创建迁移
迁移是指更新数据库时Flyway使用的版本脚本。例如,基于SQL的迁移命名为v1__init_tables.sql,内容是创建所有表的SQL语句。此外,Flyway还支持基于Java的迁移。飞行加载迁移的默认位置是ClassPath:DB/迁移,您还可以指定Filesystem:/project/project/文件夹,该文件在运行时自动递归执行。
除了指定位置外,Flyway的迁移扫描还必须符合某些命名模式。迁移主要分为两类:版本化和可重复。
版本的迁移通常在版本升级中使用。每个版本都有一个唯一的标识符,只能应用一次,并且无法修改加载的迁移,因为元数据表将记录其校验和值。版本标识符版本编号由一个或多个数字组成。数字之间的分离器可以是点或下划线。运行时,下划线实际上被点替换,每个部分的领先零将自动忽略。可重复的迁移可重复是指可重新加载的迁移。每个更新都会影响校验和值,然后将重新加载,而不用于版本升级。管理不稳定数据库对象的更新时非常有用。版本版本后,重复的迁移总是按顺序执行,但是开发人员必须自己维护脚本,并确保可以重复执行它们。通常,在SQL语句中使用创建或替换以确保可重复执行。默认情况下,基于SQL的迁移文件的命令规则如下所示:
文件名包括以下各节,除了使用默认配置外,某些部分还可以自定义规则。
可以配置Prefix:前缀标识,默认值V表示版本为版本,R表示RepoyableVersion:标识版本号,由一个或多个数字组成,数字之间的分离器可以是点。或underscore_separator:可以配置,用于将版本标识和描述信息分开,默认为两个下划线__description:说明信息,文本可以通过下注或空格分开。 Suffix:后续标识,默认为.sql。此外,如果您有兴趣,则可以参考基于Java的迁移。
支持的数据库
Currently, Flyway supports a lot of databases, including: 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和Phoenix。目前,我使用的数据库是PostgreSQL,MySQL,H2和HSQL。每个数据库的Flyway.url示例被配置为:
Flyway命令行
Flyway的命令行工具直接从命令行中运行6个命令。它不需要其他构建工具,也不需要应用程序在JVM中运行。它仅需要一个简单的命令行,但是它需要根据不同的操作系统下载和安装命令行工具。 Flyway将依次搜索以下配置文件,后来的配置将覆盖更高的配置:
/conf/flyway.conf/flyway.conf/flyway.conf/flyway.conf典型的飞行项目示例目录结构如下:
Gradle的申请
首先,您需要在Gradle中引入Flyway插件,通常有两种方法:
方法1:使用buildscript依赖性方法。 123456789 buildscript {repositories {mavencEntral()}依赖项{classPath(\’org.flywaydb:flyway-gradle-plugin-plugin:4.0.3\’}}}}}}}}}}}}}}}}} 123插件{id\’org.flywaydb.flyway\’版本\’4.0.3\’}有两种配置Gradle中的飞行属性的方法:
方法1:在build.gradle中配置飞行属性。 12345678910 flyway {url=JDBC:H2:/.tmp/testdbuser=sapassword=}或将其写入:project.ext [\’flyway.url\’]=\’ \’sa\’project.ext [\’flyway.password\’]=\’\’方式2:在gradle.properties中配置飞行属性。 123 flyway.url=jdbc:H23360./.tmp/testdbflyway.user=saflyway.password=如果您期望在运行Gradle清洁/构建任务时自动执行某些Flyway任务,则可以设置Deverson。如果您不希望隐式执行飞行任务,则无法配置它们。
clean.ependerson FlywayRepair修复Flyway Metadata Tablebuild.ippenderson Flywaymigrate以将模式迁移到最新版本,此外,其他任务:FlywayInfo,FlywayValidate和FlywayBaseline和FlywayBaseline与Flyway命令相对应。使用Spring Boot时,运行./gradlew BootRun会自动检查并加载最新的DB.Migration脚本。
特别说明:/gradlew flywayClean不应在生产环境中执行,除非您知道自己的行为和目的,因为命令将清除所有数据库对象,这很危险。
与Spring Boot集成
在Spring Boot中,如果添加Flyway的依赖项,则将自动引用Flyway并使用默认值,但是可以修改和配置FlywayProperties。
flyway.baseline-description=执行基线时标记现有模式的描述。将清洁所有对象。警告!请勿启用生产!flyway.enabled=trueenable flyway.flyway.encoding=utf-8ofmigrations.flyway.ignore-failed-future-future-mogration=true忽略未来的迁移时,读取gymetata table.flyway.init-sqls=sql squls=sql squls=sql语句=sql语句=sql语句。 it.flyway.locations=classPath:db/迁移迁移的位置scripts.flyway.out forder=false=false允许迁移允许迁移\’of order\’.flyway.flyway.placeholder.placeholder prefix=每个占位符。占位符。flyway.placeholder。 sql migrationsflyway.table的文件名词后缀=schema_versionflyway的元数据table.flyway.url=迁移数据库的jdbc url。如果未设置,则使用主要配置的数据源。Flyway.user=数据库的登录用户迁移。如果未设置,请使用spring.datasource.username value.flyway.password=jdbc密码,如果要飞行来创建自己的datasource.flyway.validate.validate-migrate=truevalidatevalidate sql sql迁移crc32 crc32 crc32 classpath中的charksum。如果使用了gradle,则可以在org.flywaydb:flyway-core:4.0.3之后使用它。可能有几个要求:
本地运行和测试使用内存数据库,spring.jpa.hibernate.ddl-auto设置为验证。模式不需要自动生成冬眠并期望使用飞行。在线环境使用真实数据库,并且不希望使用Flyway。如何实现这一目标?解决方案:您可以配置flyway.enabled=false in Common.Properties,然后在本地或DEV配置中启用Flyway。通常建议使用此模式,毕竟可以控制不同的环境。此外,本地运行将不依赖实际数据库,并且可以确保根据脚本创建数据库架构。运行测试时,您将使用一个内存数据库,并且将拥有一个单独的配置文件。您不会使用飞行。运行本地启动时,您将使用真实的数据库和飞行。毕竟,您不想在架构更改后本地手动执行脚本。如何实施它? Solution: Set bootRun.dependsOn to dynamically add Flyway dependencies: 123456789 addFlywayDenpendency {doLast {dependencies {compile(\’org.flywaydb:flyway-core:4.0.3\’)}}}bootRun.dependsOn=addFlywayDenpendency If multiple teams develop different functions at the same time, multiple branches need to be创建,所有数据库架构更改都将涉及。稍后合并时,如何控制迁移版本,不会在数据库更改中引起冲突?解决方案:如果两个分支冲突的数据库更改,则初始数据库设计是不合理的,或者当前的数据库更改是不合理的,因此团队需要在全球上考虑和协调。对于同时修改数据库但不会引起冲突的情况,这种情况通常是实际项目的主要情况。您可以设置flyway.out of-of-of-of-of-of-of-of-of-of-of-of-of-of-of-of-of-of-of-of-of-of-of-of-of-of-of-of-of-of-of-of-of true=true,它允许使用V1和V3,并且在出现V2时也可以应用V2。实际上,在本地使用内存数据库时,此问题将不存在,因为数据库中的所有对象都将自动清除,并且在使用本地或开发人员中使用真实数据库时,您可能会遇到此类问题,因此您需要注意。此外,值得一提的是,默认情况下,参数忽略了Flyway的未实现未来的移民。用法是:当回滚数据库更改为旧版本并且新版本已经存在于元数据表中时,Flyway将忽略此错误,而仅显示警告消息。结论
简而言之,Flyway可以有效地改善数据库版本管理方法。如果该项目尚未使用,请不要尝试。如果您有兴趣,也可以关注mybatis迁移。它的功能支持不如Flyway高,并且是一个较轻的数据库版本管理工具。如果您在使用过程中遇到问题或陷阱,请留言进行交流和讨论。
用户评论
墨城烟柳
这个教程真的太棒了!我之前对 Flyway 一无所知,看了你的文章之后,现在终于明白它的强大之处了,而且操作起来很简便,我今天就用它迁移数据库试试看!
有20位网友表示赞同!
焚心劫
看完你的文章后感觉Flyway确实挺实用的,特别是对于大型项目而言,可以更好地管理数据库变更。但我还是觉得官方文档太详细了点,有时候会让人望而却步…
有17位网友表示赞同!
汐颜兮梦ヘ
标题说的没错,这个教程是真的快!把 Flyway 的核心概念讲得一目了然,而且实践步骤也很清晰易懂。学习过程非常顺畅,很快就上手了!
有9位网友表示赞同!
巷雨优美回忆
虽然 Flyway确实好用,但我总觉得有一些东西没有彻底理解。例如使用各种迁移脚本的时候,还是会有点困惑,不知道如何针对不同的业务场景选择合适的策略? 文章里是不是可以深入讲解一下这些方面?
有16位网友表示赞同!
拽年很骚
感谢分享这种宝贵的资源!之前一直在用手动方式来操作数据库变更,太费时间了,Flyway 省去了很多麻烦。学习下来感觉这个工具真的非常值得一试!
有13位网友表示赞同!
陌颜
对于新手来说,这篇关于 Flyway 的文章讲解得相当到位了!从入门到应用,一环扣一环,节奏很好掌握,而且通俗易懂的语言很便于理解。我强烈推荐给想要学习数据库迁移工具的朋友们!
有19位网友表示赞同!
单身i
快速掌握Flyway确实没毛病,但“使用”方面我觉得还是需要多加练习才能真正精通。文章里可以再多一些案例分析和实战经验分享,这样更能帮助我们更好地理解和应用 Flyway 。
有19位网友表示赞同!
西瓜贩子
我一直都在寻找一款靠谱的数据库迁移工具,今天终于找到了!Flyway 的功能非常强大,而且操作简单易用,我相信它能够大大提升我的开发效率。感谢作者的讲解!
有7位网友表示赞同!
歇火
其实我之前也一直在使用 Flyway,但这篇文章里的一些小技巧还是让我眼前一亮!比如如何优化迁移脚本、如何处理冲突等,都有了一些新的认识和启发。
有15位网友表示赞同!
颓废i
Flyway 的这个工具看起来确实很有潜力,可以简化数据库管理工作,但我还在犹豫要不要更换现有的系统。やっぱり 仔细考虑一下各个环节的兼容性问题吧!
有16位网友表示赞同!
限量版女汉子
我对 Flyway的定位感觉不是非常明确,它到底更适合小型项目还是大型项目呢?文中提到它的优点,但没有对比其他类似工具,让我很难做出选择。
有19位网友表示赞同!
喜欢梅西
我觉得快速掌握Flyway 的重点在于理解它的核心概念。文章里提到的这些概念确实很重要,特别是“迁移脚本” 和“Version Control”,对于想要深入学习 Flyway 的朋友来说非常有用。)
有7位网友表示赞同!
小清晰的声音
这篇文章写的真好!简洁易懂,而且针对性的讲解了 Flyway 的关键功能,对我新接触这个工具的人来说非常有帮助。谢谢分享!
有5位网友表示赞同!
我的黑色迷你裙
我之前尝试过Flyway ,当时感觉太复杂,放弃了学下去。看来我还是应该再深入了解一下,这篇文章的介绍确实很有启发性。
有9位网友表示赞同!
断秋风
虽然篇幅很短,但文章里涵盖了 Flyway 的基本概念和使用方法,足够让我入门开始学习啦!
有12位网友表示赞同!
风中摇曳着长发
对于那些已经熟悉数据库迁移原理的人来说,这篇文章或许太基础了。不过对于新手来说还是很好用的入门指南。
有14位网友表示赞同!