likes
comments
collection
share

数据库版本控制--flyway工具

作者站长头像
站长
· 阅读数 6

在公司开发的时候会有很多人负责同一个服务,由于组内人员沟通不多,导致开发库和生产测试库内表的字段有差异或者不同,有些人删了字段或者新增了字段忘记告诉他人或者忘了上生产,这是很严重的问题,而flyway工具可以像Git管理不同人的代码那样,管理不同人的sql脚本,从而做到数据库同步。

正文

falway的作用

1、用一种简单、干净的方案,帮助用户完成数据库迁移的工作。使用Flyway,用户可以从任意一个数据库版本迁移到最新版本,简单而且有效。 2、避免直接操作数据库,在项目中写好相应的sql,falway会自动执行。

Flyway的工作模式

Flyway不限定脚本里面的内容,但是对脚本文件的名称有一定的要求,如下图:

数据库版本控制--flyway工具 版本号可以使用小版本,如V1.1。

具体要求:

版本号和版本描述之间,使用两个下划线分隔。 版本描述之间,使用一个下划线分隔单词。 版本号唯一:不允许多个脚本文件有相同的版本号。

首次使用falway升级的时候,会在数据库新增一个表,名为:flyway_schema_history,如下图:

数据库版本控制--flyway工具 这张表记录了每一次升级的记录,包括已经执行了哪些脚本,脚本的文件名,内容校验和,执行的时间和结果。

使用Flyway的注意事项

flyway在升级数据库的时候,会检查已经执行过的版本对应的脚本是否发生变化,包括脚本文件名,以及脚本内容。如果flyway检测到发生了变化,则抛出错误,并终止升级,比如第一个人新增了一个字段,并且项目启动,falway执行了,而后一个人在前面这个人写的脚本上面有所改动,这样就会抛出错误,具体的看下面的演示。

如果已经执行过的脚本没有发生变化,flyway会跳过这些脚本,依次执行后续版本的脚本,并在记录表中插入对应的升级记录。

所以,flyway总是幂等的,而且可以支持跨版本的升级。

springboot项目使用Flyway

1、添加依赖

<!-- 数据库版本管理 -->
<dependency>
	<groupId>org.flywaydb</groupId>
	<artifactId>flyway-core</artifactId>
	<version>5.2.4</version>
</dependency>

2、配置文件新增配置信息

# 数据库版本控制
spring:
  flyway:
    # 启用或禁用 flyway
    enabled: true
    # 字符编码
    encoding: utf-8
    # 对执行迁移时基准版本的描述
    baseline-description: test
    # 若连接的数据库非空库,是否初始化
    # 当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
    baseline-on-migrate: true
    # 指定 baseline 的版本号,缺省值为 1, 低于该版本号的 SQL 文件, migrate 的时候被忽略
    # 开始执行基准迁移时对现有的schema的版本打标签,默认值为1.
    baseline-version: 0
    # 是否开启校验
    # 迁移时是否校验,默认为 true
    validate-on-migrate: true
    # 默认脚本加载路径:/db/migration
    # locations: ["classpath:/db/migration"]
    # flyway 的 clean 命令会删除指定 schema 下的所有 table,默认 false
    clean-disabled: false
    # 发环境最好开启 outOfOrder, 生产环境关闭 outOfOrder
    # 是否允许无序的迁移,默认 false
    out-of-order: false
    # 检查迁移脚本的位置是否存在,默认false
    check-location: false
    # 当读取元数据表时是否忽略错误的迁移,默认false
    ignore-future-migrations: false
    # 当初始化好连接时要执行的SQL
    init-sqls: show tables;
    # 迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源
    #url:
    # 迁移数据库的用户名
    #user:
    # 目标数据库的密码
    #password:
    # 设置每个placeholder的前缀,默认${
    #placeholder-prefix:
    # 是否要被替换,默认true
    #placeholder-replacement:
    # 设置每个placeholder的后缀,默认}
    #placeholder-suffix:
    # 设置placeholder的value
    #placeholders.[placeholder name]
    # 设定需要flywary迁移的schema,大小写敏感,默认为连接默认的schema
    #schemas: flyway
    # 迁移文件的前缀,默认为V
    #sql-migration-prefix:
    # 迁移脚本的文件名分隔符,默认__
    #sql-migration-separator:
    # 迁移脚本的后缀,默认为.sql
    #sql-migration-suffix:
    # 使用的元数据表名,默认为schema_version
    #table: flyway_schema_history
    # 迁移时使用的目标版本,默认为latest version
    #target:

