最近因为项目国产化需要,需要将Mysql数据库适配到金仓数据库中,就此给大家分享一下我的采坑过程。如有错误。恳请指正!
一、资源准备
- 官网地址 人大金仓-成为世界卓越的数据库产品与服务提供商
- 金仓社区 金仓社区-数据库使用者、DBA开发人员、数据化经营者已入驻
-
安装包、证书资源下载地址
- 人大金仓-成为世界卓越的数据库产品与服务提供商
- 安装包根据需要下载。授权文件一定要记得下载不然无法安装(90天试用好像)。接口驱动下载第一个就好了。技术文档建议下全部的。金仓的技术文档还是很全的!
- 开发资料
- 以下是我下载的资料(PDF-全部文档)
- 迁移资料详解
- jdbc-x86.zip 驱动,相当于JDBC驱动
- 主要关注1、2里面的文档
- 安装后得到的工具库 第一个:集群部署工具 第二个:迁移工具 第三个: 开发工具(相当于Navicat)
- 其他资源收集
- SQL语法转化(SQL迁移利器) http://59.108.228.18:8022/migrate/tools
- 社区问答 金仓话题-金仓社区
二、数据库安装
好啦,资源已经准备好了。现在开始安装。具体安装过程本文并不体现。只附上安装教程和注意事项。
- Linux安装
- 前置要求:磁盘一定要够,不然安装不上去。笔者本来用虚拟机因为内存不够转到服务器安装了。
- 安装教程:KingbaseES 命令行安装数据库 - 技术干货 - 金仓社区
- Window安装
- 安装教程: KingbaseES iso安装包安装指导说明 - 技术干货 - 金仓社区 基本傻瓜式操作,一步步按需要安装就可以了
-
安装注意事项
- 磁盘空间一定要够
- 如果是Mysql迁移,推荐安装选择Oracle模式并且忽略大小写。同Mysql一致
三、开始迁移
-
环境准备
- 打开Navicat,准备源数据库,例如 db: test username: root password: mysql
- 打开 KStudio.exe,创建目标数据库,例如 db: test username:root password: mysql
- 这边需要保证迁移两边的库 数据库名、用户密码均同名(官方建议)
-
迁移流程
- 打开迁移工具,windows:bat linux:.sh(local host:8080)
- 新建源数据库
- 新建目标数据库(KES兼容模式如果不是Oracle数据库迁移两个好像都可以随便选,我这里都试过。最后选的是PG)
- 新建迁移任务(默认配置就好,我在线程配置中开启了多线程,大概是迁移的时候会更快一点吧)
- 迁移完成(我在迁移过程中没有遇到问题,大概迁移了10多分钟)
-
修改迁移后的模式
- 迁移完成后查看库会发现多了个模式,我们可以将这个模式修改为public模式,到时候查询数据库的时候就能直接通过 select * from 表名 查询数据,否则就是 select * from public.表名
- 将public修改为其他名称
- 再将新的模式修改为public
-
代码集成
- 更换驱动为kingbase8-8.6.0.jar(通过内部引入jar包的方式)
- 修改配置
- 数据源
spring: datasource: driver-class-name: ***.kingbase8.Driver type: ***.alibaba.druid.pool.DruidDataSource url: jdbc:kingbase8://127.0.0.1:54321/phjygf?clientEncoding=UTF-8 username: balabala password: balabala
- mybatis-plus
@SpringBootConfiguration public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor config = new MybatisPlusInterceptor(); config.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL)); return config; } }
- pagehelper
pagehelper: # 方言 pg or oricle helper-dialect: postgresql
到此配置完成,如果可以正常启动,那么接下来就可以做代码层面的适配了.如果遇到相关问题,建议查看下载下来的文档信息
- 数据源
-
迁移注意事项
- 如果迁移之前需要进行迁移评估,转到 http://59.108.228.18:8022/dashboard?source=bbs&token=eyJhbGciOiJIUzUxMiJ9.eyJpZCI6Mzg3NywiZW1haWwiOiIyOTkzNDQyNzUwQHFxLmNvbSIsInN1YiI6ImxkYiIsImlhdCI6MTY4MTgyMzUyNiwiZXhwIjoxNjgxODMwNzI2fQ.nii_qz***O64emEOxRV4aODFleEV5ff4BFXJejcaufE_RfqVzjYYzz1fcKYUBGa_fhR94pZiQQX19E8pEp8PDTQ
- 如果不熟悉相关流程,详情见官方迁移文档
- 迁移后的模式强烈建议修改为public模式
- 驱动和方言配置都需要修改
四、代码层面适配遇到的相关问题及其解决方案
-
date_format函数无效
- 原因:不支持该函数
- 解决方案: 更换函数 date_format -> to_char
- Group by 分组中的字段在查询字段中也需要存在
-
CONNECT BY clause required in this query block
-
原因:查询字段有关键字
-
解决方案:在关键字字段上加上""
-
-
将Mysql中的`符号更换为"
-
违反约束错误:修改约束或者业务逻辑
-
year函数报错
-
原因:不支持该函数
-
解决方案:year(class_times.date)转换为->EXTRACT(YEAR FROM class_times.date)
-
-
操作符不是唯一的: varchar >= pg_catalog.date
-
原因:类型不一致
-
解决方案:转成相同类型的值然后再进行比较 to_char、to_date详情SQL文档
-
-
Hint: 没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换.
-
原因: 不支持该函数
-
解决方案:更换函数或在业务层实现该功能
-
-
函数 FIND_IN_SET(unknown, varchar) 不存在
-
原因: 不支持该函数
-
解决方案:更换函数或在业务层实现该功能
-
-
IFNULL -》COALESCE(p.valid,0)
-
GROUP_CONCAT -》array_to_string(array_agg(t.***ame),',')
好啦,今天的分享就到这了,希望能帮到需要迁移的小伙伴~