DBSwitch阉割版实现异构数据库表结构同步

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS SQL Server,基础系列 2核4GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 🍅程序员小王的博客:程序员小王的博客🍅 欢迎点赞 👍 收藏 ⭐留言 📝🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕🍅java自学的学习路线:java自学的学习路线

一、前言

在公司使用dataX实现异构数据库离线结构同步之后,公司同步数据库数据效率大大提升,但是如果oracle数据库创建了一张test表,想同步到mysql数据库,也需要在mysql数据库中创建test表之后,才能实现数据库表结构同步,DataX本身作为数据同步框架,将不同数据源的同步抽象为从源头数据源读取数据的Reader插件,以及向目标端写入数据的Writer插件,理论上DataX框架可以支持任意数据源类型的数据同步工作,但是就是没有同步表结构的功能,然后在gitee上面,发现了一个叫做dbswitch的项目



dbswitch开源项目地址:https://gitee.com/inrgihc/dbswitch


dbswitch经过我改版之后只能实现表结构同步源码:https://gitee.com/wanghengjie563135/dbswitch_tableSynchronization.git


dbswitch实现的功能是:异构数据库迁移同步工具,dbswitch提供源端数据库向目的端数据的全量与增量迁移同步功能,其实大概功能和datax类似,只是效率和稳定性没有datax好,因为datax毕竟是阿里巴巴开源,并且也是目前国内认为开源中最好的离线数据同步工具,但是dbswitch有一个强大的功能,并且目前开源项目中我认为最完善的异构数据库表结构同步功能(我是在github,gitee上面找了几乎所有的国内表结构同步项目,最后选择了dbswitch)目前dbswitch同步的功能有:


一句话,dbswitch工具提供源端数据库向目的端数据库的批量迁移同步功能,支持数据的全量和增量方式同步。包括:


结构迁移


支持字段类型、主键信息、建表语句等的转换,并生成建表SQL语句。


支持基于正则表达式转换的表名与字段名映射转换。


数据同步。


基于JDBC的分批次读取源端数据库数据,并基于insert/copy方式将数据分批次写入目的数据库。


支持有主键表的 增量变更同步 (变化数据计算Change Data Calculate)功能(千万级以上数据量的性能尚需在生产环境验证)


而他的数据同步可以使用datax替代,但是结构迁移目前最好表结构同步方案,然后我经过了大概半个月的时间,进行修改测试整合,目前dbswitch+datax的整合已经进入尾声,在生产环境上能够实现dbswitch实现表结构同步,datax实现数据同步!


二、dbswitch阉割版(异构数据库表结构同步工具)简介

1、dbswitch阉割版之后功能

我将dbswitch修改之后,dbswitch只支持表结构同步功能,没有数据同步功能了,主要支持字段类型、主键信息、建表语句等的转换,并生成建表SQL语句。


支持基于正则表达式转换的表名与字段名映射转换。


2、功能设计

这张图是dbswitch开源作者画的,其中阉割版的dbswitch就取消了离线异构数据同步功能



3、表结构同步支持的数据库

目前常见数据库oracle,db2,mysql,sqlserver都全部支持,具体详情请参考:

源段oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2/DM/Kingbase8/HighGo/Hive向目的端为Greenplum/PostgreSQL/HighGo的迁移(支持绝大多数常规类型字段)


源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2/DM/Kingbase8/HighGo/Hive向目的端为Oracle的迁移(支持绝大多数常规类型字段)


源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2/DM/Kingbase8/HighGo/Hive向目的端为DM的迁移(支持绝大多数常规类型字段...)


源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2/DM/Kingbase8/HighGo/Hive向目的端为SQLServer的迁移(字段类型兼容测试中...)


源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2/DM/Kingbase8/HighGo/Hive向目的端为MySQL/MariaDB的迁移(字段类型兼容测试中...)


源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2/DM/Kingbase8/HighGo/Hive向目的端为DB2的迁移(字段类型兼容测试中...)


源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2/DM/Kingbase8/HighGo/Hive向目的端为Kingbase8的迁移(支持绝大多数常规类型字段...)

4、dbswitch模块结构设计


5、模块结构功能

