使用Flyway来管理数据库版本

Flyway是什么

Flyway是一款数据库迁移(migration)工具。
它可以帮助我们在不同环境保持数据库的同步,减少手工操作,避免数据导入的顺序错误,同时也减少了遗漏的机会。
flyway可以集成在项目中,可以与Spring 框结合。在项目发版时,自动执行数据库脚本,无需人为执行数据库同步操作。

就目前而言,
<font color="#4590a3" size="4px">我们部署应用的流程大概是这样的:</font>

开发人员将应用程序打包、按顺序汇总并整理数据库升级脚本DBA拿到数据库升级脚本检查、备份、执行,以完成数据库升级应部署人员拿到应用部署包,备份、替换,以完成应用程序升级
<font color="#4590a3" size="4px">引入Flyway之后的应用部署流程大概是这样的:</font>

开发人员将应用程序打包应部署人员拿到应用部署包,备份、替换,以完成应用程序升(Flyway将自动执行升级/备份脚本)

Flyway的介绍

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

2、支持的数据库类型:
Oracle, SQL Server, SQL Azure, DB2, DB2 z/OS, MySQL (including Amazon RDS), MariaDB, Google Cloud SQL, PostgreSQL (including Amazon RDS and Heroku), Redshift, Vertica, H2, Hsql, Derby, SQLite, SAP HANA, solidDB, Sybase ASE and Phoenix。

3、sql脚本的命名规范:
V+版本号(版本号的数字间以".“或”_"分隔开)+双下划线(用来分隔版本号和描述)+文件描述+后缀名,例如:V2017.9.30__Update.sql。

4、Flyway读取sql脚本的默认位置:
项目的源文件夹下的db/migration目录。

5、指令:
一共就6个基本指令:migrate、clean、info、validate、baseline、repair。

Flyway的命令

<font color="#4590a3" size="4px">Migrate:</font>
<font color="#4590a3" size="3px">manven命令 mvn flyway:migrate</font>
将数据库迁移到最新版本。当数据如果不存在,Flyway 将自动创建示模式历史表。

20210706164823

Migrate是flyway工作流程的核心。它将扫描文件系统或您的类路径以获取可用的迁移。它将它们与应用于数据库的迁移进行比较。如果发现任何差异,它将迁移数据库以缩小差距。

Migrate最好在应用程序启动时执行,以避免数据库与代码期望之间的任何不兼容性。
示例 1: 我们有Migrate可用到版本 9, 数据库在版本 5 。Migrate将按顺序应用迁移 6、7、8 和 9。

示例 2: 我们有Migrate可用到版本 9,数据库位于第 9 版。迁移不起任何作用。
<font color="#4590a3" size="4px">Clean:</font>

manven命令 mvn flyway:clean

20210706165256

Clean可以很好的帮助开发和测试。 它将有效地给你一个全新的开始,通过Clean来清除你的数据库。 所有对象(表、视图、过程…)将会删除。

不用说: 不要对生产数据库使用!
<font color="#4590a3" size="4px">Info:</font>

manven命令 mvn flyway:info

20210706165611

打印有关所有Migrate的详细信息和状态信息。
Info让你知道你的立场。一目了然,您就会看到哪些Migrate已经应用,哪些其他Migrate仍在等待执行中,何时执行,以及它们是否成功。
<font color="#4590a3" size="4px">Validate:</font>

manven命令 mvn flyway:validate

20210706165928

用于校验,范围包括已升级的脚本是否改名,已执行的版本内容是否修改。所有针对已执行的版本进行的改动都会导致校验失败。

执行migrate会自动进行校验,如果失败将不会做任何的migrate。

flyway希望用户提供的脚本是稳定的,以免造成额外的复杂性和混乱。
<font color="#4590a3" size="4px">Undo:</font>

manven命令 mvn flyway:undo

20210706170104

撤消最近应用的版本迁移。

<font color="#4590a3" size="4px">Baseline:</font>

manven命令 mvn flyway:baseline

20210706170641

对现有数据库进行基准测试,如果不存在flyway_schema_history文件,则会直接创建,并以当前状态为版本1
<font color="#4590a3" size="4px">Repair:</font>

manven命令 mvn flyway:repair

20210706170938

修复Flyway模式历史记录表。这将执行以下操作:

在没有DDL事务的数据库上删除所有失败的迁移(留下的用户对象仍必须手动清理)
将可用迁移的校验和,描述和类型与可用迁移重新对齐

结合spring使用

<font color="#4590a3" size="4px">pom.xml引入</font>

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

<font color="#4590a3" size="4px">参数配置</font>

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.

<font color="#4590a3" size="4px">plugins配置</font>

            <plugin>
                <groupId>org.flywaydb</groupId>
                <artifactId>flyway-maven-plugin</artifactId>
                <configuration>
                    <url>url</url>
                    <user>账号</user>
                    <password>密码</password>
                    <driver>com.mysql.cj.jdbc.Driver</driver>
                    <locations>
                        <location>地址</location>
                    </locations>
                </configuration>
            </plugin>

<font color="#4590a3" size="4px">idea</font>

20210706174048

参考文章:

https://flywaydb.org/documentation/

福禄ICH·突击队
福小雄
2021年7月

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容