关于如何保存日常开发中的sql变更

doMore 62 2025-05-20

前言

在项目开发过程中,不可避免的需要创建表,修改表结构。如果没有一个统一维护的地方,很容易造成 sql 丢失,上线的时候漏掉一部分,从而出现莫名的bug。为了能够方便管理这些数据库的变更,介绍几种在工作中曾经用过的方式。

maven-dbdeploy-plugin

使用方式

maven-dbdeploy-plugin 是一个用于数据库版本控制和增量部署的 Maven 插件,通过管理 SQL 脚本的执行顺序,实现数据库结构的自动化升级。以下是其核心功能和基本用法:

<!-- 在项目 pom 中增加配置 -->
<build>
        <plugins>
            <plugin>
                <groupId>com.dbdeploy</groupId>
                <artifactId>maven-dbdeploy-plugin</artifactId>
                <version>3.0M3</version>
                <configuration>
                    <scriptdirectory>./src/main/sql</scriptdirectory>
                    <name>${dbchangefile.name}</name>
                    <encoding>GBK</encoding>
                    <lineEnding>lf</lineEnding>
                    <outputfile>./target/apply.sql</outputfile>
                    <undoOutputfile>./target/undo.sql</undoOutputfile>
                    <driver>com.mysql.cj.jdbc.Driver</driver>
                    <url>${db.url}</url>
                    <userid>${db.usr}</userid>
                    <password>${db.pwd}</password>
                    <dbms>mysql</dbms>
                    <delimiter>;</delimiter>
                    <delimiterType>row</delimiterType>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>com.mysql</groupId>
                        <artifactId>mysql-connector-j</artifactId>
                        <version>8.0.33</version>
                    </dependency>
                </dependencies>
                <executions>
                    <execution>
                        <id>update-db</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>update</goal>
                        </goals>
                        <configuration>
                            <scriptdirectory>${basedir}/target/sql-all</scriptdirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.5</version>
                <executions>
                    <execution>
                        <id>copy-sql-to-source-dir</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${basedir}/target/sql-all</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>src/main/sql</directory>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
-- 需要初始化的 数据库表  表明可以在配置中修改,但是没必要
CREATE TABLE changelog (
  change_number BIGINT NOT NULL,
  complete_dt TIMESTAMP NOT NULL,
  applied_by VARCHAR(100) NOT NULL,
  description VARCHAR(500) NOT NULL
);

ALTER TABLE changelog ADD CONSTRAINT Pkchangelog PRIMARY KEY (change_number)
;

初始化文件的脚本:

# createNewDDLChangeFile.bat
mvn dbdeploy:change-script -Ddbchangefile.name=DDL
# createNewDMLChangeFile.bat
mvn dbdeploy:change-script -Ddbchangefile.name=DML

# 生成文件名称效果  :  20250520103541_DML.sql

执行sql 的脚本:

# -X 讲详细的执行日期打出来
call mvn dbdeploy:update -X -Ddb.url="jdbc:mysql://localhost:3306/test" -Ddb.usr=test -Ddb.pwd=123456 1>run.log

主要功能

  1. 脚本版本化:按时间顺序管理 SQL 脚本
  2. 防止重复执行:通过记录已执行脚本的元数据表(默认 changelog )避免重复执行
  3. 回滚支持:部分支持脚本回滚(需在脚本中定义反向操作)
  4. 环境隔离:支持不同环境(开发 / 测试 / 生产)使用不同配置

注意: 若项目较简单,maven-dbdeploy-plugin 是轻量级选择。

Sql Archery

Archery 是archer的分支项目,定位于SQL审核查询平台,旨在提升DBA的工作效率,支持多数据库的SQL上线和查询,同时支持丰富的MySQL运维功能,所有功能都兼容手机端操作。

在线体验

账号 密码
archer archer

注意:如果说项目,数据库特别多的话,可以只用这种方式,这个有完善的审核机制,以及sql检测。能够快捷方便的去操作数据库,所有的sql都会被记录,即使后面上线或者恢复等,也不会因为时间太久而导致原本sql丢失。只是会增大运维工作量,小型的项目可以简简单单的,不必引入。