Flyway数据库脚本管理工具使用经验

简介: 在常见的敏捷开发过程中,迭代的更新频繁出现,每个迭代数据库脚本也经常会更新,为了更好地管理项目中的数据库脚本,下面为大家介绍一款数据库脚本管理工具Flyway,希望对大家有帮助!

Flyway介绍

Flyway是⼀款开源的数据库版本管理⼯具,它更倾向于规约优于配置的⽅式。Flyway可以独⽴于应⽤实现管理并跟踪数据库变更,⽀持数据库版本⾃动升级,并且有⼀套默认的规约,不需要复杂的配置,Migrations可以写成SQL脚本,也可以写在Java代码中,不仅⽀持CommandLine和JavaAPI,还⽀持Build构建⼯具和SpringBoot等。


⽀持的数据库

⽀持数据库有Oracle,SQLServer,SQLAzure,DB2,DB2z/OS,MySQL(includingAmazonRDS),MariaDB,GoogleCloudSQL,PostgreSQL(includingAmazonRDSandHeroku),Redshift,Vertica,H2,Hsql,Derby,SQLite,SAPHANA,solidDB,SybaseASEandPhoenix

PS:不⽀持分布式数据库,譬如阿⾥云的DRDS


工作原理

场景⼀:使⽤flyway迁移到⼀个空数据库

image.png

flyway会新建⼀个元数据表(SCHEMA_VERSION)⽤于记录migrate信息和跟踪数据库的状态。

image.png

然后,扫描指定路径下的脚本⽂件,按照版本号的顺序执⾏脚本。

image.png

最后,SCHEMA_VERSION表中会⽣成相关的记录。

image.png

场景⼆:使⽤flyway迁移到⼀个⾮空数据库

下图Migration1和Migration2为已执⾏过的脚本,Migration2.1为准备执⾏的脚本。

image.png

flyway会扫描SCHEMA_VERSION表,判断Migration1、Migration2、Migration2.1是否有执⾏成功的记录,如果有,则不会再执⾏,如果没有,则该脚本进⼊等待状态,最后flyway会按照版本顺序执⾏脚本SCHEMA_VERSION表中会⽣成相关的记录。

image.png

客户端使⽤

1.从官⽹下载安装包https://flywaydb.org/documentation/commandline/,并且解压

image.png

“flyway.conf”为flyway的配置⽂件,主要配置数据库信息和flyway规则信息;

“sql”⽂件夹⽤来存放数据库脚本⽂件;

“drivers”⽂件夹⽤来存放JDBC的driver;


2.数据库脚本的命名规则

例⼦:V20181114__itsp.sql

"V":默认prefix是V(执⾏⼀遍,并且版本号唯⼀,如果有重复就会报错)或R(重复执⾏,不需要版本号)

"20181114":版本号

"__":两个下划线

"itsp":描述

".sql":后缀名数据库脚本按照上⾯规则命名,flyway就可以识别并且执⾏脚本。

命名规则也可以在“flyway.conf”⽂件中配置。


3.flyway命令Flyway主要基于6种基本命令:Migrate,Clean,Info,Validate,Baselineand Repair

flyway migrate

image.png

此命令会⾃动检查数据库脚本是否有变化,如果有变化,则执⾏脚本,更新数据库版本,如果数据库初始状态是空库,则会⾃动创建schema_version表,⽤于存储数据库操作的版本记录,只要数据库脚本有变化,都需要执⾏此命令。


flyway clean

image.png

清除schema_version中记录所有表结构,视图,存储过程,函数以及所有的数据等都会被清除。


flyway info

image.png

打印schema_version中记录信息。


flyway validate

image.png

Validate是指验证已经Apply的Migrations是否有变更,Flyway是默认是开启验证的。


flyway baseline

image.png

Baseline是指数据库⾮空状态下使⽤flyway⾸先执⾏的命令,⽤于创建schema_vision表。


flyway repair

image.png

Repair会修复Metadata表的错误,通常有两种⽤途:a)移除失败的Migration记录,该问题只是针对不⽀持DDL事务的数据库。b)重新调整已经应⽤的Migratons的Checksums值,⽐如:某个Migratinon已经被应⽤,但本地进⾏了修改,⼜期望重新应⽤并调整Checksum值,不过尽量不要这样操作,否则可能造成其它环境失败。


