DM-Compare 是一个基于 Spring Boot 的达梦数据库表结构对比工具,能够自动对比两个达梦数据库的表结构差异,并生成同步DDL脚本。
编辑 src/main/resources/application.yml:
database:
compare:
# 源数据库配置 (schema从URL中自动提取)
source:
url: jdbc:dm://源数据库IP:端口?schema=模式名
username: 用户名
password: 密码
# 目标数据库配置 (schema从URL中自动提取)
target:
url: jdbc:dm://目标数据库IP:端口?schema=模式名
username: 用户名
password: 密码
# DDL输出文件路径
output:
file: sync_ddl.sql
注意: schema会自动从URL中的?schema=XXX参数提取,无需单独配置。
# 使用Maven运行
./mvnw spring-boot:run
# 或者打包后运行
./mvnw clean package
java -jar target/dm-compare-0.0.1-SNAPSHOT.jar
运行完成后:
sync_ddl.sql 文件,包含同步DDL脚本| 配置项 | 说明 | 示例 |
|---|---|---|
database.compare.source.url | 源数据库JDBC连接URL | jdbc:dm://127.0.0.1:5236?schema=DB1 |
database.compare.source.username | 源数据库用户名 | SYSDBA |
database.compare.source.password | 源数据库密码 | password123 |
database.compare.target.url | 目标数据库JDBC连接URL | jdbc:dm://127.0.0.1:5236?schema=DB2 |
database.compare.target.username | 目标数据库用户名 | SYSDBA |
database.compare.target.password | 目标数据库密码 | password123 |
database.compare.output.file | DDL输出文件路径 | sync_ddl.sql |
项目已配置Spring Boot配置元数据,在IDEA/Eclipse中编辑application.yml时会有智能提示和说明。
-- ========================================
-- 表: user_info (只在源库存在,需要在目标库创建)
-- ========================================
CREATE TABLE SCHEMA."user_info" (
"id" BIGINT NOT NULL,
"username" VARCHAR(50) NOT NULL,
"email" VARCHAR(100),
"create_time" TIMESTAMP
);
COMMENT ON TABLE SCHEMA."user_info" IS '用户信息表';
COMMENT ON COLUMN SCHEMA."user_info"."id" IS '用户ID';
COMMENT ON COLUMN SCHEMA."user_info"."username" IS '用户名';
-- ========================================
-- 表: product
-- ========================================
-- 添加列: description
ALTER TABLE SCHEMA."product" ADD "description" VARCHAR(500);
-- 修改列: price
-- 目标库当前: DECIMAL(10,2)
-- 源库定义: DECIMAL(12,2)
ALTER TABLE SCHEMA."product" MODIFY "price" DECIMAL(12,2);
程序会保持数据库中表名的原始大小写,并在DDL中使用双引号:
CREATE TABLE SCHEMA."myTable" (...) -- 保持小写
自动转换为达梦兼容的类型:
INT(4) → INTBIGINT(8) → BIGINTTEXT → CLOB使用CHAR_LENGTH而不是DATA_LENGTH,确保VARCHAR等字符类型显示正确的字符长度而非字节长度。
达梦数据库使用单独的COMMENT ON语句添加注释,而不是在CREATE TABLE中使用COMMENT关键字。
dm-compare/ ├── src/main/ │ ├── java/ │ │ └── cn/com/chnenergy/dm/compare/ │ │ ├── DmCompareApplication.java # 主程序 │ │ ├── config/ │ │ │ └── DatabaseCompareConfig.java # 配置类 │ │ └── utils/ │ │ └── DmSchemaComparatorUtils.java # 核心对比工具 │ └── resources/ │ ├── application.yml # 配置文件 │ └── META-INF/ │ └── spring-configuration-metadata.json # 配置元数据 ├── pom.xml └── README.md
核心对比工具类,包含:
compareSchemas(): 对比两个数据库的表结构generateSyncDDL(): 生成同步DDL脚本getTableInfo(): 获取表的详细信息isColumnEqual(): 判断列是否相等配置类,使用@ConfigurationProperties自动绑定配置文件。
A: 可能是表名大小写问题。程序会保持表名原始大小写,确保URL中的schema参数正确。
A: 程序会在生成DDL时进行二次检查,过滤掉实际定义相同的字段。如果仍有问题,请检查调试输出。
A: 在application.yml中修改database.compare.output.file配置项。