springboot 从mysql 迁移人大金仓 -kingbase
命令带密码参考Java代码实现国产人大金仓数据库备份还原需求-CSDN博客本人在一次项目中,遇到了需要在系统管理中提供给用户备份还原系统数据的功能,由于项目特殊性,项目底层数据库使用了国产人大金仓数据库(版本V8)。由于本人也是第一次使用金仓数据库,所以在功能实现过程中,踩到了一些坑,特此记录一下,共大家参考,避免踩到和我一样的坑。,可以 using 方法::转换类型,例如 USING null:
一、配置方法修改
1、添加maven依赖
<!-- 人大金仓 -->
<dependency>
<groupId>cn.com.kingbase</groupId>
<artifactId>kingbase8</artifactId>
<version>8.6.0</version>
</dependency>
2、连接配置,修改 .yml 文件
# spring
spring:
# datasource
datasource:
driver-class-name: com.kingbase8.Driver
url: jdbc:kingbase8://IP:54321/数据库
username: 账号
password: 密码
3、mybatis-plus,修改 .yml 文件
添加人大金仓的单独的 mapper xml位置 :mapper-locations
列格式 column-format ,这个不用数据库关键字,理论不用加;就是库表设计不合理;
postgreSql
# mybatis-plus
mybatis-plus:
# log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath*:mapper-kingbase/**/*Mapper.xml
#开启驼峰命名
configuration:
map-underscore-to-camel-case: true
jdbc-type-for-null: 'null'
global-config:
banner: false
db-config:
logic-delete-field: DELETE_FLAG
logic-delete-value: 1
logic-not-delete-value: 0
column-format: "\"%s\""
mysql
# mybatis-plus
mybatis-plus:
# log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath:mapper/**.xml
#开启驼峰命名
configuration:
map-underscore-to-camel-case: true
jdbc-type-for-null: 'null'
global-config:
banner: false
db-config:
logic-delete-field: DELETE_FLAG
logic-delete-value: 1
logic-not-delete-value: 0
column-format: "`%s`"
二、功能方面的修改
1、因为pgsql是强类型,所以
1)类型必须匹配
数据库是varchar ,则sql语句传递类型就是String
数据库是boolean,则sql语句传递类型就是Boolean
数据库是integer,则sql语句传递类型就是Integer
数据库是bigint,则sql语句传递类型就是Long
数据库是timestamp(6),则sql语句传递类型就是LocalDateTime
数据库是date,则sql语句传递类型就是LocalDate
2)mybatis xml 微调
尽量用 #{},${参数} 得根据类型确认是否加单引号;
3)数据库关键字不要加反引号 “`”;
三、使用相应类型的数据库函数
人大进程默认兼容模式有:oracle、pg、mysql 根据实际情况修改
注意分页语句差异,为了保证各数据库兼容性,这个关联查询全去掉 xml的分页参数,改为注入mybatis-plus的分页参数;
# 方案一:page 参数通过实体封装一个 HttpServletRequest 自动构造方法,核心就是自动构造page参数
Page<T> page = new Page<>(current, size);
if (ObjectUtil.isNotEmpty(orderItemList)) {
page.setOrders(orderItemList);
}
# 那样xml就不用写分页参数了(下面的T不限制类型),但是需要加 param.属性
Page<实体Dto> getListByParam(Page<T> page, @Param(" param.属性") 参数Paran 参数Param);
# 方案二(未采用):为了xml少写 param.属性 ,可以所有查询参数集成自分页参数
# 那样实体代码得很规范,records、total、size、current、orders、optimizeCountSql
# 、searchCount、optimizeJoinOfCountSql ,这边做不到,所以未采用
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
public class UserPage extends Page<User> {
private String name;
// getters and setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
postgresql的分页查询
select * from tab limit ${pageSize} offset ${startRow}
四、假设数据类型不一致
采用 USING column::转换后类型;,可以 using 方法::转换类型,例如 USING null::转换后类型;
ALTER TABLE tableName ALTER COLUMN column TYPE BIGINT USING column::BIGINT;
五、数据迁移:
用数据库迁移工具,从mysql迁移至kingbase,date 会转成pgsql中的date;但mysql datetime 会转成pgsql 中的timestamp(对应java中的LocalDateTime),只有部分类型存在问题,详见下面介绍
1、迁移工具配置
1)迁移目标模式选择 public,代码和配置不用做太多改动;
2)数据类型配置
我们这边tinyint,仅为tinyint(1) ,做boolean类型,所以配置迁移工具:tinyint 对应 kingbase中的 boolean;
数据库这边配置存储图片用的TINYBLOB、LONGBLOB、MEDIUMBLOB、blob,需要配置迁移工具转换类型对应bytea
bytea
可以存储最大 1 GB 的数据,bytea
的兼容性更高,可以避免修改大量的代码
注:如果你类型设置错误,需要删除迁移任务,关闭迁移工具的控制台,再次新建任务;
2、内置工具
后期规范了数据库:这边mysql 数据库用utf8mb4,导出sql语句不存在别的类型:这样直接迁移数据也不会中文乱码,迁移失败的只有索引的注释;
点击:然后访问 http://localhost:54523 或 https://localhost:54524http://localhost:54523 或
2、navicat 的数据传输
如果您的数据库存在非utf8mb4 编码的类型,可能导致能迁移数据库和自增索引,迁移数据、很大概率报错,表注释乱码你可以导出sql批量删除一下编码定义,然后新建一个utf8mb4的数据库再导入mysql;
或者借助navicat, 能迁移 库表、数据和注释,迁移索引会报错,不能迁移自增索引;
所以这边综合:用 内置迁移工具迁移表结构(含自增索引,然后用navicat 迁移数据和注释
注:注释中的列明大写,要改成小写
六、原备份功能不可用,切换备份逻辑
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)