程序员小王的博客:程序员小王的博客一、前言 在公司使用dataX实现异构数据库离线结构同步之后,公司同步数据库数据效率大大提升,但是如果oracle数据库创建了一张test表,想同步到mysql数据库,也需要在mysql数据库中创建test表之后,才能实现数据库表结构同步,DataX本身作为数据同步框架,将不同数据源的同步抽象为从源头数据源读取数据的Reader插件,以及向目标端写入数据的Writer插件,理论上DataX框架可以支持任意数据源类型的数据同步工作,但是就是没有同步表结构的功能,然后在gitee上面,发现了一个叫做dbswitch的项目
欢迎点赞 收藏 ?留言
如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕
java自学的学习路线:java自学的学习路线
文章图片
- dbswitch开源项目地址:https://gitee.com/inrgihc/dbswitch
- dbswitch经过我改版之后只能实现表结构同步源码:https://gitee.com/wanghengjie563135/dbswitch_tableSynchronization.git
一句话,dbswitch工具提供源端数据库向目的端数据库的批量迁移同步功能,支持数据的全量和增量方式同步。包括:
- 结构迁移
支持基于正则表达式转换的表名与字段名映射转换。
- 数据同步。
支持有主键表的 增量变更同步 (变化数据计算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的迁移(支持绝大多数常规类型字段...)
文章图片
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实现异构数据库表结构同步功能
【datax|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: 9088spring:
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: truemybatis:
configuration:
lazy-loading-enabled: true
aggressive-lazy-loading: false
map-underscore-to-camel-case: true
#log-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper:
wrap-keyword: "`{0}`"
enable-method-annotation: true
- 注意:我使用的是mysql8所以还得修改maven
mysql
mysql-connector-java
8.0.22
runtime
3、如果想实现Oracle相关表结构同步需要添加依赖
在dbswitch-core的maven里面添加依赖,不然最初始的项目不支持oracle,会报错:
cn.easyproject
orai18n
12.1.0.2.0
文章图片
这样之后启动项目,启动项目之前需要在数据库中创建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
cn.hutool
hutool-all
5.7.5
- 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
文章图片
文章图片
文章图片
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_passhttp://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
文章图片
推荐阅读
- Java毕业设计项目实战篇|Java项目:生鲜水果商城(java+SpringBoot+HTML+Thymeleaf+easyUI+bootstrap+mysql)
- SpringMVC|软件工程专业电商网站毕业论文答辩实录(基于SSM+VUE前后端分离的 “依伴汉服”网)
- intellij-idea|springboot水果商城含后台管理系统源码
- SpringMVC|毕设|基于SSM+jsp+echarts的疫情地图系统系统(已经开源)
- mysql数据库|MySQL Like模糊查询速度太慢如何进行优化
- 如何在C/C++,Python和Java中分割字符串()
- Java|计算机专业Java必读书单,高清PDF电子版下载
- Career|Java学习方法的一点个人见解-完整版
- 项目实践|【Java实战项目】图书管理系统(基于数据库)