具体需要的配置看个人情况,需要用到哪些配置哪些就好

3、新建flyway脚本

这里要注意,flyway脚本默认放在classpath:/db/migration目录下面,如果想换位置,可以自定义一个位置,看上面的配置信息,里面spring.flyway.locations即为脚本存放的位置。

在db.migration包下新建V1__initialization_table.sql文件,命名一定要按flyway的规定来,要不然是无法识别的。

数据库版本控制--flyway工具

sql内的内容如下:

-- 非唯一索引必须按照“idx_字段名称_字段名称[_字段名]”进行命名
-- 唯一索引必须按照“uniq_字段名称_字段名称[_字段名]”进行命名

DROP TABLE IF EXISTS user_info;
CREATE TABLE `user_info` (
  `id` bigint(20) unsigned zerofill NOT NULL AUTO_INCREMENT COMMENT '自增ID',
	`user_id_number` varchar(64) NOT NULL COMMENT '身份证号',
  `user_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '姓名',
  `user_age` int(4) DEFAULT '1' COMMENT '年龄',
  `user_color` int(6) NOT NULL COMMENT '颜色',
  `user_gender` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '性别',
  `into_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  `into_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `upd_user` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  `upd_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `status` int(2) DEFAULT '1' COMMENT '软删除状态:默认:1 (-1:已删除  1:正常)',
  `version` int(2) DEFAULT '1' COMMENT '版本号',
  `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_user_id_number` (`user_id_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户信息表';

数据库版本控制--flyway工具

4、新增数据库信息配置

# falwayTest为数据库名
spring:
  datasource:
    url: jdbc:mysql://数据库地址:端口/falwayTest?useSSL=false&allowMultiQueries=true
    username: 用户名
    password: 密码
    driver-class-name: com.mysql.cj.jdbc.Driver

5、启动项目,会看到如下图所示:

数据库版本控制--flyway工具

6、去数据库查看:

数据库版本控制--flyway工具

数据库版本控制--flyway工具 成功新增表user_info

7、给表user_info新增一个字段:user_money_amount:

数据库版本控制--flyway工具

8、重启项目并查看数据库:

数据库版本控制--flyway工具 刚才忘了字段排序了,重新加了一个sql文件,改下字段排序:

数据库版本控制--flyway工具

数据库版本控制--flyway工具

多个节点能够并行执行migration吗?

当然可以!Flyway使用数据库锁机制(locking technology of your database)来协调多个节点,从而保证多套应用程序可同时执行migration,而且集群控制也可做配置。

更多内容还得挖掘,以后各位挖掘出来了也可以写文章,加深自己的概念,也能让别人学习,给各位也给自己一个建议:做事规范,该写备注的就写备注,该注意顺序的就注意顺序,我刚进来公司也是代码不规范,数据库脚本不注意字段顺序等等,然后我老大跟我说:坏习惯要慢慢改掉,不要让习惯毁了你,以后你也有可能是别人的老大,这些事情你以后也要教他们,总不能到时候人家写的比你还规范,那你岂不是很尴尬。所以我现在也在改了,希望各位也能吸取一下经验,有则改之,无则加勉!

如果有需要的话可以关注一下我的公众号,会即时更新Java相关技术文章,公众号内还有一些实用资料,如Java秒杀系统视频教程、黑马2019的教学资料(IDEA版)、BAT面试题汇总(分类齐全)、MAC电脑常用安装包(有一些是淘宝买的,已PJ的)。

数据库版本控制--flyway工具