MYSQL数据库迁移KingBase人大金仓数据库一篇文章全搞定(附所遇问题即解决方案)

目录

概要

安装人大金仓数据库

KINGBASE数据库迁移工具

KingBase集成SpringBoot

问题总结,埋坑填坑

问题一:Activiti兼容问题

问题二:sysDate() 函数问题

问题三:“” 字符串双引号兼容问题

问题四:group by聚合函数使用问题

更改kingbase配置文件,解决语法问题

总结

概要

应公司要求需要把原先使用的Mysql数据库迁移到KingBase人大金仓数据库中,其中需要注意的是数据格式以及数据兼容性问题,mysql和kingbase数据库中的sql差异,可以在这个链接中查看mysql和kingbase之间的语法区别:点击这里,然后废话不多说开始进行数据库安装迁移操作

安装人大金仓数据库

到这个地址安装人大金仓数据库注意选择版本 点击下载

下载完数据库后下载授权文件,待会要用到

下载完成将数据库以及授权文件全部拉到Linux服务器下

之后创建用户,专用来操作KingBase相关的任务

useradd -m kingbase

设置kingbase的登陆密码

passwd kingbase

创建数据库安装目录,并赋予权限

mkdir -p /opt/Kingbase/ES/V8

chown -R kingbase:kingbase /opt/Kingbase/ES/V8

之后就可以进行KingBase的挂载了

mount KingbaseES_V008R006C008B0014_Lin64_install.iso /opt/Kingbase/ES/V8/
输入这个命令将iso文件挂载到V8目录下,然后切换到kingbase用户下进行数据库安装

su - kingbase
cd /opt/Kingbase/ES/V8/
./setup.sh -i console # 执行安装脚本,命令行安装

出现这个页面然后可以一路回车 直到出现 完全安装 的选项,选择完全安装 --> 选择授权文件 --> 选择安装目录 --> 等待安装 --> 选择数据存储路径 --> 设置初始化参数

其中选择授权文件就是咱们开始时往opt目录下放的授权文件,我们这个时候新打开一个窗口将这个授权文件解压一下然后放到自己指定的一个目录里

这里我将这个文件放在了 /opt/license/license_39893目录里 /opt/license/license_39893/license_39893_0.dat

在这一步可以直接按照缺省文件夹安装,如果回车出现只可读不可写的权限问题,可以新开一个页面重新创建一个文件夹然后重新赋权 然后选择新建的文件夹作为安装路径

之后可以一路回车安装完成 然后切换为root用户输入指令,注册为系统服务

/opt/KingbaseES/V8/install/script/root.sh

之后我们可以连接下数据库看是否可以连接成功首先进入安装目录

cd /opt/KingbaseES/V8/Server/bin

使用软连接方便连接数据库

ln -s /opt/KingbaseES/V8/Server/bin/ksql /usr/bin/ksql

使用命令连接数据库

ksql -p 54321 -U system test

我们也可以使用数据库可视化工具连接服务器数据库

输入自己的服务器的ip 默认端口测试链接出现上面画面即连接成功,这时候我们的迁移目标数据库已经安装完毕,接下来可以进行数据库迁移。

KINGBASE数据库迁移工具

人大金仓数据库提供给我们有数据库迁移工具,在将数据库安装完毕后也附带安装了数据库的可视化迁移工具,我们只需要启动迁移工具在可视化界面上添加一些配置即可进行迁移。

启动前需要了解到,人大金仓数据库迁移工具需要适配JDK,并且目前只可以适配JDK11版本或以上,所以启动前需要先检查一下自己的jdk

java --version

javac --version

因为我没是新安装的linux所以还没下载jdk,如果已经有了jdk需要先删除掉 然后在安装

下载jdk11 压缩包然后放在linux文件夹中,进行解压然后配置环境变量

卸载原先jdk以及安装新的jdk可以参考这篇文章:点击这里

安装完成后输入指令检查是否安装成功出现下图样式即说明安装成功

接下来我们需要进入数据库迁移工具软件的目录下

cd /opt/KingbaseES/V8/ClientTools/guitools/KDts/KDTS-WEB

然后将咱们新安装的jdk 拷贝到这个目录下然后进行替换

cp -r /usr/local/jdk-11.0.2/ /opt/KingbaseES/V8/ClientTools/guitools/KDts/KDTS-WEB

-- 将原先的jdk包先拷贝更名以防万一

mv jdk jdk-bak

将拷贝过来的jdk-11 更名为jdk

 mv jdk-11.0.2 jdk

之后进入bin目录 进行启动

./startup.sh

启动后会出现上面这个提示 这个时候我们可以输入我红框标出来的 tail -f语句 来看一下启动情况

出现这一行及说明启动成功,这个时候我们可以输入这个地址,端口是54523来查看迁移工具可视化界面

出现这个页面即为启动成功接下来我们可以进行迁移

首先我们点击数据库管理来配置源数据库和迁移数据库的信息

输入源数据库的ip 端口,用户名密码后可以点击测试来测试连接,如测试成功说明源数据库就配置成功了

