Springboot集成flyway实现数据库自动迁徙

Java学习栈

共 4380字,需浏览 9分钟

 ·

2021-03-29 04:27

点击蓝色字关注我们!




一个努力中的公众号

长的好看的人都关注了

前言

    Flyway是一款管理并跟踪数据库迁移(migrate)的数据库版本管理工具。它可以像SVN管理不同人的代码那样,管理不同人的sql脚本,从而做到数据库同步。

    它可以帮助我们在不同环境保持数据库的同步,减少手工操作,同时也减少了遗漏的机会。

    Flyway可以集成在项目中,可以与Spring 框结合。在项目发版时,自动执行数据库脚本,无需人为执行数据库同步操作。

1.添加flywaymaven添加依赖

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

将上面的依赖添加到主项目的pom.xml中

2. 在application.yml 配置文件中配置flyway相关配置

需要注意的是,flyway配置放在spring配置下、根据自己实际情况配置相关参数

# flyway 配置
flyway:
# 执行基线时用来标记已有Schema的版本.(默认值:1)
baseline-version: 1
# 开启Flyway(默认true)
enabled: true
# SQL迁移的文件名前缀(默认值为V 可以不设置)
sql-migration-prefix: V
# 迁移sql脚本文件名称的分隔符(默认2个下划线__)
sqlMigrationSeparator: __
# SQL迁移的文件名后缀(默认值:.sql 可以不设置)
sql-migration-suffixes: .sql
# 迁移时是否进行校验,默认true
validateOnMigrate: true
# 在没有元数据表的情况下,针对非空Schema执行迁移时是否自动调用基线。
baseline-on-migrate: true
# 迁移脚本的位置(默认为classpath:db/migration)
locations: classpath:db/migration
# 数据库连接配置
url: ${spring.datasource.dynamic.datasource.master.url}
user: ${spring.datasource.dynamic.datasource.master.username}
password: ${spring.datasource.dynamic.datasource.master.password}
# 需要升级的数据库实例名
schemas: jeecg-boot
# 编码格式
encoding: UTF-8
# 忽略脚本顺序:开发环境应该设置trueflyway将能加载漏掉的老版本SQL文件 生成环境需要设置false
out-of-order: true
# 发生验证的错误时是否执行clean操作(如SQL执行失败),默认false,生产中必须使用false
clean-on-validation-error: true
# 是否禁用clean操作,默认false,生产中必须使用true
clean-disabled: false

Springboot flyway配置说明

-- spring boot flyway 配置说明
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]设置placeholdervalue
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.
-- spring boot flyway 配置说明


3.在迁移脚本的文件夹中创建对应sql脚本


写入相关sql语句


  SpringBoot应用运行时flyway会根据脚本进行数据库的初始化,执行的顺序会根据脚本版本号由低到高按顺序执行(1.0 -> 1.0.1 -> 1.0.2),每执行完一个版本脚本都会向记录表flyway_history_schema插入一条数据。

 若添加了新的版本脚本,应用启动时flyway会根据脚本文件版本到记录表flyway_history_schema查询是否有对应的版本脚本被执行了,如果没有相应的版本脚本记录才会执行脚本。
 
不过需要注意:flyway不支持版本回滚。(需手动,比较悲剧的一点)、所以需要准备两份sql,如果迁移的sql执行成功后需要回滚,就执行对应的回滚sql,如果迁移失败,flyway可以通过注解执行回滚。


4.启动了SpringBoot项目后,就会自动帮你执行SQL文件

 执行历史可以在 flyway_schema_history 表中查看、已经执行过的迁移sql就不会再执行,主要是在这个历史表中控制,如果需要重新执行,那么删除对应版本及以后的执行历史重启项目就会重新执行对应脚本

刷新对应数据库,就可以看到通过迁移脚本生成的表结构。


使用总结


    我们是在中途尝试使用flyway,所以开发环境会有一个已存在的数据库。我们需要从开发环境中导出数据库脚本,并对开发环境数据库进行baseline标记。导出的脚本可用于新环境的部署。

    如果我们已经有了生产环境,而且生产环境和开发环境的数据库已经有了较大的差异。暂时可以想到的方案大概有2个方案:

方案一:

   在生产环境备份数据库,然后创建一个全新的数据库,手动将备份库里的数据导入到新的数据库。

方案二:

   基于生产环境的数据库,创建V1版本的脚本;基于开发库相对于生产库的变更,创建V2版本的脚本。在开发环境baseline,然后修改版本记录,改为2。在生产环境中baseline,然后migrate使其升级到2。

方案一:
   需要更多的人工介入,但是比较稳妥;
方案二:
   难点在于溯源出正确的差异,编制V2脚本。



本次的学习到这里就结束了,因为图图也是第一次接触这种数据迁移软件,所以总结不是很到位,如果有问题可以加图图微信,大家一起学习、一起来解决。

如果对您有帮助 请点个关注,万分感谢
          

                                (QQ招聘群  710566091
                                 微信招聘群 请加图图微信)


                
浏览 68
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报