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中使⽤真实数据库时可遇到这样的问题,因此需要注意⼀下了。

相关文章
|
28天前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
126 68
|
25天前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
84 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
1月前
|
SQL 关系型数据库 MySQL
|
1月前
|
SQL 数据可视化 关系型数据库
【数据库工具】DBeaver:一款免费的通用数据库工具和 SQL 客户端
【数据库工具】DBeaver:一款免费的通用数据库工具和 SQL 客户端
122 1
|
1月前
|
Rust 关系型数据库 Linux
Rainfrog: 轻量级数据库管理工具
【10月更文挑战第3天】
|
1月前
|
安全 数据库 数据安全/隐私保护
数据库 变更和版本控制管理工具 --Bytebase 安装部署
数据库 变更和版本控制管理工具 --Bytebase 安装部署
51 0
|
2月前
|
SQL 关系型数据库 MySQL
MySQL数据库中给表添加字段并设置备注的脚本编写
通过上述步骤,你可以在MySQL数据库中给表成功添加新字段并为其设置备注。这样的操作对于保持数据库结构的清晰和最新非常重要,同时也帮助团队成员理解数据模型的变化和字段的具体含义。在实际操作中,记得调整脚本以适应具体的数据库和表名称,以及字段的详细规范。
63 8
|
3月前
|
人工智能 小程序 Java
【工具】轻松解锁SQLite数据库,一窥微信聊天记录小秘密
本文介绍了一款名为PyWxDump的开源工具,它可以获取微信账户信息、解密SQLite数据库以查看和备份聊天记录。此工具适用于已登录电脑版微信的用户,通过GitHub下载后简单几步即可操作。适合对数据恢复感兴趣的开发者,但请注意合法合规使用并尊重隐私。
524 2
【工具】轻松解锁SQLite数据库,一窥微信聊天记录小秘密
|
2月前
|
SQL Java 数据库连接
数据库迁移不再难:Flyway 与 Liquibase 大比拼,哪个才是你的真命天子?
【9月更文挑战第3天】数据库迁移在软件开发中至关重要,尤其在使用 ORM 框架如 Hibernate 时。为确保部署时能顺利应用最新的数据库变更,开发者常使用自动化工具。Flyway 和 Liquibase 是当前流行的两种选择,均能有效管理数据库版本控制。Flyway 采用 SQL 脚本表示变更,简单易用;Liquibase 支持多种脚本格式,功能更强大,适合复杂项目。本文将对比这两种工具的特点,并通过示例展示各自的优缺点,帮助开发者根据项目需求做出合适的选择。
559 1
|
3月前
|
存储 前端开发 关系型数据库
秀啊,用Python快速开发在线数据库更新修改工具
秀啊,用Python快速开发在线数据库更新修改工具
下一篇
无影云桌面