数据库版本管理-Flyway

1.Flyway简介

我们在公司做开发时,由于项目需求的变化,或者前期设计缺陷,导致在后期需要修改数据库,这应该是一个比较常见的事情,如果项目还没上线,你可能把表删除了重新创建,但是如果项目已经上线了,就不能这样简单粗暴了,我们需要通过 SQL 脚本在已有数据表的基础上进行升级。

Flyway是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。用通俗的话讲,Flyway可以像Git管理不同人的代码那样,管理不同版本的sql脚本,从而做到数据库同步。

2.Flyway使用

Flyway不限定脚本里面的内容,但是对脚本文件的名称有一定的要求,一般的结构为:版本号_版本描述.sql,如V1.1_init_database.sql。

我们在定义脚本的时候,除了 V 字开头的脚本之外,还有一种 R 字开头的脚本,V 字开头的脚本只会执行一次,而 R 字开头的脚本,只要脚本内容发生了变化,启动时候就会执行。

具体要求:

  • 版本号和版本描述之间,使用两个下划线分隔。
  • 版本描述之间,使用一个下划线分隔单词。
  • 版本号唯一:不允许多个脚本文件有相同的版本号。

3.Flyway工作原理

使用Flyway升级,flyway会自动创建一张历史记录表:flyway_schema_history。

这张表记录了每一次升级的记录,包括已经执行了哪些脚本,脚本的文件名,内容校验和,执行的时间和结果:

flyway在升级数据库的时候,会检查已经执行过的版本对应的脚本是否发生变化,包括脚本文件名,以及脚本内容。如果flyway检测到发生了变化,则抛出错误,并终止升级。

如果已经执行过的脚本没有发生变化,flyway会跳过这些脚本,依次执行后续版本的脚本,并在记录表中插入对应的升级记录。

所以,flyway总是幂等的,而且可以支持跨版本的升级。

如果你好奇,flyway如何检查脚本文件的内容是否有修改。你可以注意以下记录表中有一个字段checksum,它记录了脚本文件的校验和。flyway通过比对文件的校验和来检测文件的内容是否变更。

使用上面的方式,升级一个空的数据库,或者在一直使用flyway升级方案的数据库上进行升级,都不会又问题。但是,如果在已有的数据库引入flyway,就需要一些额外的工作。

flyway检测数据库中是否有历史记录表,没有则代表是第一次升级。此时,flyway要求数据库是空的,并拒绝对数据库进行升级。

你可以设置baseline-on-migrate参数为true,flyway会自动将当前的数据库记录为V1版本,然后执行升级脚本。这也表示用户所准备的脚本中,V1版本的脚本会被跳过,只有V1之后的版本才会被执行。

4.springboot集成Flyway

在 Spring Boot 中,引入相关的依赖:

        <dependency>
			<groupId>org.flywaydb</groupId>
			<artifactId>flyway-core</artifactId>
			<version>5.2.4</version>
		</dependency>

关于 Flyway 也有不少配置,直接在application.yml文件配置就行了:

spring:
  flyway:
    enabled: true #是否开启 flyway,默认就是开启的
    baseline-on-migrate: true #当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
    check-location: true #检查迁移脚本的位置是否存在,默认false.
    locations: classpath:sql/sfc_synchronizer_auto_exec/  #sql 脚本的目录,默认是 classpath:db/migration,如果有多个,用 , 隔开
    table: schema_version_synchronizer  #配置数据库信息表的名称,默认是 flyway_schema_history。
    sql-migration-prefix: SFC-SYNCHRONIZER_ #sql脚本文件前缀
    sql-migration-separator: __ #SQL脚本文件分隔符
    sql-migration-suffixes: .sql  #SQL脚本文件结束符
    encoding: utf-8 #flyway 字符编码
    clean-disabled: true #flyway 的 clean 命令会删除指定 schema 下的所有 table, 生产务必禁掉。这个默认值是 false 理论上作为默认配置是不科学的。

更加详细的配置如下:

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-suffix设置每个placeholder的后缀,默认}.
flyway.placeholders.[placeholder name]设置placeholder的value
flyway.schemas设定需要flywary迁移的schema,大小写敏感,默认为连接默认的schema.
flyway.sql-migration-prefix迁移文件的前缀,默认为V.
flyway.sql-migration-separator迁移脚本的文件名分隔符,默认__
flyway.sql-migration-suffix迁移脚本的后缀,默认为.sql
flyway.tableflyway使用的元数据表名,默认为schema_version
flyway.target迁移时使用的目标版本,默认为latest version
flyway.url迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源
flyway.user迁移数据库的用户名
flyway.validate-on-migrate迁移时是否校验,默认为true.

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flyway是一个用于数据库版本控制的工具,类似于我们使用Git来管理代码版本。它可以帮助我们管理数据库版本,通过执行SQL脚本来进行数据库的迁移操作。\[1\] Flyway会将每次执行过的SQL脚本的版本号和生成的checksum保存在数据库flyway_schema_history表中。在下次执行数据库迁移时,Flyway会按照版本号从低到高的顺序执行SQL脚本。如果之前的版本号脚本已经执行过,则不会再次执行。如果之前版本的SQL脚本在执行过程中被修改,则会报错。\[2\] Flyway的工作流程可以参考Flyway官网的详细描述和介绍。\[2\] Flyway的作用是解决在产品发布过程中数据库版本与代码版本不匹配的问题。通过使用Flyway,我们可以对不同环境的SQL进行迁移操作,确保数据库与代码的版本一致性。\[3\] #### 引用[.reference_title] - *1* [Flyway数据库版本控制](https://blog.csdn.net/qq_22596931/article/details/115537039)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Flyway 数据库版本控制](https://blog.csdn.net/qq_37196321/article/details/125379470)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值