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

一、资源准备

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

二、数据库安装

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

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

三、开始迁移

  1. 环境准备
    1. 打开Navicat,准备源数据库,例如 db: test username: root password: mysql
    2. 打开 KStudio.exe,创建目标数据库,例如 db: test username:root password: mysql
    3. 这边需要保证迁移两边的库 数据库名、用户密码均同名(官方建议)
  2. 迁移流程
    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
    7. 代码集成
      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
        2. mybatis-plus
          @SpringBootConfiguration
          public class MyBatisPlusConfig {
          
              @Bean
              public MybatisPlusInterceptor mybatisPlusInterceptor() {
                  MybatisPlusInterceptor config = new MybatisPlusInterceptor();
                  config.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL));
                  return config;
              }
          
          }
          

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

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

  3. 迁移注意事项
    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
  2. Group by 分组中的字段在查询字段中也需要存在
  3. CONNECT BY clause required in this query block

    1. 原因:查询字段有关键字

    2. 解决方案:在关键字字段上加上""

  4. 将Mysql中的`符号更换为"

  5. 违反约束错误:修改约束或者业务逻辑

  6. year函数报错

    1. 原因:不支持该函数

    2. 解决方案:year(class_times.date)转换为->EXTRACT(YEAR FROM class_times.date)

  7. 操作符不是唯一的: varchar >= pg_catalog.date

    1. 原因:类型不一致

    2. 解决方案:转成相同类型的值然后再进行比较 to_char、to_date详情SQL文档

  8. Hint: 没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换.

    1. 原因: 不支持该函数

    2. 解决方案:更换函数或在业务层实现该功能

  9. 函数 FIND_IN_SET(unknown, varchar) 不存在

    1. 原因: 不支持该函数

    2. 解决方案:更换函数或在业务层实现该功能

  10. IFNULL -》COALESCE(p.valid,0)

  11. GROUP_CONCAT -》array_to_string(array_agg(t.cname),',')

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

更多推荐