Flyway支持percona pmm么

企业分布式微服务云SpringCloud SpringBoot mybatis (十五)Spring Boot中使用Flyway来管理数据库版本
时间: 12:24:38
&&&& 阅读:18
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&Flyway简介
Flyway是一个简单开源数据库版本控制器(约定大于配置),主要提供migrate、clean、info、validate、baseline、repair等命令。它支持SQL(PL/SQL、T-SQL)方式和Java方式,支持命令行客户端等,还提供一系列的插件支持(Maven、Gradle、SBT、ANT等)。
官方网站:
本文对于Flyway的自身功能不做过多的介绍,读者可以通过阅读官方文档或利用搜索引擎获得更多资料。下面我们具体说说在Spring Boot应用中的应用,如何使用Flyway来创建数据库以及结构不一致的检查。
动手试一试
下面我们可以通过对一文中的例子进行加工完成。读者也可以拿任何一个与数据访问相关的工程来做如下内容的实验:
第一步,在pom.xml中增加flyway的依赖:
&dependency&
&groupId&org.flywaydb&/groupId&
&artifactId&flyway-core&/artifactId&
&version&5.0.3&/version&
&/dependency&
第二步,按Flyway的规范创建版本化的SQL脚本。
在工程的src/main/resources目录下创建db目录
在db目录下创建版本化的SQL脚本V1__Base_version.sql
DROP TABLE IF EXISTS
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘主键‘,
`name` varchar(20) NOT NULL COMMENT ‘姓名‘,
`age` int(5) DEFAULT NULL COMMENT ‘年龄‘,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
第三步,在application.properties文件中配置Flyway要加载的SQL脚本位置。按第二步创建的结果配置如下:
flyway.locations=classpath:/db
第四步,执行单元测试ApplicationTests,此时我们在日志中可以看到如下信息:
INFO 82441 --- [main] o.f.core.internal.util.VersionPrinter
: Flyway Community Edition 5.0.3 by Boxfuse
INFO 82441 --- [main] o.f.c.internal.database.DatabaseFactory
: Database: jdbc:mysql://localhost:3306/test (MySQL 5.7)
INFO 82441 --- [main] o.f.core.internal.command.DbValidate
: Successfully validated 1 migration (execution time 00:00.022s)
INFO 82441 --- [main] o.f.c.i.s.JdbcTableSchemaHistory
: Creating Schema History table: `test`.`flyway_schema_history`
INFO 82441 --- [main] o.f.core.internal.command.DbMigrate
: Current version of schema `test`: && Empty Schema &&
INFO 82441 --- [main] o.f.core.internal.command.DbMigrate
: Migrating schema `test` to version 1 - Base version
WARN 82441 --- [main] o.f.core.internal.sqlscript.SqlScript
: DB: Unknown table ‘test.user‘ (SQL State: 42S02 - Error Code: 1051)
INFO 82441 --- [main] o.f.core.internal.command.DbMigrate
: Successfully applied 1 migration to schema `test` (execution time 00:00.128s)
Flyway监测到需要运行版本脚本来初始化数据库,因此执行了V1__Base_version.sql脚本,从而创建了user表,这才得以让一系列单元测试(对user表的CRUD操作)通过。
第五步,我们可以继续再执行一下单元测试,此时我们会发现日志输出与之前不同:
INFO 83150 --- [main] o.f.core.internal.util.VersionPrinter
: Flyway Community Edition 5.0.3 by Boxfuse
INFO 83150 --- [main] o.f.c.internal.database.DatabaseFactory
: Database: jdbc:mysql://localhost:3306/test (MySQL 5.7)
INFO 83150 --- [main] o.f.core.internal.command.DbValidate
: Successfully validated 1 migration (execution time 00:00.031s)
INFO 83150 --- [main] o.f.core.internal.command.DbMigrate
: Current version of schema `test`: 1
INFO 83150 --- [main] o.f.core.internal.command.DbMigrate
: Schema `test` is up to date. No migration necessary.
由于在第四步的时候,初始化脚本已经执行过,所以这次执行就没有再去执行V1__Base_version.sql脚本来重建user表。
第六步,我们可以尝试修改一下V1__Base_version.sql脚本中的name字段长度,然后在运行一下单元测试,此时我们可以得到如下错误:
ERROR 83791 --- [main] o.s.boot.SpringApplication
: Application startup failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘flywayInitializer‘ defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation o nested exception is org.flywaydb.core.api.FlywayException: Validate failed: Migration checksum mismatch for migration version 1
-& Applied to database :
-& Resolved locally
由于初始化脚本的改动,Flyway校验失败,认为当前的V1__Base_version.sql脚本与上一次执行的内容不同,提示报错并终止程序,以免造成更严重的数据结构破坏。
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:https://www.cnblogs.com/Abbie/p/8434344.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!Flyway是一个简单开源数据库版本控制器(约定大于配置),主要提供migrate、clean、info、validate、baseline、repair等命令。它支持SQL(PL/SQL、T-SQL)方式和Java方式,支持命令行客户端等,还提供一系列的插件支持(Maven、Gradle、SBT、ANT等)。
普通SQL:(包括占位符替换)没有专有的XML格式,没有锁定。
无限制:使用来进行一些高级数据操作
零依赖:只需运行在Java6(及以上)和数据库所需的JDBC驱动
约定优于配置:迁移时,自动查找系统文件和类路径中的SQL文件或Java类
高可靠性:在下进行数据库升级是安全可靠的
云支持:完全支持 , & App Engine、Heroku Postgres 和 Amazon RDS
自动迁移:,让应用启动和迁移同时工作
快速失败:损坏的数据库或失败的迁移可以防止应用程序启动
数据库清理:在一个数据库中,而不是删除数据库本身
支持的数据库
:10g及更新所有版本(包括 Amazon RDS)
:2008及更新版本(包括 Amazon RDS)
:最新版本
:5.1及更新版本(包括 Amazon RDS & Google Cloud SQL)
:10.0及更新版本(包括 Amazon RDS)
:4.2.2及更新版本
:9.0及更新版本(包括 Heroku & Amazon RDS)
:6.5及更新版本
:最新版本
:9.7及更新版本
:9.1及更新版本
:10.8.2.2及更新版本
:1.2.137及更新版本
:1.8及更新版本
:3.7.2及更新版本
:最新版本
:6.5及更新版本
:12.5及更新版本
最简单的场景是当你用Flyway迁移到一个空数据库时。
Flyway将会试图查找数据库中的元数据表(metadata table)。由于数据库是空的,Flyway 将不会查找,而是创建一个新元数据表。
现在数据库中将有一张名为SCHEMA_VERSION的表:
此表将用于跟踪数据库的状态。
之后,使用Flyway进行迁移时将扫描系统文件或者应用的类路径中特定的文件,它们可以由SQL或Java编写。
然后Flyway将基于他们的版本号进行排序并依次执行:
随着每次执行,对应地更新元数据表:
schema_version表
元数据表的创建和初始化,我们现在可以讨论迁移到一个新的版本。
Fly进行迁移时会重新扫描系统文件或者应用的类路径中特定的文件,并且与元数据表进行校验,如果它们的版本号低于或等于当前标记的版本,它们将被忽略。
而高于标记的文件将等待迁移:状态为可用(available),但是未执行 。
Flyway会将它们按照版本号进行排序并依次执行。
元数据表相应的更新:
schema_version表
就是如此简单!我们可以非常容易的创建一个高于当前标记版本的迁移文件,用来更新数据库,无论是表结构的变化或是数据的更新。下次Flyway开始迁移时,它会找到这个文件并相应更新数据库。
可以从获取最新的下载,包括:
Command-line Tool
Maven Plugin
Gradle Plugin
SBT Plugin
通过Maven添加Flyway依赖可使用下面脚本:
&dependency&
&groupId&org.flywaydb&/groupId&
&artifactId&flyway-core&/artifactId&
&version&4.0.3&/version&
&/dependency&
&dependency&&&&&&groupId&org.flywaydb&/groupId&&&&&&artifactId&flyway-core&/artifactId&&&&&&version&4.0.3&/version&&/dependency&
通过Gradle添加Flyway依赖:
dependencies {
compile 'com.google.guava:guava:18.0'
dependencies {&&&&compile 'com.google.guava:guava:18.0'}
了解Flyway
Flyway的两个重要概念
(Migration)
(Callback)
基于命令行的
:报告缺陷或者提交功能需求
资源整理者简介:
可能感兴趣的文章
看了这篇文章,感觉对flyway有了初步的认识,谢谢作者的分享
按分类快速查找
关于资源导航
伯乐在线资源导航收录优秀的工具资源。内容覆盖开发、设计、产品和管理等IT互联网行业相关的领域。目前已经收录 1440 项工具资源。
关于资源导航
伯乐在线资源导航收录优秀的工具资源。内容覆盖开发、设计、产品和管理等IT互联网行业相关的领域。
新浪微博:
推荐微信号
(加好友请注明来意)
- 好的话题、有启发的回复、值得信赖的圈子
- 分享和发现有价值的内容与观点
- 为IT单身男女服务的征婚传播平台
- 优秀的工具资源导航
- 翻译传播优秀的外文文章
- 国内外的精选博客文章
- UI,网页,交互和用户体验
- 专注iOS技术分享
- 专注Android技术分享
- JavaScript, HTML5, CSS
- 专注Java技术分享
- 专注Python技术分享
& 2018 伯乐在线他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)想到要管理数据库的版本,是在实际产品中遇到问题后想到的一种解决方案,当时各个环境的数据库乱作一团,没有任何一个人(开发、测试、维护人员)能够讲清楚当前环境下的数据库是哪个版本,与哪个版本的应用相匹配,如何升级到与新版本的应用相匹配。
想到管理数据库版本时,先是心底形成了一个初步的解决方案,大致是通过数据库中的某张表来记录数据库表结构的历次更新与对应版本,在每次数据库表结构调整时除了提供库表更新sql&,还必须提供更新记录与对应版本的sql,以帮助维护数据库版本信息,并在遇到问题时提供相关的排查依据。
后来据此思路在网络上搜索了一把,结果搜到Liquibase&(另一款开源数据库版本管理工具)。在学习了解Liquibase&的时候,经高手介绍又了解到了Flyway&这个项目的存在。经过一番了解,最后我们选择了Flyway&,主要原因是Flyway&支持sql&脚本,而Liquibase&只支持XML&方式的数据库表结构定义,虽然在新的版本中号称在XML的数据库表结构定义方式中支持了sql&脚本。
虽然Flyway&的中文文档近乎为零,英文文档也凤毛麟角,但它却是我们最理想的数据库版本管理工具,它不但支持sql&脚本,还支持Java&代码直接操作数据库(在版本升级时做数据迁移相当有用),有Maven&插件,支持命令行(我们的平台数据库有部分由C&语言项目管理),而且在Spring&框架的配合下,很容易就能实现应用启动时自动检查并升级数据库的功能。
2.&&什么是Flyway
Flyway&是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。
Flyway&的项目主页是&)(最近才迁移到这个主页,之前一直在googlecode&下管理),在项目的主页上可以看到Flyway&与几款主流数据库版本管理工具的特性对比列表。
3.&&为什么使用Flyway
3.1.&我们遇到的问题
我们遇到的问题(以下内容来自Flyway&的一些英文文档,从中抽取出来的我们也遇到的一些主要问题):
不同的开发人员在开发产品特性时,都有可能更新数据库(添加新表,新的约束等)。当开发人员完成工作并提交代码时,代码会被合并到主分支并在测试服务器上执行单元测试与集成测试。我们在哪个环节来执行数据库的更新操作呢?由QA&部门手工执行sql&脚本?或者我们开发一断程序自动执行数据库更新?以什么顺序来执行这些更新脚本?这些问题同样存在于生产环境。&
我们的产品部署在不同的客户服务器上,以及很多的测试、联调、实验局、销售环境上。不同的客户和测试环境上都部署着不同版本的产品。当他们需要升级他们的产品到新的版本时,我们不仅需要让他们的管理员可以升级产品到新的版本,同时需要保留他们的已有数据。在升级产品的步骤中,我们清楚地知道客户数据库的当前版本,以及需要在该数据库上执行哪些数据库更新脚本,来更新数据库表结构与数据库中已存在的数据。当升级完成时,数据库表结构及数据应当与升级后的产品版本保持一致。
有的时候,我们需要通过代码(Java&)来维护一些已存在的数据,如通过代码来维护blob&类型的用户头像数据。
当升级失败时(比如在升级过程中出现网络连接失败),我们应当支持对失败进行修复。
3.2.&Flyway&的特性
自动升级(自动发现更新项):Flyway&会将任意版本的数据库升级到最新版本。Flyway&可以脱离JVM&环境通过命令行执行,可以通过Ant&脚本执行,通过Maven&脚本执行(这样就可以在集成环境自动执行),并且可以在应用中执行(比如在应用启动时执行)。
规约优于配置:Flyway&有一套默认的规约,所以不需要修改任何配置就可以正常使用。
既支持SQL&脚本,又支持Java&代码:可以使用SQL&脚本执行数据库更新,也可以使用Java&代码来进行一些高级数据升级操作。
高可靠性:在集群环境下进行数据库升级是安全可靠的。
支持清除已存在的库表结构:Flyway&可以清除已存在的库表结构,可以从零开始搭建您的库表结构,并管理您的数据库版本升级工作。
支持失败修复。新的2.0&版本提供了repair&功能,用于解决数据库更新操作失败问题。
结合我们遇到的问题,与Flyway&所提供的特性,我们认为Flyway&是比较适合于我们的一款数据库版本管理工具。
4.&&如何使用Flyway
使用Flyway&,我们需要准备Flyway&将要执行的数据库脚本(Flyway&支持sql&脚本与java&代码,这里认为在Flyway下执行数据库更新操作的java&代码也是一种数据库脚本),然后通过Flyway&提供的几种不同运行方式来执行这些脚本。(以下配置参数说明基于Flyway 1.7&版本,新的2.0&版本在配置参数上有不少变动,与下面的介绍会有不少出入,以下说明仅供参考)
4.1.&数据库脚本
Flyway&的主要任务是管理数据库的版本更新,在Flyway&中称每次数据库更新为一个migration&,为了更顺口,我们下面称之为数据库脚本。Flyway&支持SQL-based migrations&和Java-based migrations&。
Flyway&支持的数据库脚本有sql&脚本与java&代码,sql&脚本即普通的sql&脚本,包含创建数据库、表,更新库表结构,数据插入、更新、删除等sql&语句,java&代码则是通过一个有效的数据源,使用java&语言来进行数据库的操作,这里针对的读者是对数据库操作有一定熟悉程度的群体,不再详细讲解如何编写数据库脚本。
Flyway&的sql&脚本与java&代码都遵循以下默认规约:
4.1.1.&&Flyway&默认规约
SQL&脚本文件默认位置是项目的源文件夹下的db/migration&&目录。
Java&代码默认位于db.migration&&包。
SQL&脚本文件及Java&代码类名必须遵循以下命名规则:V&version&[_&SEQ&][__description]&。版本号的数字间以小数点(.&)或下划线(_&)分隔开,版本号与描述间以连续的两个下划线(__&)分隔开。如V1_1_0__Update.sql&。Java&类名规约不允许存在小数点,所以Java&类名中版本号的数字间只能以下划线进行分隔。
4.2.&Flyway&的几种运行方式
本章主要讲解我们常用的三种Flyway&的执行方式,Flyway&除了提供这三种执行方式外,还提供Ant&任务方式的执行方式,有兴趣的同学可以去官方网站获取相关信息,这里不进行描述。
4.2.1.&&命令行方式
通过命令行方式运行Flyway&,需要下载flyway-commandline&版本并解压到本地,然后flyway&(Windows&下flyway.cmd&,Linux&下flyway.sh&)命令执行Flyway&相关操作。
下图是flyway-commandline-1.7&解压后的目录结构:
命令行方式的特点与规约
无需安装JVM&,Maven&,Ant
默认读取conf/flyway.properties&中的配置信息,如果在命令行中指定参数,命令行中指定的参数将覆盖配置文件中的配置
还可以通过参数-configFlie=myFlyway.properties&来重新指定flyway&配置文件,可以通过-configFileEncoding=GBK&来指定配置文件的编码格式
可以将打包好的java&迁移文件放到jars/&&目录下让flyway&可以找到并运行
数据库驱动包(jar&)放到jars/&&目录下
sql&脚本文件放到sql/&&目录中
命令行方式运行的配置及使用方法
修改conf/flyway.properties&&配置文件
拷贝数据库jdbc&&驱动jar&&到jars/&&目录
在sql/&&目录下创建配置好的sql&&脚本文件目录路径,如flyway&默认的sql&&文件路径为db/migration&,我们就需要在sql/&&目录下创建/db/migration&&目录结构
将数据库维护脚本放到创建好的sql&&脚本文件目录中(维护脚本文件名需要遵循命名规范)
在命令行执行命令(从flyway&安装目录开始执行)flyway init&(初始化Flyway metadata&)、flyway migrate(执行Flyway&升级操作)、flyway validate&(校验Flyway&数据正确性)
4.2.2.&&Maven&插件
配置Maven&插件
&plugin&&&
&&&&&&&&groupId&com.googlecode.flyway&/groupId&&&
&&&&&&&&artifactId&flyway-maven-plugin&/artifactId&&&
&&&&&&&&version&1.7&/version&&&
&&&&&&&&dependencies&&&
&&&&&&&&&&&&&&&dependency&&&
&&&&&&&&&&&&&&&&&&&&&&groupId&mysql&/groupId&&&
&&&&&&&&&&&&&&&&&&&&&&artifactId&mysql-connector-java&/artifactId&&&
&&&&&&&&&&&&&&&&&&&&&&version&${mysql.connector.version}&/version&&&
&&&&&&&&&&&&&&&/dependency&&&
&&&&&&&&/dependencies&&&
&&&&&&&&configuration&&&
&&&&&&&&&&&&&&&driver&com.mysql.jdbc.Driver&/driver&&&
&&&&&&&&&&&&&&&url&jdbc:mysql://localhost/flywaydemo?useUnicode=true&characterEncoding=utf-8&/url&&&
&&&&&&&&&&&&&&&user&root&/user&&&
&&&&&&&&&&&&&&&password&&/password&&&
&&&&&&&&&&&&&&&!--&设置接受flyway进行版本管理的数据库,多个数据库以逗号分隔&--&&&
&&&&&&&&&&&&&&&schemas&flywaydemo&/schemas&&&
&&&&&&&&&&&&&&&!--&设置存放flyway&metadata数据的表名&--&&&
&&&&&&&&&&&&&&&table&schema_version&/table&&&
&&&&&&&&&&&&&&&!--&设置flyway扫描sql升级脚本、java升级脚本的目录路径或包路径&--&&&
&&&&&&&&&&&&&&&locations&&&
&&&&&&&&&&&&&&&&&&&&&&location&flyway/migrations&/location&&&
&&&&&&&&&&&&&&&&&&&&&&location&com.kedacom.flywaydemo.migrations&/location&&&
&&&&&&&&&&&&&&&/locations&&&
&&&&&&&&&&&&&&&!--&设置sql脚本文件的编码&--&&&
&&&&&&&&&&&&&&&encoding&UTF-8&/encoding&&&
&&&&&&&&&&&&&&&!--&设置执行migrate操作之前的validation行为&--&&&
&&&&&&&&&&&&&&&validationMode&ALL&/validationMode&&&
&&&&&&&&&&&&&&&!--&设置当validation失败时的系统行为&--&&&
&&&&&&&&&&&&&&&validationErrorMode&FAIL&/validationErrorMode&&&
&&&&&&&&/configuration&&&
&/plugin&&&
上面的插件配置包含了几方面的配置信息:
声明数据库驱动的依赖包
Flyway&配置——数据库连接配置
Flyway&配置——Flyway&参数与行为配置
执行Maven&命令进行Flyway&操作(下面列出几种常用的操作)
mvn flyway:init&(初始化Flyway metadata&)
mvn flyway:migrate&(执行Flyway&升级操作)
mvn flyway:validate&(校验Flyway&数据正确性)
4.2.3.&&在应用启动时自动运行(结合Spring&)
定义在应用启动时自动运行Flyway&的Java&类,并实现其逻辑代码
Java代码&&
public&class&FlywayMigration&{&&
&&&&private&DataSource&dataS&&
&&&&public&void&setDataSource(DataSource&dataSource)&{&&
&&&&&&&&this.dataSource&=&dataS&&
&&&&public&void&migrate()&{&&
&&&&&&&&Flyway&flyway&=&new&Flyway();&&
&&&&&&&&flyway.setDataSource(dataSource);&&
&&&&&&&&flyway.setSchemas("flywaydemo");&//&设置接受flyway进行版本管理的多个数据库&&
&&&&&&&&flyway.setTable("schema_version");&//&设置存放flyway&metadata数据的表名&&
&&&&&&&&flyway.setLocations("flyway/migrations",&"com.kedacom.flywaydemo.migrations");&//&设置flyway扫描sql升级脚本、java升级脚本的目录路径或包路径&&
&&&&&&&&flyway.setEncoding("UTF-8");&//&设置sql脚本文件的编码&&
&&&&&&&&flyway.setValidationMode(ValidationMode.ALL);&//&设置执行migrate操作之前的validation行为&&
&&&&&&&&flyway.setValidationErrorMode(ValidationErrorMode.FAIL);&//&设置当validation失败时的系统行为&&
&&&&&&&&flyway.migrate();&&
在Spring&中根据上面实现的类来定义(实例化)一个bean
&bean&id="flywayMigration"&class="com.kedacom.flywaydemo.FlywayMigration"&init-method="migrate"&&&
&&&&&property&name="dataSource"&ref="dataSource"&/&&&
从上面的bean&定义中我们可以看到,我们为flywayMigration&这个bean&实例注入了一个数据源,Flyway&的所有操作将针对这个数据源进行;同时我们通过init-method&属性指定了Spring&在实例化该bean&以后,主动执行该bean的migrate&方法,而该方法内会执行Flyway&更新数据库的操作。
至此,我们达到了在应用启动时,Spring&实例化上下文的时候,在Spring&实例化flywayMigration&这个bean&的时候,自动执行Flyway&更新数据库的操作。
但是,我们还没有达到目的,万一Flyway&还在更新数据库,没有完成更新操作之前,应用程序的其他逻辑已经开始使用数据库进行其他操作了,会导致应用程序产生很多bug&,甚至根本运行不起来。
要解决这个问题,我们可以利用Spring&的bean&依赖原理,让关键的数据库操作bean&依赖于flywayMigration&这个bean&,达到在flywayMigration&没有实例化完成(数据库更新操作完成)之前,不能进行任何其他数据库相关操作。
利用Spring&的bean&依赖让flywayMigration&优先处理数据库更新操作
&bean&id="jdbcTemplate"&class="org.springframework.jdbc.core.JdbcTemplate"&depends-on="flywayMigration"&&&
&&&&&property&name="dataSource"&ref="dataSource"&/&&&
&bean&id="txManager"&class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&depends-on="flywayMigration"&&&
&&&&&property&name="dataSource"&ref="dataSource"&/&&&
本篇我们介绍了什么是Flyway&,为什么使用Flyway&,以及如何使用Flyway&,但实际产品/&项目中的情况可能更复杂,仅靠对Flyway&技术使用上的了解并不能达到我们满意的解决方案,为此我将在下一篇中介绍我们结合项目实际的问题形成的一些基于Flyway&的数据库版本管理解决方案。下一篇的内容主要包括:
我们的项目中实际是如何使用&Flyway&的
如何在已有的项目中集成&Flyway
如何在多应用、跨平台、跨语言的环境中使用&Flyway
阅读(...) 评论()鍗氬?鍒嗙被锛

我要回帖

更多关于 percona xtrabackup 的文章

 

随机推荐