数据库版本管理

| 分类 SPRINGBOOT  | 标签 flowfly  liquibase  mysql  spring-boot  database 

为什么要使用数据库版本管理

弱鸡面对数据库,都是这样的:

  • 手工变更数据库
  • 不能与团队的其他成员分享数据库变更
  • 使用不一致的方法变更数据库或数据
  • 使用低效的手工方法管理数据库版本之间的变更

当然啦,有些队友会用Sybase PowerDesigner。还有一些无人能挡的队友,直接用PD连接数据库,根据表结构设计自动生成表。

这种做法我以前也用过,但是PD保存的是二进制文件,无法用git做版本对比,很不爽。

后来直接把各种SQL写成文件,放在项目下。这么做的缺点是缺乏标准。遇到不会开黑的队友直接就无视了。

以下是两个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态。

Flyway和Liquibase比较

相同点

  • 都支持主流那几个数据库
  • 都提供了命令行,API,maven,gradle等等工具

不同点

Flyway

  1. 版本是用文件名管理的,如:V1_file.sql, V2_file.sql …
  2. 版本文件基于SQL的,所以如果不需要考虑切换数据库,可以写基于数据库特性的SQL,并且支持PL/SQL,T-SQL
  3. 基于Java的,个性化扩展很容易

Liquibase

  1. 版本管理的方式是指定Id和Author,会在数据库中插入表DATABASECHANGELOG,DATABASECHANGELOGLOCK,记录版本信息。
  2. 版本文件基于多种格式:xml, yaml, json, sql。XML有定义好的Schema,使用指定的tag来定义SQL,需要切换数据库的很容易,liquibase可以把XML翻译成指定的SQL。
  3. 如果想用sql格式的版本文件,建议直接考虑Flyway。因为你可能引入数据库相关的SQL语法。
  4. Liquibase最方便的地方是能迁移现有的数据库。也就是说,你在项目的任何时候都可以用上Liquibase。

所以感觉这两个的区别,就很像Hibernate和Mybatis,没有最好,只有最合适。

Liquibase使用

spring-boot中使用

spring-boot 直接支持Flyway和Liquibase。

在项目中加入Liquibase的依赖:

<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-core</artifactId>
</dependency>

在application.properties文件中,加入以下配置:

liquibase.change-log = classpath:/db/changelog/db.changelog-master.yaml
liquibase.url = jdbc:mysql://localhost:3306/db?useSSL=false
liquibase.user = username
liquibase.password = password

如果你的 liquibase.change-log 这一行跟上边一摸一样,就可以直接删掉。

maven中使用

在项目中加入liquibase-maven-plugin插件:

<build>
  <pluginManagement>
    <plugins>
      <!-- liquibase maven plugin -->
      <plugin>
        <groupId>org.liquibase</groupId>
        <artifactId>liquibase-maven-plugin</artifactId>
        <version>3.5.3</version>
        <configuration>
          <propertyFile>liquibase.properties</propertyFile>
        </configuration>
        <executions>
          <execution>
            <phase>process-resources</phase>
            <goals>
              <goal>update</goal>
              <goal>tag</goal>
              <goal>rollback</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </pluginManagement>
</build>

使用的命令是:

动作 命令
更新 mvn liquibase: update
打标签  
回滚  

这个配置官网都有教程,有一点需要说明,这里需要加上<pluginManagement>这个标签,官网上没有。如果不加会怎样呢?会报如下错误:

Plugin execution not covered by lifecycle configuration: org.liquibase:liquibase-maven-plugin:3.0.5:update

别问我为什么,自己学 Maven。

其他

How to write change log file, and how to use migrate and rollback?

直接看官网教程,很简单,看完就超神了。


上一篇     下一篇