Dbswitch适配GaussDB开源开发任务总结
背景
Dbswitch是一个提供源端数据库向目的端数据库的离线批量迁移同步功能,支持数据的全量和增量方式同步。在项目中看到有人贡献了opengauss的代码,支持opengauss与个各种数据库之间的数据迁移。opgengauss和GaussDB是孪生兄弟,内部特性有很大的趋同,所以借此来适配一下GaussDB数据库,给大家在使用Dbswitch做GaussDB相关数据迁移的时候提供一个参考。
Demo设计
根据计划书可知需要dbswitch适配GaussDB, dbswitch-admin需要支持GaussDB,数据同步迁移需要采用配置文件和web页面两种方式验证GaussDB迁移。根据计划书内容简易的Demo设计如下:
开发过程
1. 从dbswitch官方仓库fork代码
2. 修改dbswitch-admin中代码
a) 在dbswitch中添加全局版本号
<opengauss.version>5.1.0-og</opengauss.version> <pagehelper.version>1.4.7</pagehelper.version> |
b) 在dbswitch-admin/pom.xml添加依赖
<dependency> <groupId>org.opengauss</groupId> <artifactId>opengauss-jdbc</artifactId> <version>${opengauss.version}</version> </dependency> |
c) 修改pagehelper版本
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>${pagehelper.version}</version> </dependency> |
d) 添加dbswitch-admin/application-opengauss.yml示例配置
spring: datasource: driver-class-name: org.opengauss.Driver url: jdbc:opengauss://127.0.0.1:8000/dbswitch?currentSchema=public username: root password: 123456 validation-query: SELECT 1 test-on-borrow: true flyway: locations: classpath:db/postgres baseline-on-migrate: true table: dbswitch_schema_history enabled: true |
适配过程
GaussDB适配有关驱动:
(1)使用原生postgre驱动;
(2)使用GaussDB官网驱动gsjdbc4.jar替换原生postgre驱动验证;
(3)使用原生OpenGauss驱动;
(4)使用GaussDB官网驱动opengaussjdbc.jar替换原生OpenGauss驱动验证;
过程
dbswitch-admin模块支持mysql,postgresql和opengauss。我们加入GaussDB去做验证。这个模块里面涉及启动脚本初始化,脚本地址:https://gitee.com/dromara/dbswitch/tree/master/dbswitch-admin/src/main/resources/db/postgres
验证过程如下:
1. 使用原生postgres驱动
驱动版本:
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.18</version> </dependency> |
运行结果:报错
问题分析:
org.postgresql.util.PSQLException:Invalid or unsupported by client SCRAM mechanisms |
• 跟踪驱动代码
得出结果:Postgresql使用SCRAM机制进行用户名+密码认证
• 查看Postgresql和GaussDB的默认加密类型
Postgresql:https://www.postgresql.org/docs/12/encryption-options.html
GaussDB:
结论
通过上面的代码追踪和数据库查看可以知道PostgreSQL在10版本之后使用的是SCRAM/SASL的连接认证方式,GaussDB使用的是sha-256的认证方式,两者的认证方式不一样。默认不可用PostgreSqL驱动连接GaussDB。
2. 使用GaussDB官网驱动gsjdbc4.jar替换原生postgre驱动验证
驱动版本:gsjdbc4.jar
驱动地址:https://dbs-download.obs.cn-north-1.myhuaweicloud.com/GaussDB/1716950374370/GaussDB_driver.zip
验证过程:
1) 下载官方驱动使用mvn install:install-file 打到本地仓库
2) 在pom中引用
3) 启动项目验证,结果如下
总结:官方驱动使用org.postgres.Driver驱动名称可以连接GaussDB.
注意点:gsjdbc4.jar和postgresql官方驱动的驱动名称都是<org.postgres.Driver>,如果在项目中同时引用,驱动默认引用的是postgres驱动包下的驱动类。
3. 使用原生OpenGauss驱动
驱动:
<dependency> <groupId>org.opengauss</groupId> <artifactId>opengauss-jdbc</artifactId> <version>5.1.0-og</version> </dependency> |
过程:
1) 清除上一步创建的表
2) 引入opengauss驱动
3) 修改驱动类为org.opengauss.Driver
4) 验证结果
总结:opengauss驱动可以适配GaussDB
4. 使用GaussDB官网驱动opengaussjdbc.jar替换原生OpenGauss驱动验证
驱动版本:opengaussjdbc.jar
驱动地址:https://dbs-download.obs.cn-north-1.myhuaweicloud.com/GaussDB/1716950374370/GaussDB_driver.zip
验证过程:
1) 清除上一步生成的表
2) 下载官方驱动使用mvn install:install-file 打到本地仓库
3) 在pom中引用opengaussjdbc.jar
4) 启动项目验证
总结:opengauss驱动可以适配GaussDB
遇到的坑
1. 脚本初始化失败
分析:插入的初始化数据address字段不能为null
查看原始表sql:
查看GaussDB生成的表:
可以看出原来的表和生成的表默认值不一样,原始的表默认是空字符,生成的默认是null。为什么呢?
最终在官网查到是如下内容:
https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-1825.html
原来是和兼容模式有关,所以在建库的时候要选择兼容的模式:
例如:
CREATE DATABASE <your-database> DBCOMPATIBILITY 'PG'; |
2. 分页报错
点击分页查询相关的页面,提示如下报错
分析:和分页插件Pagehelper有关,debug看看代码
缺少dialectClass。通过https://cloud.tencent.com/developer/article/2229619 了解到前人踩坑过程,是Pagehelper插件的问题,针对dialect的处理机制:默认它会通过配置的连接串用mysql去识别,换了连接串后,需要通过配置文件指定mysql。 配置文件的参数,有横线和驼峰的区别(1.4.4版本之前,有bug,只能识别驼峰式的配置)。我这里处理直接升级pageehelper版本到1.4.7后解决此问题。
适配验证过程
1. 验证思路
1) 基于conf/config.yml配置的dbswitch-data模块启动
dbswitch-data打包部署到华为云CCE,配置conf,只执行一次,查看数据验证。
2) 基于conf/application.yml配置的dbswitch-admin模块启动
dbswitch-admin打包部署到华为云CCE上,暴露端口访问。在页面上面完成数据源配置做验证。
3) 脚本
Mysql脚本
PostgreSQL脚本
2. 基于conf/config.yml配置的dbswitch-data模块
a) 配置数据源
b) 查看运行日志
c) 查看数据库
3. 基于conf/application.yml配置的dbswitch-admin模块
a) 修改配置启动dbswitch-admin
修改application.yml的spring.Profiles.include为opengauss
配置application-opengauss.yml的jdbc连接信息
执行bin路径下的startup.sh启动项目
b) 登录页面配置数据源
配置Mysql
配置Postgresql
配置GaussDB兼容mysql和PG的数据源
最终数据源
c) 查看数据同步
Mysql -> GaussDB
数据同步成功
Postgresql -> GaussDB
4) 系统日志
- 点赞
- 收藏
- 关注作者
评论(0)