4.命令执⾏

运⾏CMD,进⼊flyway客户端的⽬录中执⾏:flywaymigrate

image.png

执⾏完毕后,数据库按照脚本新建了三个业务表和⼀张flyway的元数据表。

image.png

元数据表中的数据就是记录三个脚本的运⾏情况。

image.png


SpringBoot整合Flyway

1.引⼊maven依赖

image.png

2.配置⽂件

image.png

配置详解:

flyway.baseline-description对执⾏迁移时基准版本的描述.

flyway.baseline-on-migrate当迁移时发现⽬标schema⾮空,⽽且带有没有元数据的表时,是否⾃动执⾏基准迁移,默认false.

flyway.baseline-version开始执⾏基准迁移时对现有的schema的版本打标签,默认值为1.

flyway.check-location检查迁移脚本的位置是否存在,默认false.

flyway.clean-on-validation-error当发现校验错误时是否⾃动调⽤clean,默认false.

flyway.enabled是否开启flywary,默认true.

flyway.encoding设置迁移时的编码,默认UTF-8.

flyway.ignore-failed-future-migration当读取元数据表时是否忽略错误的迁移,默认false.

flyway.init-sqls当初始化好连接时要执⾏的SQL.flyway.locations迁移脚本的位置,默认db/migration.

flyway.out-of-order是否允许⽆序的迁移,默认false.

flyway.password⽬标数据库的密码.

flyway.placeholder-prefix设置每个placeholder的前缀,默认${.

flyway.placeholder-replacementplaceholders是否要被替换,默认true.

flyway.placeholder-sufix设置每个placeholder的后缀,默认}.

flyway.placeholders.[placeholdername]设置placeholder的valueflyway.schemas设定需要flywary迁移的schema,⼤⼩写敏感,默认为连接默认的schema.

flyway.sql-migration-prefix迁移⽂件的前缀,默认为V.

flyway.sql-migration-separator迁移脚本的⽂件名分隔符,默认__

flyway.sql-migration-sufix迁移脚本的后缀,默认为.sql

flyway.tableflyway使⽤的元数据表名,默认为schema_version

flyway.target迁移时使⽤的⽬标版本,默认为latestversion

flyway.url迁移时使⽤的JDBCURL,如果没有指定的话,将使⽤配置的主数据源

flyway.user迁移数据库的⽤户名

flyway.validate-on-migrate迁移时是否校验,默认为true.


3.启动Springboot,flyway就会⾃动从脚本路径中按照规则执⾏脚本

image.png


4.遇到的问题

a)在遇到需要先加载数据⽅⾯的操作,都需要在flyway执⾏完毕后才能加载不然会出现找不到新增的表或者修改的表结构、新增表数据。

解决办法:在对应的bean上加上@DependsOn("flywayInitializer")注解。


b)在本地Run和Tests都会使⽤内存数据库,其中的spring.jpa.hibernate.ddl-auto都设置为validate,Schema不需要Hibernate⾃动⽣成,并期望使⽤Flyway,⽽在线上环境会使⽤真实数据库,并不期望使⽤Flyway,如何实现呢?

解决⽅案:可以在common.properties中配置flyway.enabled=false,然后在local或dev的配置中启⽤Flyway即可。通常推荐使⽤此模式,毕竟可以对不同的环境进⾏控制,另外本地Run不会依赖真实数据库,⼜能保证数据库Schema是按脚本创建的。


c)若项⽬有多个团队同时开发不同的功能,需要新建多个分⽀,并且都会涉及到数据库Schema更改,当后期Merge时,Migration的版本如何控制并且不会产⽣数据库更改的冲突呢?

解决⽅案:如果两个分⽀的数据库更改有冲突,要么最初数据库设计不合理,要么⽬前数据库更改不合理,所以需要团队进⾏全局考虑和协调。⽽针对数据库在同⼀段时间有修改,但不会造成冲突的情况,通常实际项⽬中主要存在这样的情况,那可以设置,这样允许当v1和v3已经被应⽤后,v2出现时同样也可以被应⽤。其实在本地使⽤内存数据库不会存在该问题,因为数据库所有对象会⾃动清除掉,⽽在local或dev中使⽤真实数据库时可遇到这样的问题,因此需要注意⼀下了。