└── dbswitch
    ├── dbswitch-common    // dbswitch通用定义模块
    ├── dbswitch-pgwriter  // PostgreSQL的二进制写入封装模块
    ├── dbswitch-dbwriter  // 数据库的通用批量Insert封装模块
    ├── dbswitch-core      // 数据库元数据抽取与建表结构语句转换模块
    ├── dbswitch-sql       // 基于calcite的DML语句转换与DDL拼接模块
    ├── dbswitch-dbcommon  // 数据库操作通用封装模块
    ├── dbswitch-dbchange  // 基于全量比对计算变更(变化量)数据模块
    ├── dbswitch-dbsynch   // 将dbchange模块计算的变更数据同步入库模块
    ├── dbswitch-data      // 工具入口模块,读取配置文件中的参数执行异构迁移同步
    ├── dbswitch-admin     // 在以上模块的基础上引入Quartz的调度服务与接口
    ├── dbswitch-admin-ui  // 基于Vue2的前段WEB交互页面
    ├── package-tool       // 基于maven-assembly-plugin插件的项目打包模块

三、dbswitch实现异构数据库表结构同步功能

我们可以将gitee仓库的dbswitch拉取到本地开发环境:https://gitee.com/inrgihc/dbswitch.git


dbswitch经过我改版之后只能实现表结构同步源码(直接使用):https://gitee.com/wanghengjie563135/dbswitch_tableSynchronization.git

1、在dbswitch-data下找到MigrationHandler

拉取下来之后部署,修改MigrationHandler代码如下:


2、修改dbswitch-admin的配置

server:
  port: 9088