同样配置好迁移目标数据库则可以进行数据迁移,点击迁移任务管理,点击新建,选择源数据库和迁移数据库点击下一步

这个时候我们会看到源数据库中的数据库信息,我们选择要迁移的库进行迁移,目标属主选择system表示当前用户即可进行下一步

内部一些参数如果没有适配原因暂时不需要更改,直接点击保存并迁移

保存后 我们可以在任务列表中看到我们的迁移过程,迁移进度

这个时候发现迁移失败了,可以点进去看以下错误日志,看是什么原因导致的

错误日志显示我的yf_user_info表中 貌似因为自增的列出现了问题,这个时候我们可以去源数据库中查看这张表中的自增列数据是否有问题

这里可以看到我的这张表有一个自增列,并且这个列是主键,遇到这个问题,属于兼容问题,这是kingbase的一个坑,凡是和auto_increment相关的异常报错的,都是kingbase版本问题 ,我联系到kingbase运维人员后,运维人员告知,有自增相关键的都要安装V80020或以上版本的数据库,

我这里安装的是V814的所以出现这个问题,通过手动操作也可以解决,或者直接安装我上面所说的指定版本数据库都可以,手动解决的话就是在原先的mysq数据库中将对应的出现问题表的自增建先取消掉,然后在迁移数据,迁移数据成功后在重新加上自增索引,并指定自增位置,另外在迁移工具中配置版本时不管是V820版本或是V9版本都需要将版本号这一栏选择为V9

我这里作为演示就不重装kingbase数据库了,暂时用去掉自增建的方式迁移数据,建议看这篇文章的小伙伴安装指定的kingbase数据库

去掉这个表的自增然后重新启动迁移任务

这时候发现数据已经迁移成功然后到kingbase数据库查看表是否存在

发现数据没问题,说明迁移成功,然后执行下面的sql为id加上自增

CREATE SEQUENCE table_seq START WITH 1 INCREMENT BY "起始主键位置";

alter table "表名" alter column "主键名" set default nextval('table_seq')

到这一步迁移就算成功了,接下来我们吧kingbase集成到springBoot项目中去

KingBase集成SpringBoot

原先的项目是springboot+mysql+mybatis,我们只需要将mysql换成kingbase,依赖和配置相关的改一改,下面实际操作

首先到这个地址下载对应的jar包依赖:下载jar包

然后在项目中新建libs文件夹,将下载的这几个jar包放在文件夹

然后到pom上注释掉原先的mysql依赖,将我们新加上的jar包引用上

  <!-- MySQL Connector/J -->
<!--        <dependency>-->
<!--            <groupId>mysql</groupId>-->
<!--            <artifactId>mysql-connector-java</artifactId>-->
<!--            <version>8.0.28</version>-->
<!--        </dependency>-->

        <!--添加KingBase所需要的依赖-->
        <dependency>
            <groupId>com.kingbase</groupId>
            <artifactId>kingbase8</artifactId>
            <version>8.2.0</version>
            <scope>system</scope>
            <systemPath>${pom.basedir}/libs/kingbase8-8.6.0.jar</systemPath>
        </dependency>

依赖引用上之后,我们就可以,将配置文件中原先集成mysql的配置文件改成kingbase

# 数据源配置
spring:
    datasource:
        driverClassName: com.kingbase8.Driver
        url: jdbc:kingbase8://192.168.253.175:54321/test?currentSchema=yfdb
        username: system
        password: root
        type: com.zaxxer.hikari.HikariDataSource
        hikari:
            minimum-idle: 5
            maximum-pool-size: 15
            auto-commit: true
            idle-timeout: 30000
            pool-name: DatebookHikariCP
            max-lifetime: 1800000
            connection-test-query: SELECT 1 FROM DUAL

配置完成之后则可以进行启动测试,启动项目看是否会有问题,正常情况来讲配置好这个位置之后是可以正常启动项目的。        

项目启动成功,说明数据库兼容没有问题,接下来可以测试下业务功能

使用postman执行了一个新增操作报错自增键已存在问题,这里可能是因为赋值的时候忽略了已经存在的id参数,到数据库更新一下自增建起始位置

执行上面这两个sql重新赋值,然后再次调用接口发现成功新增

这个时候可以看一下是否数据已经新增到kingbase数据库

数据新增成功说明没问题,到这里测试结束,后面总结一些遇到的问题,坑之类的

问题总结,埋坑填坑

问题一:Activiti兼容问题

首先,因为KingBase是国产数据库,所以针对国外的一些中间件可能会有兼容性问题,比如我有一个项目用到了流程引擎,Activiti6这个流程引擎,这里就对Activiti不兼容,解决方案找了很多,最终找到人大金仓维护人员提供了解决方案,首先可以先看一下金仓的官方文档:官方解决文档

解决方案其实很简单,将配置文件中的连接更换成我们libs目录下的postgresql即可,官方运维人员解释pg形态的包集成了这些环境,所以如果项目中包含了Activiti流程引擎,可以将依赖和连接替换成下面这种样式即可以成功兼容Activiti