相关文章
|
2月前
|
SQL 存储 关系型数据库
IDEA中居然有碾压Navicat的数据库管理工具
【8月更文挑战第12天】IDEA中居然有碾压Navicat的数据库管理工具
98 3
IDEA中居然有碾压Navicat的数据库管理工具
|
16天前
|
SQL 关系型数据库 MySQL
MySQL数据库中给表添加字段并设置备注的脚本编写
通过上述步骤,你可以在MySQL数据库中给表成功添加新字段并为其设置备注。这样的操作对于保持数据库结构的清晰和最新非常重要,同时也帮助团队成员理解数据模型的变化和字段的具体含义。在实际操作中,记得调整脚本以适应具体的数据库和表名称,以及字段的详细规范。
25 8
|
2月前
|
人工智能 小程序 Java
【工具】轻松解锁SQLite数据库,一窥微信聊天记录小秘密
本文介绍了一款名为PyWxDump的开源工具,它可以获取微信账户信息、解密SQLite数据库以查看和备份聊天记录。此工具适用于已登录电脑版微信的用户,通过GitHub下载后简单几步即可操作。适合对数据恢复感兴趣的开发者,但请注意合法合规使用并尊重隐私。
200 2
【工具】轻松解锁SQLite数据库,一窥微信聊天记录小秘密
|
1月前
|
SQL Java 数据库连接
数据库迁移不再难:Flyway 与 Liquibase 大比拼,哪个才是你的真命天子?
【9月更文挑战第3天】数据库迁移在软件开发中至关重要,尤其在使用 ORM 框架如 Hibernate 时。为确保部署时能顺利应用最新的数据库变更,开发者常使用自动化工具。Flyway 和 Liquibase 是当前流行的两种选择,均能有效管理数据库版本控制。Flyway 采用 SQL 脚本表示变更,简单易用;Liquibase 支持多种脚本格式,功能更强大,适合复杂项目。本文将对比这两种工具的特点,并通过示例展示各自的优缺点,帮助开发者根据项目需求做出合适的选择。
61 1
|
2月前
|
存储 前端开发 关系型数据库
秀啊,用Python快速开发在线数据库更新修改工具
秀啊,用Python快速开发在线数据库更新修改工具
|
2月前
|
前端开发 数据库 Python
用Python轻松开发数据库取数下载工具
用Python轻松开发数据库取数下载工具
|
2月前
|
SQL 数据可视化 关系型数据库
成功解决7版本的数据库导入 8版本数据库脚本报错问题
您提供的链接是一篇关于如何解决在MySQL数据库中导入脚本时出现版本兼容性问题的博客文章。文章中提到,如果在MySQL 5.7之前的版本中使用utf8mb4_0900_ai_ci排序规则,会遇到"Unknown collation"错误。解决办法包括升级MySQL版本到8.0或更高,或者更改排序规则为utf8mb4_general_ci或utf8mb4_unicode_ci,并提供了修改SQL脚本的示例。 如果您需要更详细的信息或有其他问题,请告诉我。
|
2月前
|
关系型数据库 MySQL Shell
MySQL数据库一键安装脚本,适合任何版本
MySQL数据库一键安装脚本,适合任何版本
38 2
|
2月前
|
SQL NoSQL 关系型数据库
推荐3款免费且实用的数据库管理工具
推荐3款免费且实用的数据库管理工具
131 2
|
2月前
|
Java 开发者 前端开发
Struts 2、Spring MVC、Play Framework 上演巅峰之战,Web 开发的未来何去何从?
【8月更文挑战第31天】在Web应用开发中,Struts 2框架因强大功能和灵活配置备受青睐,但开发者常遇配置错误、类型转换失败、标签属性设置不当及异常处理等问题。本文通过实例解析常见难题与解决方案,如配置文件中遗漏`result`元素致页面跳转失败、日期格式不匹配需自定义转换器、`<s:checkbox>`标签缺少`label`属性致显示不全及Action中未捕获异常影响用户体验等,助您有效应对挑战。
63 0
下一篇
无影云桌面