【数据库】KOCA迁移至高斯数据库记录

KOCA适配高斯数据库

简介

高斯数据库基于postgresql开发,在此基础上扩充了很多高可用的能力,并依据国内应用场景,设计开创落地实践许多方案

高斯数据库主要兼容postgresql语法,对mysql、oracle语法兼容并不完善

适配postgresql

sql脚本

建议在oracle脚本基础上转换

oracle中给字段设置check、加索引、加备注、加外键和postgresql语法基本一致,区别较小,可以减少很多工作量

1、字段类型转换

oracle - postgresql 基础字段转换表,此处仅本人修改字段:

oracle字段 postgresql
char char
nvarchar、nvarchar2 varchar
integer integer
datetime、date timestamp
number numeric 或 int4 或 int8 或 bigint 或 boolean
blob bytea
clob text

注:

  • 日期时间丢精度异常:

oracle中date可以存储日期和时间,postgresql中date只存日期,sql脚本、代码运行不会出现异常,存储的数据会从 “2022-6-15 15:17:32” 变成 “2022-6-15 00:00:00”,丢失时间

修复方式:将字段类型改为timestamp,mybatis中dao.xml对应jdbcType=DATE删掉

类型转换异常:postgresql在执行sql时,对字段类型敏感,部分类型不会进行自动转换,sql脚本跑通后,需程序运行,做进一步检测

异常示例1:

字段 a 类型 numeric(1,0) 
select * from test where a=true
异常信息:
操作符不存在: integer = boolean varying
Hint: 没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换.

将字段 a 类型修改为 boolean 即可

异常示例2:

字段 b 类型 varchar
select * from test where b=3
异常信息:
SQL 错误 [42883]: 错误: 操作符不存在: character varying = integer
Hint: 没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换.

修改字段 b 类型为 integer 可解决

或修改 sql 中传递的数据类型如下可解决
select * from test where b='3'

2、创建序列

例子

CREATE sequence SEQ_JOB_SCHEDULE_FLOW
	minvalue 1 
	MAXVALUE 99999999999 
	START WITH 1 
	increment BY 1 
	nocache;
	
转为

CREATE sequence SEQ_JOB_SCHEDULE_FLOW
minvalue 1 
MAXVALUE 99999999999 
START WITH 1 
increment BY 1;

3、自定义函数

示例

Oracle创建函数
CREATE OR REPLACE FUNCTION KOCA_CONCAT(str VARCHAR, str1 VARCHAR) RETURN VARCHAR
    IS
BEGIN
    return str || str1;
END;

转为

Postgresql创建函数
CREATE OR REPLACE FUNCTION KOCA_CONCAT(str VARCHAR default '', str1 VARCHAR default '') 
RETURNS VARCHAR as $$
BEGIN
    RETURN str || str1;
END;$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION KOCA_CONCAT(str VARCHAR default '', str1 int8 default 0) 
RETURNS VARCHAR as $$
BEGIN
    RETURN str || str1;
END;$$ LANGUAGE plpgsql;

注:

Postgresql自定义函数的参数,数据类型敏感,部分类型不会自动转换

Mybatis

1、对齐 koca-mybatis 中 Postgresql 定义

mybatis相关信息

@Bean
@ConditionalOnMissingBean(name = "databaseIdProvider")
VendorDatabaseIdProvider databaseIdProvider() {
  VendorDatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
  Properties properties = new Properties();
  properties.setProperty("Microsoft SQL Server", "mssql");
  properties.setProperty("Oracle", "oracle");
  properties.setProperty("MySQL", "mysql");
  //达梦数据库适配
  properties.setProperty("DM DBMS", "oracle");
  //PostgreSQL适配
  properties.setProperty("PostgreSQL","postgres");

  databaseIdProvider.setProperties(properties);
  return databaseIdProvider;
}

2、Dao.xml中增加对应databaseId=postgres代码块

示例:

<sql id="koca_stringAggregate" databaseId="postgres">
	(select array_to_string(array_agg(${FIELD}), ',') ${FROM})
</sql>

注:

Dao.xml中,jdbcType可能带来类型转换异常

示例1:Postgresql中无CLOB,执行异常
<result column="detail" property="detail" jdbcType="CLOB"/>

解决方法:
<result column="detail" property="detail"/>

示例2:字段类型为 integer ,jdbcType="VARCHAR",执行异常

解决方法:
jdbcType="INTEGER"

定时任务

增加Quartz配置

quartz:
  scheduler:
    instanceName: KOCAScheduler  #调度器实例名
    instanceId: AUTO    #实例ID 默认AUTO
  threadPool:
    class: org.quartz.simpl.SimpleThreadPool #使用ThreadPool的实现的名字,默认org.quartz.simpl.SimpleThreadPool
    threadCount: 10 #并行执行job可用的线程数,默认10
    threadPriority: 5 #线程优先级,1——10之间任意整数,默认为5.
  properties:
    org:
      quartz:
        jobStore:
          driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate #postgresql新增

适配高斯数据库

异常记录

1、高斯数据库不支持外键

GAUSS-04682: “FOREIGN KEY … REFERENCES constraint is not yet supported.”

SQLSTATE: 0A000

错误原因:特性不支持。

解决办法:不建议使用。

https://support.huaweicloud.com/errorcode-dws/dws_08_0517.html

2、创建 unique 失败:

alter table ACT_RE_PROCDEF add constraint ACT_UNIQ_PROCDEF unique (KEY_,VERSION_, DERIVED_VERSION_, TENANT_ID_);

异常信息:

ERROR:Cannot create index whose evaluation cannot be enforced to remote nodes

解决方法:建表时,设置分布列

示例:

create table ACT_GE_PROPERTY (
    NAME_ varchar(64),
    VALUE_ varchar(300),
    REV_ INTEGER,
    primary key (NAME_)
) DISTRIBUTE BY REPLICATION;

分布列说明:

CREATE TABLE_云数据库 GaussDB (for openGauss)_开发指南_SQL参考_SQL语法_华为云 (huaweicloud.com)

JDBC驱动说明:

使用JDBC连接数据库_云数据库 GaussDB (for openGauss)_快速入门_使用驱动连接实例_华为云 (huaweicloud.com)

笔者在 maven 仓库中上传了 gsjdbc4.jar,坐标为:

<dependency>
    <groupId>org.opengauss</groupId>
    <artifactId>opengauss-jdbc-gsjdbc4</artifactId>
    <version>2.0.0</version>
</dependency>

:+1:

1 个赞

感谢大佬,参考文章后已解决,我这边正好做qrtz迁移到 gaussdb 。