当前位置: 首页 > 后端技术 > Java

SpringBoot数据库管理——使用flyway进行数据库管理和迁移

时间:2023-04-01 17:45:52 Java

以上介绍了Liquibase及其与SpringBoot的集成。除了Liquibase,还有一个组件Flyway,也是经常用到的类似数据库版本管理的中间件。本文主要介绍Flyway,SpringBoot集成了Flyway。@pdaiSpringBoot数据库管理-使用flyway准备数据库管理和迁移知识什么是Flyway?你想解决什么问题?Flyway中的迁移(migrations)Flyway中常用命令的简单示例POM依赖yml配置Migrate配置测试进一步了解MySQL支持问题示例源码知识准备需要了解Flyway和需要解决的问题,以及一些基本概念,比如迁移(migrations)、常用命令(commands)等。什么是Flyway?它解决了什么问题?Flyway是一款数据库迁移(migration)工具。简单的说,它是一个帮助你在部署应用程序时执行数据库脚本的工具。Flyway支持两种类型的脚本,SQL和Java。您可以将脚本打包到应用程序中。当应用程序启动时,Flyway会管理这些脚本的执行。这些脚本被Flyway称为迁移。PS:本质上和liquibase机制是一样的。按照verion的先后顺序(对比数据库中的更新记录,找出没更新过的),如下更新以下更新记录Flyway中的Migrations对于Flyway来说,对数据库的所有更改都称为migrations,即相当于liquibase中的changeset。Flyway中对migrations的定义更加详细,包括以下三种:VersionedMigrations:每个版本执行一次,包括version、description、checksum;它通常用于创建、修改和删除表;insert,Modifydata等。UndoMigrations:VersionedMigrations的逆向操作。可重复迁移(RepeatableMigrations):可以执行多次,包括描述和校验(无版本);主要用于视图、存储过程、函数等。这三种类型对应的格式如下:前缀:V代表版本转换(VersionedMigrations),U代表UndoMigrations,R代表RepeatableMigrations版本号:a唯一版本号,如V1.0.1分隔符:__(两个下划线)描述信息:描述信息后缀:.sql(PS:UndoMigrations在付费版)Flyway中常用的命令有哪些?这是什么意思?Migrate:是Flyway工作流程的核心。它将扫描文件系统或类路径以查找可用的迁移。它将它们与已应用于数据库的迁移进行比较。如果发现任何差异,将迁移数据。clean:清除对应数据库Schema中的所有对象,包括表结构、视图、存储过程等,clean操作在dev和test阶段非常有用;(PS:产品环境下不能使用)Info:用于打印所有Migrations的详细信息和状态信息,也是通过MetaData和Migrations完成的,可以快速定位到当前数据库版本;Validate:验证并应用Migrations是否发生变化,默认开启;原理是比较MetaData表的checkNum值和本地的Migrations,如果值相同则校验通过,否则不通过。Undo:Migrate的逆向操作,即回滚操作,是收费功能BaseLine:针对已有数据库Schema结构的数据库的解决方案。在非空数据库中新建一个MetaData表,并将Migrations应用到数据库中;也可以应用于已有表结构的数据库,也可以添加Metadata表。修复:修复操作可以修复元数据表。当元数据中存在错误时,此操作很有用。简单示例这里主要介绍基于SpringBoot集成flyway的数据库变更管理。POM依赖Maven包的依赖,主要包括mysql驱动、JDBC(这里spring-boot-starter-data-jpa包含了jdbc包,当然也可以直接导入jdbc包),以及飞路包。mysqlmysql-connector-java8.0.28com.github.wenhaojpa-spec<版本>3.1.0org.springframework.bootspring-boot-starter-data-jpaorg.flywaydbflyway-mysql8.5.7yml配置SpringBootAutoConfig默认已经包含了对flyway的配置,在spring.flyway配置下spring:datasource:url:jdbc:mysql://localhost:3306/test_db_flyway?useSSL=false&autoReconnect=true&characterEncoding=utf8driver-class-name:com.mysql.cj.jdbc.Driver用户名:rootpassword:bfXa4Pt2lUUScy8jakXfflyway:enabled:trueencoding:UTF-8#可以支持多个位置,用','分隔位置:classpath:db/migration#是否验证validate-on-migrate:true开发过程中,更改更多配置即可可以在下面的SpringBootAutoConfig中找到Migrate配置在这里我们准备好两个VersionedMigrationV1.0__Init_DB.sqlDROPTABLEIFEXISTS`tb_user`;/*!40101SET@saved_cs_client=@@character_set_client*/;/*!40101SETcharacter_set_client=utf8`*`/;CREATETABLE(`id`int(11)NOTNULLAUTO_INCREMENT,`user_name`varchar(45)NOTNULL,`password`varchar(45)NOTNULL,`email`varchar(45)DEFAULTNULL,`phone_number`int(11)DEFAULTNULL,`description`varchar(255)DEFAULTNULL,`create_time`datetimeDEFAULTNULL,`update_time`datetimeDEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=utf8;/*!40101SETcharacter_set_client=@saved_cs_client*/;V1.1__Init_Data.sqlLOCKTABLES`tb_user`WRITE;/*!40000ALTERTABLE`tb_user`DISABLEKEYS*/;INSERTINTO`tb_user`VALUES(1,'pdai','dfasdf','suzhou.daipeng@gmail.com',1212121213,'afsdfsaf','2021-09-0817:09:15','2021-09-0817:09:15');/*!40000ALTERTABLE`tb_user`ENABLEKEYS*/;UNLOCKTABLES;测试启动springBootApplica化,我们可以看到如下log2022-04-1307:56:56.122INFO86030---[main]o.f.c.i.database.base.DatabaseType:Database:jdbc:mysql://localhost:3306/test_db_flyway(MySQL8.0)2022-04-1307:56:56.220INFO86030---[main]o.f.core.internal.command.DbValidate:成功验证了2次迁移(执行时间00:00.074s)2022-04-1307:56:56.245INFO86030---[主要]o.f.c.i.s.JdbcTableSchemaHistory:创建模式历史表`test_db_flyway`.`flyway_schema_history`...2022-04-1307:56:56.270INFO86030---[主要]o.f.c.i.s.DefaultSqlScriptExecutor:0行受影响2022-04-1307:56:56.282INFO86030---[main]o.f.c.i.s.DefaultSqlScriptExecutor:0行affected2022-04-1307:56:56.292INFO86030---[main]o.f.core.internal.command.DbMigrate:架构的当前版本`test_db_flyway`:<<空模式>>2022-04-1307:56:56.297信息86030---[主要]o.f.core.internal.command.DbMigrate:将架构`test_db_flyway`迁移到版本“1.0-InitDB”2022-04-1307:56:56.309WARN86030---[主要]o.f.c.i.s.DefaultSqlScriptExecutor:数据库:未知表'test_db_flyway.tb_user'(SQL状态:42S02-错误代码:1051)2022-04-1307:56:56.309信息86030---[主要]o.f.c.i.s.DefaultSqlScriptExecutor:0行受影响2022-04-1307:56:56.309INFO86030---[main]o.f.c.i.s.DefaultSqlScriptExecutor:0行affected2022-04-1307:56:56.310WARN86030---[main]o.f.c.i.s.DefaultSqlScriptExecutor:DB:“utf8”当前是字符集的别名UTF8MB3,但在未来的版本中将成为UTF8MB4的别名。请考虑使用UTF8MB4以便明确。(SQL状态:HY000-错误代码:3719)2022-04-1307:56:56.310INFO86030---[main]o.f.c.i.s.DefaultSqlScriptExecutor:0行受影响2022-04-1307:56:56.317WARN86030---[main]o.f.c.i.s.DefaultSqlScriptExecutor:DB:不推荐使用整数显示宽度,并将在未来的版本中删除。(SQL状态:HY000-错误代码:1681)2022-04-1307:56:56.317WARN86030---[main]o.f.c.i.s.DefaultSqlScriptExecutor:DB:整数显示宽度已弃用,将在未来版本中删除。(SQL状态:HY000-错误代码:1681)2022-04-1307:56:56.317WARN86030---[main]o.f.c.i.s.DefaultSqlScriptExecutor:DB:'utf8'当前是字符集UTF8MB3的别名,但将未来版本中UTF8MB4的别名。请考虑使用UTF8MB4以便明确。(SQL状态:HY000-错误代码:3719)2022-04-1307:56:56.317INFO86030---[main]o.f.c.i.s.DefaultSqlScriptExecutor:0rowsaffected2022-04-1307:56:56.318INFO86030---[主要]o.f.c.i.s.DefaultSqlScriptExecutor:0行affected2022-04-1307:56:56.333INFO86030---[main]o.f.core.internal.command.DbMigrate:将架构`test_db_flyway`迁移到版本“1.1-InitData”2022-04-1307:56:56.334INFO86030---[main]o.f.c.i.s.DefaultSqlScriptExecutor:0行受影响2022-04-1307:56:56.335WARN86030---[main]o.f.c.i.s.DefaultSqlScriptExecutor:DB:“tb_user”的表存储引擎没有有此选项(SQL状态:HY000-错误代码:1031)2022-04-1307:56:56.335INFO86030---[main]o.f.c.i.s.DefaultSqlScriptExecutor:0rowsaffected2022-04-1307:56:56.335INFO86030---[main]o.f.c.i.s.DefaultSqlScriptExecutor:1rowsaffected2022-04-1307:56:56.336WARN86030---[main]o.f.c.i.s.DefaultSqlScriptExecutor:DB:'tb_user'的表存储引擎没有这个选项(SQL状态:HY000-错误代码:1031)2022-04-1307:56:56.337INFO86030---[main]o.f.c.i.s.DefaultSqlScriptExecutor:0行受影响2022-04-1307:56:56.337INFO86030---[main]o.f.c.i.s.DefaultSqlScriptExecutor:0行affected2022-04-1307:56:56.346INFO86030---[main]o.f.core.internal.command.DbMigrate:成功将2次迁移应用到模式“test_db_flyway”,现在版本为v1.1(执行时间00:00.058s)生成的flyway更新记录,test_db_flyway.flyway_schema_history有用户表结构和数据通过几个问题进一步了解,进一步了解MySQL的支持问题。从Flyway对MySQL的支持可以看出,官方期望获得大量MySQL使用的基数更多的付费用户。首先,如果你只是引入flyway-core:8.5.7的包时,会报如下错误Causedby:org.flywaydb.core.api.FlywayException:UnsupportedDatabase:MySQL8.0atorg.flywaydb.core.internal.database。DatabaseTypeRegister.getDatabaseTypeForConnection(DatabaseTypeRegister.java:106)~[flyway-core-8.5.7.jar:na]在org.flywaydb.core.internal.jdbc.JdbcConnectionFactory.(JdbcConnectionFactory.java:76)~[flyway-core-8.5.7.jar:na]在org.flywaydb.core.FlywayExecutor.execute(FlywayExecutor.java:147)~[flyway-core-8.5.7.jar:na]在org.flywaydb.core.Flyway.migrate(Flyway.java:124)~[flyway-core-8.5.7.jar:na]在org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:66)~[spring-boot-autoconfigure-2.5.3.jar:2.5.3]在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1845)~[spring-beans-5.3.9.jar:5.3.9]在组织弹簧framework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782)~[spring-beans-5.3.9.jar:5.3.9]...省略了18个常见框架,因为没有内置的Datebase类型可以发现应该导入的包是flyway-mysql:8.5.7,有意思的是这个包中包含的flyway-core版本是7.7.3。然后再看看官网对MySQL的支持情况。此操作需要5.7版本。企业版的使用就是充电,折腾....示例源码https://github.com/realpdai/t...更多内容告别碎片化学习,没有套路一站式系统化学习后端开发:Java全栈知识体系(https://pdai.tech)