前言
在项目开发过程中,不可避免的需要创建表,修改表结构。如果没有一个统一维护的地方,很容易造成 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
主要功能
- 脚本版本化:按时间顺序管理 SQL 脚本
- 防止重复执行:通过记录已执行脚本的元数据表(默认 changelog )避免重复执行
- 回滚支持:部分支持脚本回滚(需在脚本中定义反向操作)
- 环境隔离:支持不同环境(开发 / 测试 / 生产)使用不同配置
注意: 若项目较简单,maven-dbdeploy-plugin 是轻量级选择。
Sql Archery
Archery 是archer的分支项目,定位于SQL审核查询平台,旨在提升DBA的工作效率,支持多数据库的SQL上线和查询,同时支持丰富的MySQL运维功能,所有功能都兼容手机端操作。
账号 密码
archer archer
注意:如果说项目,数据库特别多的话,可以只用这种方式,这个有完善的审核机制,以及sql检测。能够快捷方便的去操作数据库,所有的sql都会被记录,即使后面上线或者恢复等,也不会因为时间太久而导致原本sql丢失。只是会增大运维工作量,小型的项目可以简简单单的,不必引入。