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

SpringBoot数据库管理-使用Liquibase进行数据库管理和迁移?

时间:2023-04-01 20:12:41 Java

Liquibase是一个用于跟踪、管理和应用数据库更改的开源工具。它以日志文件(changelog)的形式记录数据库的变化(changeset),然后执行日志文件中的修改来更新或恢复数据库。回滚到一致的状态。它的目标是提供一种独立于数据库类型的解决方案,通过执行模式类型的文件来实现迁移。本文主要介绍SpringBoot与Liquibase的集成。@pdaiSpringBoot数据库管理-使用Liquibase进行数据库管理和迁移?知识准备什么是Liquibase?这些工具试图解决什么问题?Liquibase的概念是什么?它是如何工作的?简单示例POM依赖于yml配置新的changelog测试以进一步了解更好的changelog实践?除了addColumn,addTable还有哪些changeType?实例源码知识准备需要了解Liquibase是什么,它出现是为了解决什么问题。什么是Liquibase?这些工具试图解决什么问题?Liquibase是一个用于跟踪、管理和应用数据库更改的开源工具。它以日志文件(changelog)的形式记录数据库的变化(changeset),然后执行日志文件中的修改来更新或回滚数据库。)到一个一致的状态。它的目标是提供一种独立于数据库类型的解决方案,通过执行模式类型的文件来实现迁移。其主要优势有:支持几乎所有的主流数据库,目前支持包括Oracle/SqlServer/DB2/MySql/Sybase/PostgreSQL在内的各种数据库,可以帮助应用系统在数据库部署和升级时支持多数据库;支持版本控制,支持多开发者协同维护;日志文件支持多种格式,如XML、YAML、JSON、SQL等;提供变更应用的回滚功能,可以按时间、数量或标签回滚已应用的变更。通过这种方式,开发者可以方便的恢复数据库任意时间点的状态,支持命令行、Spring集成、Maven插件、Gradle插件等多种运行方式。为什么会出现Liquibase这样的工具?在实际线上应用中,随着版本的迭代,经常需要更改数据库表和字段,需要对这些更改进行记录和管理,以及回滚等;同时,只有通过脚本化和版本化管理,数据库才能实现真正的DevOps(自动化执行+回滚等)。在这样的场景下,Liquibase等工具的出现就成了必然。Liquibase的概念是什么?它是如何工作的?工作流程:记录SQL变更到changeset,多个changeset变更形成一个日志文件(changelog),liquibase将changelog更新日志文件同步到指定的RDBMS。日志文件(databaseChangeLog)支持多种格式,如XML、YAML、JSON、SQL;下面以xml为例看相关配置示例更改日志这里简单的例子主要介绍基于SpringBoot集成liquibase管理数据库变更POM依赖Maven包依赖,主要包括mysql驱动、JDBC(这里spring-boot-starter-data-jpa包含jdbc包,当然也可以直接导入jdbc包)和liquibase包。mysqlmysql-connector-java8.0.28com.github.wenhaojpa-spec<版本>3.1.0org.springframework.bootspring-boot-starter-data-jpaorg.liquibaseliquibase-core4.9.1yml配置SpringBootAutoConfig默认已经包含了对liquibase的配置,在spring.liquibase配置下。基本配置可以直接使用如下(主要是指定change-log的位置,默认位置是classpath:/db/changelog/db.changelog-master.yaml):spring:datasource:url:jdbc:mysql://localhost:3306/test_db_liquibase?useSSL=false&autoReconnect=true&characterEncoding=utf8driver-class-name:com.mysql.cj.jdbc.Driverusername:rootpassword:bfXa4Pt2lUUScy8jakXfliquibase:enabled:true#以下配置由spring赋值。数据源,所以你不能配置#url:jdbc:mysql://localhost:3306/test_db_liquibase?useSSL=false&autoReconnect=true&characterEncoding=utf8#user:root#password:bfXa4Pt2lUUScy8jakXfchange-log:classpath:/db/changelog/db.changelog-master.yaml正在开发的时候,更多的配置可以在下面的SpringBootAutoConfig中找到。加上changelogXML的方法就可以了,但是还是推荐使用yml格式。databaseChangeLog:-changeSet:id:20220412-01author:pdaichanges:-createTable:tableName:personcolumns:-column:name:idtype:intautoIncrement:trueconstraints:primaryKey:truenullable:false-column:name:firstname类型:varchar(50)-列:名称:姓氏类型:varchar(50)约束:可为空:false-列:名称:状态类型:char(2)-changeSet:id:20220412-02作者:pdai更改:-addColumn:表名:人员列:-列:名称:用户名类型:varchar(8)-更改集:id:20220412-03author:pdaichanges:-addLookupTable:existingTableName:personexistingColumnName:statenewTableName:statenewColumnName:idnewColumnDataType:char(2)测试启动springBootApplication,可以看到下面的changeSet是按顺序执行的2022-04-1220:41:20.591INFO8476---[main]liquibase.lockservice:成功获取更改日志lock2022-04-1220:41:20.737INFO8476---[main]liquibase.changelog:创建名称为:test_db_liquibase2ANGELOG20BASECH2-04的数据库历史表-1220:41:20.783INFO8476---[main]liquibase.changelog:从test_db_liquibase.DATABASECHANGELOGRunningChangeset读取:classpath:/db/changelog/db.changelog-master.yaml::20220412-01::pdai2022-04-1220:41:20.914INFO8476---[main]liquibase.changelog:表人创建2022-04-1220:41:20.914INFO8476---[main]liquibase.changelog:ChangeSetclasspath:/db/changelog/db.changelog-master.yaml::20220412-01::pdai在53msRunningChangeset中成功运行:classpath:/db/changelog/db.changelog-master.yaml::20220412-02::pdai2022-04-1220:41:20.952INFO8476---[main]liquibase.changelog:列用户名(varchar(8))添加到person2022-04-1220:41:20.952INFO8476---[main]liquibase.changelog:ChangeSet类路径:/db/changelog/db.changelog-master.yaml::20220412-02::pdai在31msRunningChangeset中成功运行:classpath:/db/changelog/db.changelog-master.yaml::20220412-03::pdai2022-04-1220:41:21.351INFO8476---[main]liquibase.changelog:为person.state2022添加了查找表-04-1220:41:21.351INFO8476---[main]liquibase.changelog:ChangeSetclasspath:/db/changelog/db.changelog-master.yaml::20220412-03::pdai在389ms2022-04-1220:41:21.382INFO8476---[main]liquibase.lockservice中成功运行:成功发布更改查看带日志锁的数据库,会发现数据变了。如果我们重启SpringBootApplication会发生什么?显然,因为databasechangelog表中已经有相关执行记录,所以不再执行change2022-04-1220:49:01.566INFO9144---[main]liquibase.lockservice:Successfullyacquiredchangeloglock2022-04-1220:49:01.761INFO9144---[main]liquibase.changelog:Readingfromtest_db_liquibase.DATABASECHANGELOG2022-04-1220:49:01.812INFO9144---[main]liquibase.lockservice:成功释放锁服务进一步了解通过几个问题进一步了解更好的变更日志实践?简单来说:yml格式+sql-file方式执行sqlFile格式的changeSet,下面执行日志如下2022-04-1221:00:28.198INFO17540---[main]liquibase.lockservice:Successfully获取更改日志lock2022-04-1221:00:28.398INFO17540---[main]liquibase.changelog:从test_db_liquibase.DATABASECHANGELOGRunningChangeset读取:classpath:/db/changelog/db.changelog-master.yaml::20220412-04::pdai2022-04-1221:00:28.516INFO17540---[main]liquibase.changelog:文件类路径中的SQL:/db/changelog/db.changelog-20220412-04.sqlexecuted2022-04-1221:00:28.516INFO17540---[main]liquibase.changelog:ChangeSet类路径:/db/changelog/db.changelog-master.yaml::20220412-04::pdai在83ms2022-04-1221:00成功运行:28.532INFO17540--[main]liquibase.lockservice:成功释放更改日志锁执行行后查看变更记录数据表。用户表已创建并插入了一条数据。除了addColumn和addTable,还有哪些changeType?除了addColumn,addTable还有哪些changeType?同时还支持以下changeTypes:此外,还支持commandchangeSet的执行:id:executeCommand-exampleauthor:liquibase-docschanges:-executeCommand:args:-arg:value:-out-arg:value:-param2executable:mysqldumpos:Windows7timeout:10s例如回滚操作可以通过下面的命令进行例如我们可以使用Liquibase生成相关差异,然后做成一个changeSet,最后部署示例源码https://github.com/realpdai/t...参考文章https://docs.liquibase.com