spring:
  application:
    name: dbswitch-admin
  tomcat:
    uri-encoding: UTF-8
    max-http-header-size: 8096
  mvc:
    throw-exception-if-no-handler-found: true
    static-path-pattern: /statics/dbswitch/**
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/dbswitch?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
    username: root
    password: root
    validation-query: SELECT 1
    test-on-borrow: true
  flyway:
    locations: classpath:db/migration
    baseline-on-migrate: true
    table: DBSWITCH_SCHEMA_HISTORY
    enabled: true
mybatis:
  configuration:
    lazy-loading-enabled: true
    aggressive-lazy-loading: false
    map-underscore-to-camel-case: true
    #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper:
  wrap-keyword: "`{0}`"
  enable-method-annotation: true

注意:我使用的是mysql8所以还得修改maven

<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.22</version>
      <scope>runtime</scope>
    </dependency>

 

3、如果想实现Oracle相关表结构同步需要添加依赖

在dbswitch-core的maven里面添加依赖,不然最初始的项目不支持oracle,会报错:

<dependency>
      <groupId>cn.easyproject</groupId>
      <artifactId>orai18n</artifactId>
      <version>12.1.0.2.0</version>
    </dependency>

 


这样之后启动项目,启动项目之前需要在数据库中创建dbswitch数据库,dbswitch可以实现自动导入表,所以只需要创建数据库就可以了,创建数据库的语句:


drop database if exists `dbswitch`;
#创建dbswitch数据库
create database `dbswitch` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

阉割版的dbswitch就可以实现了,启动项目,项目访问地址:http://127.0.0.1:9088/[3]


账户:admin密码:123456


4、dbswitch添加账户密码

dbswitch本身没有添加账户的功能,如果登录只能admin/123456进行登入,如果想添加账户,需要数据库管理员(DBA)添加

  • 我们可以看到dbswitch的用户密码是加了盐的

我们想要添加账户时需要给密码加盐,java实现dbswitch的密码


导入maven

 <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.5</version>
 </dependency>

java,输入密码自动实现加密

package com.tjcu;
import cn.hutool.crypto.digest.BCrypt;
public class PasswordUtils {
    public static void main(String[] args) {
        String password = "whj1234";
        String credentialsSalt = "$2a$10$eUanVjvzV27BBxAb4zuBCu";
        String newPassword = encryptPassword(password, credentialsSalt);
        System.out.println(newPassword);
        System.out.println(credentialsSalt);
    }
    public static String encryptPassword(String password, String credentialsSalt) {
        return BCrypt.hashpw(password, credentialsSalt);
    }
}



在dbswitch 添加账号sql语句

# dbswitch 添加账号sql语句
INSERT INTO `dbswitch_system_user` VALUES (2, 'whj', 
'$2a$10$eUanVjvzV27BBxAb4zuBCuK/4evNmPiFwA.XvSOd6Efpw.hQZbST.', 
'$2a$10$eUanVjvzV27BBxAb4zuBCu', 'whj', '123@qq.com', '', 0, NOW(), NOW());


这样之后我们阉割版的dbswitch就全部完成了


四、dbswitch实现nginx配置

dbswitch全部完成了,但是项目需要放在生产环境上,需要使用nginx进行转发,如果我们之间转发


http://127.0.0.1:9088/[4]这个连接的话,影响nginx使用,占用太多的资源了,所以为了节约nginx资源,我们需要在端口号后面增加dbswitch,http://127.0.0.1:9088/[5]dbswitch访问

1、修改dbswtch的前端vue项目

这是dbswitch的前端代码,



但是我修改前端代码实出现这个报错,而我对vue就会皮毛,改也不会改,然后我就自己通过idea手动修改了打包后的静态资源



我将所有的静态资源的static改为dbswitch,如index.html


修改后的静态资源我放在了gitee上面了,如果自己不想修改的可以参考我的:https://gitee.com/programmer-wanghengjie/dbswitchTable-synchronization.git




2、修改WebMvcConfig


@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    // 访问http://localhost:8080/index.html 都会跳转到classpath:/index.html下去找,即resources/index.html
    registry.addResourceHandler("/index.html").addResourceLocations("classpath:/index.html");
    registry.addResourceHandler("/favicon.ico").addResourceLocations("classpath:/favicon.ico");
    // 访问http://localhost:8080/static/*** 都会跳转到classpath:/static/下去找,即resources/static/
    registry.addResourceHandler("/dbswitch/**").addResourceLocations("classpath:/dbswitch/");
  }
  @Override
  public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/dbswitch").setViewName("forward:index.html");
  }
}

3、修改application.yml


static-path-pattern: /statics/dbswitch/**

然后启动项目之后访问地址:http://127.0.0.1:9088/dbswitch#/login


4、然后部署在开发环境上面配置nginx

我们一般在一台机器上部署项目,部署项目步骤


本工具纯Java语言开发,代码中的依赖全部来自于开源项目。


(1)编译打包


环境要求:


JDK:>=1.8 (建议用JDK 1.8)


maven:>=3.6


Maven 仓库默认在国外, 国内使用难免很慢,可以更换为阿里云的仓库。 参考教程: 配置阿里云的仓库教程[8]


(2) Linux下编译:


#最好上传自己修改后的版本
git clone https://gitee.com/inrgihc/dbswitch.git
cd dbswitch/
sh ./build.sh

(3)当编译打包命令执行完成后,会在dbswitch/target/目录下生成dbswitch-relase-x.x.x.tar.gz的打包文件,将文件拷贝到已安装JRE的部署机器上解压即可。


tar -zxvf dbswitch-release-1.6.9.tar.gz



在dbswitch-release-1.6.9的bin中启动项目


./startup.sh



5、在nginx中配置

location ~ ^/dbswitch{
            proxy_pass  http://ip:9088;
        }

然后启动项目,我在我的虚拟机上面配置的nginx,访问项目,正常访问


五、阉割版的DBSwitch使用帮助手册

1、DBSwitch登录

开发环境登录地址:http://ip:9088/dbswitch



输入网址后进入DBSwitch系统登录页,须填写用户名和密码。


用户名:


密码:

2、核心功能

(1)数据源连接管理

见左侧“连接管理”🡪“添加”


点击“添加之后”:

可以选择数据库名称,选择数据库类型,jdbc连接串和账户密码;


添加成功后示意图:

测试是否连接成功


(2)任务管理

见左侧“任务管理栏”🡪“任务安排”🡪“添加”


完成基本信息配置,点击下一步


完成源数据库配置:点击下一步


完成目标数据库配置:点击下一步



同步表的关系映射,如果表名映射和字段名映射为空时,表示



如果目标表需要改名,点击添加表映射


添加成功后点击预览表名映射看是否改名成功(必须操作)


注意:这个查看表名映射关系的操作必须操作,有时候大家感觉自己添加映射之后没什么问题,但是有时候添加表名的时候是复制粘贴的,系统没识别,不查看表名关系映射直接操作下一步的话,可能会出现表名修改失败,导致同步的数据库表名和源端表名一样,需要走OA删除建的表导致时间浪费过长



如果字段名需要修改,点击添加字段名映射



同样的步骤也要预览字段名

点击下一步之后,点击提交



点击发布也可以点击更多修改配置,但是一旦发布就不能再修改



点击执行同步表结构就开始了!



见左侧“任务管理栏”——》“调度记录”“任务安排列表”



点击刚才任务中取的名字,查看任务日志



如果同步成功以后,可以点击


见左侧“数据目录栏”——》“数据源导航树”——》“查看自己同步目标库的目标表”



查看目标表的建表和赋权限的sql语句是否正确


注意:重点查看是否赋权限



点击字段信息,查看同步后目标表的字段是否正确



点击取样数据主要是查看表中的数据,同步表之后数据为空,如果需要实现同步数据,请使用datax实现,使用datax同步数据之后可以使用dbswitch查看数据是否同步成功



dbswitch经过我改版之后只能实现表结构同步源码直接使用:https://gitee.com/wanghengjie563135/dbswitch_tableSynchronization.git


相关文章
|
2月前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
3月前
|
运维 监控 NoSQL
【MongoDB 复制集秘籍】Secondary 同步慢怎么办?深度解析与实战指南,让你的数据库飞速同步!
【8月更文挑战第24天】本文通过一个具体案例探讨了MongoDB复制集中Secondary成员同步缓慢的问题。现象表现为数据延迟增加,影响业务运行。经分析,可能的原因包括硬件资源不足、网络状况不佳、复制日志错误等。解决策略涵盖优化硬件(如增加内存、升级CPU)、调整网络配置以减少延迟以及优化MongoDB配置(例如调整`oplogSize`、启用压缩)。通过这些方法可有效提升同步效率,保证系统的稳定性和性能。
88 4
|
3月前
|
SQL 关系型数据库 MySQL
如何快速在表级别做同构或者异构数据库之间的数据迁移/备份
【8月更文挑战第17天】本文介绍在同构与异构数据库间快速迁移/备份表级数据的方法。同构迁移可利用数据库自带工具(如MySQL的`mysqldump`)或管理软件(如phpMyAdmin);异构迁移则推荐使用ETL工具(如Pentaho Data Integration)或数据库复制工具(如SymmetricDS),亦可通过编程方式实现。实施前需测试以确保数据完整准确,并注意处理兼容性问题。
120 4
|
4月前
|
存储 SQL 数据库
如何避免数据库表结构冗余?
【7月更文挑战第28天】如何避免数据库表结构冗余?
50 5
|
12天前
|
缓存 关系型数据库 MySQL
高并发架构系列:数据库主从同步的 3 种方案
本文详解高并发场景下数据库主从同步的三种解决方案:数据主从同步、数据库半同步复制、数据库中间件同步和缓存记录写key同步,旨在帮助解决数据一致性问题。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
高并发架构系列:数据库主从同步的 3 种方案
|
21天前
|
算法 大数据 数据库
云计算与大数据平台的数据库迁移与同步
本文详细介绍了云计算与大数据平台的数据库迁移与同步的核心概念、算法原理、具体操作步骤、数学模型公式、代码实例及未来发展趋势与挑战。涵盖全量与增量迁移、一致性与异步复制等内容,旨在帮助读者全面了解并应对相关技术挑战。
32 3
|
3月前
|
C# 开发者 Windows
全面指南:WPF无障碍设计从入门到精通——让每一个用户都能无障碍地享受你的应用,从自动化属性到焦点导航的最佳实践
【8月更文挑战第31天】为了确保Windows Presentation Foundation (WPF) 应用程序对所有用户都具备无障碍性,开发者需关注无障碍设计原则。这不仅是法律要求,更是社会责任,旨在让技术更人性化,惠及包括视障、听障及行动受限等用户群体。
80 0
|
3月前
|
SQL DataWorks 关系型数据库
DataWorks操作报错合集之如何处理在DI节点同步到OceanBase数据库时,出现SQLException: Not supported feature or function
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
4月前
|
消息中间件 关系型数据库 数据库
实时计算 Flink版操作报错合集之在使用RDS数据库作为源端,遇到只能同步21个任务,是什么导致的
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
4月前
|
Web App开发 缓存 数据管理
数据管理DMS使用问题之执行SHOW CREATE TABLE命令查看表结构时,数据库管理员和普通授权账号看到的为什么不一样
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。