pom依赖换成这个:

  <!--添加KingBase所需要的依赖-->
        <dependency>
            <groupId>com.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.9</version>
            <scope>system</scope>
            <systemPath>${pom.basedir}/libs/postgresql-42.2.9.jar</systemPath>
        </dependency>

数据库连接文件改成这样的:

# 数据源配置
spring:
    datasource:
        driverClassName: org.postgresql.Driver
        url: jdbc:postgresql://192.168.253.180:54321/test?currentSchema=yfdb,productName=PostgreSQL,SYS_CATALOG,PUBLIC
        username: system
        password: 123456
        type: com.zaxxer.hikari.HikariDataSource
        hikari:
            minimum-idle: 5
            maximum-pool-size: 15
            auto-commit: true
            idle-timeout: 30000
            pool-name: DatebookHikariCP
            max-lifetime: 1800000
            connection-test-query: SELECT 1 FROM DUAL


之后可以重新启动项目就可以集成Activiti了

问题二:sysDate() 函数问题

mysql和Oracle中的当前时间函数 sysDate() 也就是获取当前时间年月日的值的方法,在Kingbase中写法是不一样的,所以在sql中如果要兼容,就是改成kingbase兼容的格式:sysdate,金仓数据库中的这个函数没有括号直接就是:sysdate。

问题三:“” 字符串双引号兼容问题

在kingbase数据库中查询字符串类型数据时用的是‘’单引号来查询,而在mysql和Oracle中用的是双引号,所以如果项目中需要将“”双引号更换为‘’单引号来进行适配,另外还有一种方法,后面来讲解。

问题四:group by聚合函数使用问题

在mysql中group by作为根据某个字段分组展示这样的一个函数,但是在kingbase的使用中group by不可以在普通的查询语句中使用类似这样:

如果要保证可以使用需要在查询字段中只保留作为分组的那个字段类似这样:

但是我们在sql中往往不会这样更改,所以可以用第二种解决方案,这个解决方案需要更改kingbase数据库的配置文件,更改后可以解决单双引号问题,以及group by使用问题

更改kingbase配置文件,解决语法问题

首先去我们的安装目录找到kingbase配置文件 kingbase.conf

配置文件在:

/opt/KingbaseES/V8/data

在这个文件的最后加上

sql_mode=''

保存后输入指令重启kingbase服务让配置生效

systemctl restart kingbase

之后我们可以在数据库中测试一下更改之后的运行结果

发现已经可以执行,说明已经可以正常使用group by语法了!

总结

经过上面这些步骤基本可以保障数据库的安装和迁移,以及集成spring项目,数据库是所有项目的核心所在,是最关键,最重要的,一切基础都是建立在数据库之上,人大金仓数据库日益壮大,吧项目部署在这样优秀的数据库上更安心,更放心,上面总结的问题只是我在迁移适配过程中遇到的,如果小伙伴有遇到其他问题可以留言评论区,我也会更新新的问题供大家参考,如果觉得这篇文章帮到了您,点个收藏,点个关注,持续更新更多优秀文章帮助小伙伴们,感谢!!

### 人大金仓数据库迁移MySQL的方法和工具 #### 使用KDMS反向操作实现数据迁移 对于从人大金仓(Kingbase)迁移MySQL的操作,虽然官方文档主要描述了从其他数据库MySQL迁移人大金仓的过程[^2],但是可以考虑采用逆向思维的方式利用这些工具。具体来说,如果之前是从MySQL迁入人大金仓使用的工具是KDMS,则理论上可以通过调整配置文件来尝试做相反方向的数据转移。 然而需要注意的是,由于两个系统的结构差异以及可能存在的版本兼容性问题,在实际执行前需仔细评估并测试整个流程以确保不会丢失重要信息或破坏现有业务逻辑。 #### 手动导出导入方案 另一种更为直接但也更耗时的选择是通过手动方式完成这项工作: 1. **备份表定义** - 在源端即人大金仓中运行`pg_dump --schema-only`命令获取所有表格的DDL语句; 2. **转换SQL语法** - 对上述得到的结果进行必要的修改使其适应目标平台MySQL的要求;这一步骤涉及到不同厂商之间特有的扩展特性的处理,比如存储过程、触发器等复杂对象需要特别注意其对应关系; 3. **清理旧有记录** - 清空目的地上已有的同名实体以防冲突发生; 4. **传输静态资料** - 利用诸如mysqldump之类的实用程序把原始内容打包成纯文本形式再加载进来即可。 以上两种途径各有优劣之处,前者依赖于特定软件的支持程度而后者则更加灵活可控不过效率较低下。 ```sql -- 示例:导出人大金仓中的表结构 pg_dump --host=localhost --port=54321 --username="kingbase_user" \ --format=p --encoding=UTF8 --no-owner --schema-only \ dbname > schema.sql; ``` ```bash # 示例:将生成好的SQL脚本应用于MySQL服务器 mysql -u root -p target_db < converted_schema.sql ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rocky甄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值