数据库变更管理工具 flyway

Flyway的工作模式 Flyway可以对数据库进行升级,从任意一个版本升级到最新的版本。但是升级的依据是用户自己编写的sql脚本,用户自己决定每一个版本的升级内容。 Flyway不限定脚本里面的内容,但是对脚本文件的名称有一定的要求: V1__Initial_Setup.sql V2__First_Changes.sql V2.1__Refactoring 其中的文件名由以下部分组成,除了使用默认配置外,某些部分还可自定义规则: prefix: 可配置,前缀标识,默认值V表示Versioned,R表示Repeatable version: 标识版本号,由一个或多个数字构成,数字之间的分隔符可用点.或下划线_; 不允许多个脚本文件有相同的版本号。 separator: 可配置,用于分隔版本标识与描述信息,默认为两个下划线__ description: 描述信息,文字之间可以用下划线或空格分隔 suffix: 可配置,后续标识,默认为.sql 使用Flyway升级,flyway会自动创建一张历史记录表: flyway_schema_history。 这张表记录了每一次升级的记录,包括已经执行了哪些脚本,脚本的文件名,内容校验和,执行的时间和结果: flyway在升级数据库的时候,会检查已经执行过的版本对应的脚本是否发生变化,包括脚本文件名,以及脚本内容。 如果flyway检测到发生了变化,则抛出错误,并终止升级。 如果已经执行过的脚本没有发生变化,flyway会跳过这些脚本,依次执行后续版本的脚本,并在记录表中插入对应的升级记录。 所以,flyway总是幂等的,而且可以支持跨版本的升级。 如果你好奇,flyway如何检查脚本文件的内容是否有修改。 你可以注意以下记录表中有一个字段checksum,它记录了脚本文件的校验和。flyway通过比对文件的校验和来检测文件的内容是否变更。 使用上面的方式,升级一个空的数据库,或者在一直使用flyway升级方案的数据库上进行升级,都不会又问题。 但是,如果在已有的数据库引入flyway,就需要一些额外的工作。 flyway检测数据库中是否有历史记录表,没有则代表是第一次升级。此时,flyway要求数据库是空的,并拒绝对数据库进行升级。 你可以设置baseline-on-migrate参数为true,flyway会自动将当前的数据库记录为V1版本,然后执行升级脚本。 这也表示用户所准备的脚本中,V1版本的脚本会被跳过,只有V1之后的版本才会被执行。 h2 控制台 maven clean package java -cp target/demo-0.0.1-SNAPSHOT/WEB-INF/lib/h2*.jar org.h2.tools.Server # 看到图形界面后 http://127.0.1.1:8082 改变jdbc url 为 jdbc:h2:file:/home/ming/learn/https_demo/h2data # 用户名 sa, 秘密为空 命令 所有的命令,以如下的格式执行: mvn flyway:{flyway-command} migrate mvn flyway:migrate 这个命令会搜索默认的脚本目录,检测并根据结果选择执行升级脚本。 clean mvn flyway:clean 这个命令会清除指定schema下所有的对象,包括table、view、triggers…,让schema变成空的状态。 info mvn flyway:info 这个命令显示指定schema的升级状态,当前的数据库的版本信息。...

October 18, 2020 · 2 分钟 · ming