最近因为项目国产化需要,需要将Mysql数据库适配到金仓数据库中,就此给大家分享一下我的采坑过程。如有错误。恳请指正!

一、资源准备

  1. 官网地址 人大金仓-成为世界卓越的数据库产品与服务提供商
  2. 金仓社区 金仓社区-数据库使用者、DBA开发人员、数据化经营者已入驻
  3. 安装包、证书资源下载地址
  1. 人大金仓-成为世界卓越的数据库产品与服务提供商
  2. 安装包根据需要下载。授权文件一定要记得下载不然无法安装(90天试用好像)。接口驱动下载第一个就好了。技术文档建议下全部的。金仓的技术文档还是很全的!
  1. 开发资料
  1. 以下是我下载的资料(PDF-全部文档)
  1. 迁移资料详解
  1. jdbc-x86.zip 驱动,相当于JDBC驱动
  2. 主要关注1、2里面的文档
  3. 安装后得到的工具库 第一个:集群部署工具 第二个:迁移工具  第三个: 开发工具(相当于Navicat)
  1. 其他资源收集
  1. SQL语法转化(SQL迁移利器) http://59.108.228.18:8022/migrate/tools
  2. 社区问答 金仓话题-金仓社区

二、数据库安装

 好啦,资源已经准备好了。现在开始安装。具体安装过程本文并不体现。只附上安装教程和注意事项。

  1. Linux安装
  1. 前置要求:磁盘一定要够,不然安装不上去。笔者本来用虚拟机因为内存不够转到服务器安装了。
  2. 安装教程:KingbaseES 命令行安装数据库 - 技术干货 - 金仓社区
  1. Window安装
  1. 安装教程: KingbaseES iso安装包安装指导说明 - 技术干货 - 金仓社区 基本傻瓜式操作,一步步按需要安装就可以了
  1. 安装注意事项
  1. 磁盘空间一定要够
  2. 如果是Mysql迁移,推荐安装选择Oracle模式并且忽略大小写。同Mysql一致

三、开始迁移

  1. 环境准备
  1. 打开Navicat,准备源数据库,例如 db: test username: root password: mysql
  2. 打开 KStudio.exe,创建目标数据库,例如 db: test username:root password: mysql
  3. 这边需要保证迁移两边的库 数据库名、用户密码均同名(官方建议)
  1. 迁移流程
  1. 打开迁移工具,windows:bat linux:.sh(local host:8080)
  2. 新建源数据库
  3. 新建目标数据库(KES兼容模式如果不是Oracle数据库迁移两个好像都可以随便选,我这里都试过。最后选的是PG)
  4. 新建迁移任务(默认配置就好,我在线程配置中开启了多线程,大概是迁移的时候会更快一点吧)
  5. 迁移完成(我在迁移过程中没有遇到问题,大概迁移了10多分钟)
  6. 修改迁移后的模式
  1. 迁移完成后查看库会发现多了个模式,我们可以将这个模式修改为public模式,到时候查询数据库的时候就能直接通过 select * from 表名 查询数据,否则就是 select * from public.表名
  2. 将public修改为其他名称
  3. 再将新的模式修改为public
  1. 代码集成
  1. 更换驱动为kingbase8-8.6.0.jar(通过内部引入jar包的方式)
  2. 修改配置
  1. 数据源
spring:
  datasource:
    driver-class-name: com.kingbase8.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:kingbase8://127.0.0.1:54321/phjygf?clientEncoding=UTF-8
    username: balabala
    password: balabala
  1. mybatis-plus
@SpringBootConfiguration
public class MyBatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor config = new MybatisPlusInterceptor();
        config.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL));
        return config;
    }

}
  1. pagehelper
pagehelper:
  #  方言 pg or oricle
  helper-dialect: postgresql

到此配置完成,如果可以正常启动,那么接下来就可以做代码层面的适配了.如果遇到相关问题,建议查看下载下来的文档信息

  1. 迁移注意事项
  1. 如果迁移之前需要进行迁移评估,转到 http://59.108.228.18:8022/dashboard?source=bbs&token=eyJhbGciOiJIUzUxMiJ9.eyJpZCI6Mzg3NywiZW1haWwiOiIyOTkzNDQyNzUwQHFxLmNvbSIsInN1YiI6ImxkYiIsImlhdCI6MTY4MTgyMzUyNiwiZXhwIjoxNjgxODMwNzI2fQ.nii_qzCCO64emEOxRV4aODFleEV5ff4BFXJejcaufE_RfqVzjYYzz1fcKYUBGa_fhR94pZiQQX19E8pEp8PDTQ
  2. 如果不熟悉相关流程,详情见官方迁移文档
  3. 迁移后的模式强烈建议修改为public模式
  4. 驱动和方言配置都需要修改

四、代码层面适配遇到的相关问题及其解决方案

  1. date_format函数无效
  1. 原因:不支持该函数
  2. 解决方案: 更换函数 date_format -> to_char
  1. Group by 分组中的字段在查询字段中也需要存在
  2. CONNECT BY clause required in this query block
  1. 原因:查询字段有关键字
  2. 解决方案:在关键字字段上加上""
  1. 将Mysql中的`符号更换为"
  2. 违反约束错误:修改约束或者业务逻辑
  3. year函数报错
  1. 原因:不支持该函数
  2. 解决方案:year(class_times.date)转换为->EXTRACT(YEAR FROM class_times.date)
  1. 操作符不是唯一的: varchar >= pg_catalog.date
  1. 原因:类型不一致
  2. 解决方案:转成相同类型的值然后再进行比较 to_char、to_date详情SQL文档
  1. Hint: 没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换.
  1. 原因: 不支持该函数
  2. 解决方案:更换函数或在业务层实现该功能
  1. 函数 FIND_IN_SET(unknown, varchar) 不存在
  1. 原因: 不支持该函数
  2. 解决方案:更换函数或在业务层实现该功能
  1. IFNULL -》COALESCE(p.valid,0)
  2. GROUP_CONCAT -》array_to_string(array_agg(t.cname),',')

好啦,今天的分享就到这了,希望能帮到需要迁移的小伙伴~