dbswitch:一款免费开源、功能强大的异构数据库迁移同步工具
dbswitch是一款开源的跨数据库数据迁移与同步工具,支持MySQL、PostgreSQL、Oracle等多种关系型数据库和部分非关系型数据库。核心功能包括全量/增量数据迁移、表结构自动转换、并行迁移处理等,提供命令行、Java API等多种使用方式。工具采用流式处理降低内存占用,支持插件化扩展新数据库类型,适用于数据库升级、多数据源同步、数据中台建设等场景。相比Sqoop、DataX等工具,d
目录
1.简介
dbswitch 是一个专注于 跨数据库数据迁移与同步 的开源工具库,旨在简化不同数据库之间的结构迁移(Schema Migration)和数据同步(Data Synchronization)流程。支持数据的全量、增量、变化量方式同步。它支持多种主流关系型数据库(如 MySQL、PostgreSQL、Oracle、SQL Server 等)和部分非关系型数据库,提供灵活的配置和高性能的迁移能力,广泛用于数据中台建设、多数据源整合、数据库升级迁移等场景。
2.核心功能与特点
1.多数据库支持
覆盖主流关系型数据库及部分特殊数据库,包括:
- 关系型数据库:MySQL、PostgreSQL、Oracle、SQL Server、DB2、MariaDB、TiDB、达梦(DM)、人大金仓(Kingbase)等;
- 数据仓库 / 分析型数据库:ClickHouse、Greenplum、Hive 等;
- 其他:SQLite、MongoDB(部分支持)。
支持不同数据库之间的 双向迁移(如 MySQL → PostgreSQL、Oracle → TiDB 等)。

2.全量 + 增量迁移能力
- 全量迁移:一次性迁移目标表的所有历史数据,适合初始化场景;
- 增量迁移:基于时间戳(Timestamp)、自增 ID、数据库日志(如 MySQL 的 binlog)等方式捕获增量数据,支持实时或定时同步,满足业务连续性需求。
3.结构与数据双迁移
- 结构迁移(Schema Conversion):自动转换不同数据库的表结构(如数据类型映射:MySQL 的
VARCHAR→PostgreSQL 的VARCHAR,Oracle 的NUMBER→MySQL 的DECIMAL)、索引、约束(主键、外键)等,减少手动调整成本; - 数据迁移(Data Transfer):高效迁移表数据,支持大字段(BLOB、CLOB)、分区表、视图等特殊对象的迁移。

