JesseTzh
· 585 words Java Spring Cloud Alibaba Liquibase

Spring Cloud Alibaba 接入 Liquibase

为现有既有项目添加 Liquibase 支持的实践


Liquibase 实践指南

背景介绍

Liquibase 是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据)都保存在 XML (或其他格式)文件中,便于版本控制。

在对数据库没有版本控制工具的情况下,每当系统上线,往往需要开发人员手动去对数据库进行维护,这毫无疑问是十分危险的。为了避免人工操作可能导致错误的发生,采用类似 Liquibase 的数据库版本控制工具是十分必要的。

类似的工具还有 Flyway

改造思路

由于在实际的开发中,未必可以一次性将所有环境与服务数据库均改为使用 Liquibase 控制,所以可以考虑默认将服务配置 spring.liquibase.enabled 配置为 false ,在需要的线上环境使用类似 Nacos 进行配置下发以开启功能。

改造步骤

  1. pom.xml 文件:添加 liquibase依赖

    <!--Liquibase 依赖-->
    <dependency>
    	<groupId>org.liquibase</groupId>
    	<artifactId>liquibase-core</artifactId>
    </dependency>

    并增加 <plugins>插件以实现便捷操作。

    <plugin>
    	<groupId>org.liquibase</groupId>
    	<artifactId>liquibase-maven-plugin</artifactId>
    	<configuration>
    		<!--properties文件路径,该文件记录了数据库连接信息等-->
    		<propertyFile>src/main/resources/liquibase/liquibase.properties</propertyFile>
    		<propertyFileWillOverride>true</propertyFileWillOverride>
    	</configuration>
    </plugin>
  2. resources 文件下创建如下结构:

    image.png

    其中 changeMaster.xml 文件内容:

       <databaseChangeLog
             xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.5.xsd">
          <include file="liquibase/changelog/init/changelog-table-init.xml"/>
          <include file="liquibase/changelog/init/changelog-data-init.xml"/>
          <includeAll path="liquibase/changelog/upgrade"/>
       </databaseChangeLog>

    changelog-table-init.xml 将会用于存储表结构,而 changelog-data-init.xml 则存储初始化的数据。

    upgrade 文件夹中则存储之后更新所需的增量改动。

    liquibase.properties 文件内容:如果项目数据库配置在本地而非下发,可以跳过此处数据库配置。

       driver=com.mysql.cj.jdbc.Driver
       url=jdbc:mysql://mysql:3306/mysql?createDatabaseIfNotExist=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
       username=changeme
       password=changeme
       outputChangeLogFile=src/main/resources/liquibase/changelog/init/changelog-table-init.xml
  3. application.yml 增加配置项

    liquibase:
      change-log: classpath:liquibase/changeMaster.xml
      enabled: false

使用方法

  1. 初次导出所有表结构: 如果在 liquibase.properties 中不配置 diffTypesliquibase-maven-plugin 将会默认读取数据库的 tables, views, columns, indexes, foreignkeys, primarykeys, uniqueconstraints. 在 IDEA 的 Maven 工具栏中点击对应服务的 liquibase:generateChangeLog,即可自动生成表结构对应 xml。

    Snipaste_2023-10-03_12-06-44.png

  2. 导出初始化数据: 首先保证所链接数据库仅存在业务所需要的初始化数据,将 liquibase.properties 修改如下,并依旧使用 liquibase:generateChangeLog 即可生成初始化的数据 xml。

    driver=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://mysql:3306/database?createDatabaseIfNotExist=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
    username=changeme
    password=changeme
    outputChangeLogFile=src/main/resources/liquibase/changelog/init/changelog-data-init.xml
    diffTypes=data

Last Updated: October 24, 2023