4.高性能与可扩展性
- 并行迁移:支持多表并行迁移、单表分片并行读取,提升大规模数据迁移效率;
- 流式处理:采用流式读取 / 写入模式,避免全量加载数据到内存,降低内存占用;
- 可扩展架构:通过插件化设计支持新增数据库类型,用户可自定义数据类型映射规则或迁移逻辑。
5.易用性与灵活性
- 提供 命令行工具、Java API、Spring Boot Starter 等多种使用方式,适配不同场景(如脚本自动化、集成到应用系统);
- 支持配置文件(YAML/JSON)定义迁移任务,可指定迁移对象(表、字段过滤)、迁移策略(全量 / 增量)、错误重试机制等;
- 内置数据校验功能,迁移后可自动比对源表与目标表的数据一致性(行数、校验和等)。
3.安装与基本使用
1.环境依赖
- JDK 8+(核心为 Java 开发);
- maven:>=3.6, Maven 仓库默认在国外, 国内使用难免很慢,可以更换为阿里云的仓库。 参考教程: 配置阿里云的仓库教程
- 源数据库和目标数据库的驱动(需手动添加对应 JDBC 驱动包,如
mysql-connector-java、postgresql等)。
2.安装方式
- 源码编译:从 GitHub 仓库(https://gitee.com/dromara/dbswitch )克隆代码,通过 Maven 编译:
(1) windows下:
双击build.cmd脚本文件即可编译打包
(2) Linux下:
git clone https://gitee.com/dromara/dbswitch.git
cd dbswitch/
sh ./build.sh
(3) Docker下:
git clone https://gitee.com/dromara/dbswitch.git
cd dbswitch/
sh ./docker-maven-build.sh
-
直接下载发行包:从 GitHub Releases 页面下载最新版本的二进制包,解压后即可运行。
3.快速使用示例(命令行方式)
以 “MySQL → PostgreSQL 全量迁移” 为例:
(1) 配置迁移任务:创建application.yml配置文件,定义源库、目标库及迁移对象:
source:
type: mysql
jdbc-url: jdbc:mysql://127.0.0.1:3306/source_db?useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
target:
type: postgresql
jdbc-url: jdbc:postgresql://127.0.0.1:5432/target_db
username: postgres
password: 123456
driver-class-name: org.postgresql.Driver
migration:
mode: full # 全量迁移
tables: # 需迁移的表(支持通配符,如"user_*")
- source-table: "user_info"
target-table: "user_info_copy" # 可选,默认与源表名相同
columns: # 可选,指定迁移的字段,默认全字段
- id
- name
- create_time
(2) 执行迁移任务:
# 进入解压后的bin目录
cd dbswitch-cli-${version}/bin
# 执行迁移(Linux/Mac)
./dbswitch --config /path/to/application.yml
# Windows系统
dbswitch.bat --config C:\path\to\application.yml
(3) 查看迁移日志:日志默认输出到控制台,包含迁移进度(如 “迁移表 user_info:已迁移 1000/5000 行”)、错误信息等。
4.高级特性
1.增量同步配置
通过migration.mode: incremental开启增量迁移,需指定增量字段(如时间戳):
migration:
mode: incremental
incremental-column: create_time # 增量字段(时间戳或自增ID)
last-sync-time: 2023-01-01 00:00:00 # 首次同步的起始时间
sync-interval: 60 # 增量同步间隔(秒)
2.数据转换规则自定义
对于内置规则不支持的特殊数据类型(如 Oracle 的INTERVAL→MySQL 的BIGINT),可通过自定义转换器实现:
// 实现自定义类型转换器
public class OracleIntervalToMysqlBigintConverter implements TypeConverter {
@Override
public Object convert(Object value) {
// 自定义转换逻辑:将Oracle INTERVAL转换为毫秒数(BIGINT)
if (value instanceof OracleIntervalDS) {
return ((OracleIntervalDS) value).totalMilliseconds();
}
return value;
}
}
在配置文件中指定转换器:
migration:
type-converters:
- source-type: oracle_interval_ds
target-type: bigint
converter-class: com.example.OracleIntervalToMysqlBigintConverter
3.集成支持新的关系型数据库产品
参考教程: 接入自定义关系型数据库的开发说明文档
4.集成dbswitch模块进行二次开发(API方式)
pom.xml中引入dbswitch模块依赖
<dependency>
<groupId>com.longtai.dbswitch</groupId>
<artifactId>dbswitch-core</artifactId>
<version>${dbswitch.version}</version>
</dependency>
// 代码示例:全量迁移
public class MigrationExample {
public static void main(String[] args) {
// 配置源库和目标库
DataSourceConfig sourceConfig = new DataSourceConfig();
sourceConfig.setType("mysql");
sourceConfig.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/source_db");
// ... 设置用户名、密码等
DataSourceConfig targetConfig = new DataSourceConfig();
targetConfig.setType("postgresql");
// ... 设置目标库配置
// 创建迁移任务
MigrationTask task = new MigrationTask();
task.setSourceConfig(sourceConfig);
task.setTargetConfig(targetConfig);
task.setMode(MigrationMode.FULL);
task.setTables(Collections.singletonList(
new TableMigrationConfig("user_info", "user_info_copy")
));
// 执行迁移
MigrationEngine engine = new MigrationEngine();
engine.execute(task);
}
}
5.常见问题解决
1.在Windows下,执行startup.cmd或datasync.cmd脚本报错
解决办法:将脚本的内容复制后,删除原脚本文件,然后再创建一个同名脚本文件后,将原内容粘贴进去后,再执行脚本。
2.在Linux下,执行startup.sh或datasync.sh脚本报错
解决办法:用vi/vim工具打开脚本,然后命令模式下设置 set ff=unix后,然后保存退出,再执行脚本。
6.适用场景
- 数据库升级 / 迁移:如从 MySQL 5.7 迁移到 MySQL 8.0,或从 Oracle 迁移到 TiDB(国产化替代);
- 多数据源同步:将业务库(MySQL)的数据同步到数据仓库(ClickHouse)用于分析;
- 灾备与备份:定时将生产库数据同步到备用库,确保数据安全;
- 数据中台建设:整合分散在不同数据库中的数据,统一存储到数据湖或数据仓库。
7.与同类工具对比
| 工具 | 特点 | 优势场景 | dbswitch 优势 |
|---|---|---|---|
| Sqoop | 基于 Hadoop,适合 HDFS 与关系库的迁移 | 大数据量离线迁移 | 更轻量(无需 Hadoop),支持更多数据库 |
| Debezium | 基于 CDC(变更数据捕获),实时同步 | 高实时性的增量同步 | 支持全量 + 增量,配置更简单 |
| DataX | 阿里开源,支持多数据源,插件化架构 | 通用数据迁移 | 更专注于数据库结构 + 数据迁移,支持国产库 |
8.总结
dbswitch 是一款轻量、高效的跨数据库迁移工具,通过简化结构转换和数据同步流程,降低了多数据库环境下的数据整合成本。其支持全量 + 增量迁移、多数据库兼容、自定义转换规则等特性,使其适用于从简单数据迁移到复杂数据中台建设的多种场景。对于需要在不同数据库间进行数据迁移或同步的开发 / 运维人员,dbswitch 是一个值得尝试的开源方案。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)