SQLServer迁移至KES SQLServer模式 问题整理

介质

介质:使用兼容sqlserver模式的介质,官网第二个

初始化实例

复制代码
./initdb -U system -x hDfghy7d*#4fhd  -m sqlserver -D /data/Kingbase/ES/V8_NEW/data --lc-collate=zh_CN.GBK --lc-ctype=zh_CN.GBK --lc-monetary=zh_CN.GBK --lc-numeric=zh_CN.GBK --lc-time=zh_CN.GBK --lc-messages=zh_CN.GBK --text-search-config=simple --username=system --auth-host=scram-sha-256 --auth-local=trust --enable-ci --encrypt-algorithm=sm4 --saoname=sao --ssoname=sso
参数说明:-x 密码
          -m 模式
          -D 数据目录 
          剩余参数保持默认

--增加兼容SQLServer参数  单点:kingbase.conf 集群:es_rep.conf
datestyle = 'iso, ymd'
intervalstyle = 'sql_standard'
timezone = 'Asia/Shanghai'

--启动数据库  如果配置开机自启该步骤跳过
sys_ctl start -D 数据目录

--配置开机自启  必须root用户
su - root
cd /home/kingbase/V9/install/script/
语法:./startupcfg.sh [版本号] [数据库用户] [安装目录] [数据目录] [服务名]
示例:./startupcfg.sh V9 kingbase /home/kingbase/V9 /home/kingbase/V9/data kingbased

--启动数据库   必须root用户
su - root
systemctl start kingbased
systemctl status kingbased

--创建数据库
\c master
create database beijing;
create database shanghai;

数据库增加兼容参数

复制代码
datestyle = 'iso, ymd'
intervalstyle = 'sql_standard'
timezone = 'Asia/Shanghai'

问题整理

数据源访问报错

SQLServer测试失败

原因:密码错误

解决办法:正确密码测试后解决

表结构迁移报错

ERROR: type "clob" does not exist

问题描述:SQLServer数据库中表列字段类型是varchar(max),而迁移工具将表列字段类型变成了clob,导致表结构迁移报错:ERROR: type "clob" does not exist,而SQLServer中表结构中字段类型是

kdts迁移工具中报错日志:

复制代码
dbo.ht_FBContentAccessory fail:
com.kingbase8.util.KSQLException: ERROR: type "clob" does not exist
  Position: 407 At Line: 2, Line Position: 59
	at com.kingbase8.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:3625)
	at com.kingbase8.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:3058)
	at com.kingbase8.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407)
	at com.kingbase8.jdbc.KbStatement.executeInternal_(KbStatement.java:831)
	at com.kingbase8.jdbc.KbStatement.execute(KbStatement.java:720)
	at com.kingbase8.jdbc.KbStatement.executeWithFlags(KbStatement.java:623)
	at com.kingbase8.jdbc.KbStatement.executeCachedSql(KbStatement.java:597)
	at com.kingbase8.jdbc.KbStatement.executeWithFlags(KbStatement.java:558)
	at com.kingbase8.jdbc.KbStatement.execute(KbStatement.java:544)
	at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:94)
	at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java)
	at com.kingbase.kdts.dboperator.b.r.executeSql(DbOperatorKingbase.java:108)
	at com.kingbase.kdts.job.migration.an.bN(TableStructureWriteJob.java:241)
	at com.kingbase.kdts.job.migration.an.call(TableStructureWriteJob.java:30)
	at com.alibaba.ttl.TtlCallable.call(TtlCallable.java:65)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)
dbo.cszj_Accessory fail:

原因:发现是kdts迁移任务中数据类型映射错误导致:

解决办法:将kdts迁移任务中目标数据类型中增加varchar(max) 并将数据类型映射改成varchar(max)后迁移表结构成功。

注意:输入框中输入内容varchar(max),同步会有一个下拉选择框varchar(max)的选项,然后选择下拉框里面的,就自动填写到输入框中,点击保存就可以。切记输入内容varchar(max)后不要用鼠标点其他地方,不然输入的内容会被丢弃。

ERROR: type "blob" does not exist

SQLServer中表结构:

kdts迁移工具中报错:

复制代码
dbo.sysdiagrams fail:
com.kingbase8.util.KSQLException: ERROR: type "blob" does not exist
  Position: 203 At Line: 2, Line Position: 57
	at com.kingbase8.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:3625)
	at com.kingbase8.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:3058)
	at com.kingbase8.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407)
	at com.kingbase8.jdbc.KbStatement.executeInternal_(KbStatement.java:831)
	at com.kingbase8.jdbc.KbStatement.execute(KbStatement.java:720)
	at com.kingbase8.jdbc.KbStatement.executeWithFlags(KbStatement.java:623)
	at com.kingbase8.jdbc.KbStatement.executeCachedSql(KbStatement.java:597)
	at com.kingbase8.jdbc.KbStatement.executeWithFlags(KbStatement.java:558)
	at com.kingbase8.jdbc.KbStatement.execute(KbStatement.java:544)
	at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:94)
	at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java)
	at com.kingbase.kdts.dboperator.b.r.executeSql(DbOperatorKingbase.java:108)
	at com.kingbase.kdts.job.migration.an.bN(TableStructureWriteJob.java:241)
	at com.kingbase.kdts.job.migration.an.call(TableStructureWriteJob.java:30)
	at com.alibaba.ttl.TtlCallable.call(TtlCallable.java:65)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)

解决办法:

在迁移任务中将数据类型映射从blob改成image保存后再次迁移成功

ERROR: type "blob" does not exist

sqlserver中表结构

kdts转换后表结构:

复制代码
CREATE TABLE  "dbo"."CADSignatureFile" (
        "ID" serial NOT NULL, 
        "UserID" int NOT NULL, 
        "UserName" varchar(20) NOT NULL, 
        "Size" bigint NOT NULL, 
        "SignedFile" blob NOT NULL, 
        "Desc" varchar(500) NULL, 
        "CreationDate" datetime NOT NULL, 
        "LastModificationDate" datetime NOT NULL, 
        "FilseState" int NOT NULL, 
        "CreateUserID" int NOT NULL, 
        "CreateUserName" varchar(20) NOT NULL
);
ALTER SEQUENCE "CADSignatureFile_id_seq"INCREMENT BY 1;
SELECT SETVAL('"CADSignatureFile_id_seq"',9387);;
ALTER TABLE "dbo"."CADSignatureFile" OWNER TO "system";

kdts迁移报错:

复制代码
ERROR: type "blob" does not exist Position: 201 At Line: 2, Line Position: 54

数据迁移报错

ERROR:value too long for type varchar(100)

原因:SQLServer中排序规则是Chinese_PRC_CI_AS

KES SQLServer模式中字符集是UTF8

解决办法:重新初始化实例,字符集为GBK,再次创建数据库,迁移成功

复制代码
./initdb -U system -x hDfghy7d*#4fhd  -m sqlserver -D /data/Kingbase/ES/V8_NEW/data --lc-collate=zh_CN.GBK --lc-ctype=zh_CN.GBK --lc-monetary=zh_CN.GBK --lc-numeric=zh_CN.GBK --lc-time=zh_CN.GBK --lc-messages=zh_CN.GBK --text-search-config=simple --username=system --auth-host=scram-sha-256 --auth-local=trust --enable-ci --encrypt-algorithm=sm4 --saoname=sao --ssoname=sso
参数说明:-x 密码
          -m 模式
          -D 数据目录 
          剩余参数保持默认

--增加兼容SQLServer参数  单点:kingbase.conf 集群:es_rep.conf
datestyle = 'iso, ymd'
intervalstyle = 'sql_standard'
timezone = 'Asia/Shanghai'

--启动数据库  如果配置开机自启该步骤跳过
sys_ctl start -D 数据目录

--配置开机自启  必须root用户
su - root
cd /home/kingbase/V9/install/script/
语法:./startupcfg.sh [版本号] [数据库用户] [安装目录] [数据目录] [服务名]
示例:./startupcfg.sh V9 kingbase /home/kingbase/V9 /home/kingbase/V9/data kingbased

--启动数据库   必须root用户
su - root
systemctl start kingbased
systemctl status kingbased

--创建数据库
\c master
create database beijing;
create database shanghai;

ERROR: wrong number of columns: 1012233061

解决办法:单独迁移该表,目标端选择 :insert 同步数据

ERROR: column "v_cznr" is of type sys.text but expression is of type pg_catalog.text

问题描述:表结构迁移成功后,数据迁移报错:ERROR: column "v_cznr" is of type sys.text but expression is of type pg_catalog.text

复制代码
dbo.InvoiceDB_OperateLog fail:
com.kingbase.kdts.g.f: Failed to batch insert table data! SQL=insert into [dbo].[InvoiceDB_OperateLog] ( [i_xh],[v_xtflid],[v_mkid],[v_gnid],[v_gnmc],[v_czqxid],[v_czqxmc],[v_cznr],[v_ryid],[v_rymc],[d_date],[v_computer],[v_ip],[v_netcardno] ) overriding system value values ( ?,?,?,?,?,?,?,?,?,?,?,?,?,? )
at com.kingbase.kdts.dboperator.b.r.batchInsert(DbOperatorKingbase.java:923)
at com.kingbase.kdts.dbwriter.a.a(AbstractDbWriter.java:180)
at com.kingbase.kdts.job.migration.TableDataWriteJob.bN(TableDataWriteJob.java:262)
at com.kingbase.kdts.job.migration.TableDataWriteJob.call(TableDataWriteJob.java:33)
at com.alibaba.ttl.TtlCallable.call(TtlCallable.java:65)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.sql.BatchUpdateException: Batch entry 0 insert into [dbo].[InvoiceDB_OperateLog] ( [i_xh],[v_xtflid],[v_mkid],[v_gnid],[v_gnmc],[v_czqxid],[v_czqxmc],[v_cznr],[v_ryid],[v_rymc],[d_date],[v_computer],[v_ip],[v_netcardno] ) overriding system value values ( ('3303'::int4),('FM'),(NULL),('FM_InvoiceDBWorkItem'),('发票池'),(NULL),('导入'),('<stream of 8979282 _bytes>'),('SA41010207995'),('黄雅'),('2026-05-29T11:12:59.933'),('DESKTOP-08BUL4T'),('10.26.12.233'),('3C7C3F2EF4C7') ) was aborted: ERROR: column "v_cznr" is of type sys.text but expression is of type pg_catalog.text
  Hint: You will need to rewrite or cast the expression.
  Position: 237 At Line: 1, Line Position: 237  Call getNextException to see other _errors in the batch.
at com.kingbase8.jdbc.BatchResultHandler.handleError(BatchResultHandler.java:312)
at com.kingbase8.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:3059)
at com.kingbase8.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:670)
at com.kingbase8.jdbc.KbStatement.internalExecuteBatch_(KbStatement.java:1466)
at com.kingbase8.jdbc.KbStatement.executeBatch(KbStatement.java:1501)
at com.kingbase8.jdbc.KbPreparedStatement.executeBatch(KbPreparedStatement.java:3110)
at com.zaxxer.hikari.pool.ProxyStatement.executeBatch(ProxyStatement.java:127)
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeBatch(HikariProxyPreparedStatement.java)
at com.kingbase.kdts.dboperator.b.r.batchInsert(DbOperatorKingbase.java:902)
... 8 common frames omitted
Caused by: com.kingbase8.util.KSQLException: ERROR: column "v_cznr" is of type sys.text but expression is of type pg_catalog.text
  Hint: You will need to rewrite or cast the expression.
  Position: 237 At Line: 1, Line Position: 237
at com.kingbase8.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:3625)
at com.kingbase8.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:3058)
... 15 common frames omitted

原因:模式的兼容数据类型,一般都放到sys模式里。pg_catalog模式是原生pg数据类型,名称虽然与兼容名称一致,但数据dml操作是不一定能够支持。

解决办法:kdts迁移任务的数据类型映射中把目标数据类型改成sys.text后迁移数据成功。

如果还不行 将 目标数据库配置中 数据内存阈值 默认值 1 改成 1024

参数说明:数据内存阈值:大对象数据读入内存阈值(单位兆)

视图迁移报错

问题描述:视图迁移报错,手动在目标金仓库中创建提示报错:ERROR: views must not use dblink tables or views

创建视图的sql语句如下:

复制代码
CREATE VIEW hr_test_view
AS 
SELECT * FROM EEP2022.EEP_HR.dbo.hr_dic_type;

详细报错内容:

复制代码
org.jkiss.dbeaver.model.sql.DBSQLException: SQL 错误 [42P16]: ERROR: views must not use dblink tables or views.
	at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.executeStatement(JDBCStatementImpl.java:133)
	at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeStatement(SQLQueryJob.java:564)
	at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.lambda$0(SQLQueryJob.java:463)
	at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:181)
	at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeSingleQuery(SQLQueryJob.java:445)
	at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.extractData(SQLQueryJob.java:891)
	at org.jkiss.dbeaver.ui.editors.sql.SQLEditor$QueryResultsContainer.readData(SQLEditor.java:3851)
	at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.run(ResultSetJobDataRead.java:116)
	at org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$ResultSetDataPumpJob.run(ResultSetViewer.java:5065)
	at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:105)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Caused by: com.kingbase8.util.KSQLException: ERROR: views must not use dblink tables or views.
	at com.kingbase8.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:3625)
	at com.kingbase8.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:3058)
	at com.kingbase8.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:407)
	at com.kingbase8.jdbc.KbStatement.executeInternal_(KbStatement.java:831)
	at com.kingbase8.jdbc.KbStatement.execute(KbStatement.java:720)
	at com.kingbase8.jdbc.KbStatement.executeWithFlags(KbStatement.java:623)
	at com.kingbase8.jdbc.KbStatement.executeCachedSql(KbStatement.java:597)
	at com.kingbase8.jdbc.KbStatement.executeWithFlags(KbStatement.java:558)
	at com.kingbase8.jdbc.KbStatement.execute(KbStatement.java:544)
	at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.execute(JDBCStatementImpl.java:330)
	at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.executeStatement(JDBCStatementImpl.java:130)
	... 10 more

原因:暂时不支持视图中引用dblink实现的表或视图对象

解决办法:通过配置外部表替代该需求的实现

存储过程迁移报错

PROCEDURE read failed

复制代码
2026-07-16 14:42:48.861 ERROR [Contract_存储过程-metaRead-203] <2026-07-16_14-42-43 dbo> c.k.k.j.m.t : PROCEDURE read failed - dbo (1 retries), No.1, sql: null
com.kingbase.kdts.g.f: com.microsoft.sqlserver.jdbc.SQLServerException: SELECT 失败,因为下列 SET 选项的设置不正确: 'ARITHABORT'。请确保 SET 选项正确无误,可以用于 计算列上的索引视图和/或索引和/或筛选的索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作。。
	at com.kingbase.kdts.d.a.ba.h(DbAccessorSqlServer.java:2277)
	at com.kingbase.kdts.d.a.ba.queryProcedureList(DbAccessorSqlServer.java:2187)
	at com.kingbase.kdts.core.service.impl.MigrationMetaDataServiceImpl.queryProcedureList(MigrationMetaDataServiceImpl.java:710)
	at com.kingbase.kdts.job.migration.t.bN(ProcedureReadJob.java:49)
	at com.kingbase.kdts.job.migration.t.call(ProcedureReadJob.java:23)
	at com.alibaba.ttl.TtlCallable.call(TtlCallable.java:65)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)

解决办法:

在源端sqlserver里面执行

复制代码
ALTER DATABASE [目标数据库名] SET ARITHABORT ON;

然后再迁移目标数据库下存储过程成功。

57014 canceling statement due to user request

问题描述

客户反馈:多个SQL或存储过程执行时间较长,在KStudio工具中能返回数据,但是通过应用就会抛出报错:57014 canceling statement due to user request ,对SQL或存储过程优化后报错消失,让数据库层面检查原因。

现场环境信息:驱动:Kdbndp_V9/8.0.3.911

数据库版本:KingbaseES_V009R004C019B0004 SQLServer兼容模式

报错说明:SQLSTATE=57014,query_canceled,数据库收到取消本次 SQL 执行的信号 ,不是 SQL 语法报错。 从字面意思看:因为用户端请求,取消了正在执行的 SQL ,"用户" 不一定是人,客户端程序、驱动、超时都属于用户侧请求 。

分析过程

1、检查连接串,未配置超时参数;

2、检查数据库中超时参数,默认值0:不超时 ( idle_in_transaction_session_timeout、statement_timeout 和 client_idle_timeout );

3、检查Kdbndp驱动Command对象的属性,参数CommandTimeout 默认 30s。

解决办法

有以下2种解决办法:

  1. 连接串中增加 CommandTimeout 参数并设置合理值;
  2. 在KdbndpCommand对象的属性中,找到参数CommandTimeout 参数并设置合理值。
相关推荐
hflmwl81 小时前
RedisDesktopManager安装包中文版官方下载,redis可视化客户端工具下载
数据库·redis·缓存·可视化客户端工具
FluxDB1 小时前
《用 Rust + GPUI 做了一个开源数据库客户端:FluxDB》
数据库
roman_日积跬步-终至千里1 小时前
【数据Agent论文·查询与语义|09】Spider 2.0:从生成SQL走向完成企业工作流
数据库·sql·数据分析
曦夜日长1 小时前
MySQL系统篇,数据库基础(二):数据库概念、SQL 分类与存储引擎
数据库·sql·mysql
泡海椒1 小时前
JQuick-SQL AST 解析:从 SQL 文本到强类型节点
数据库·sql
要开心吖ZSH1 小时前
SeaTunnel + Doris + MySQL-CDC 数据同步故障排查个人笔记
数据库·mysql·doris·seatunnel·mysql cdc
data analyse 4562 小时前
Session数怎么计算?明确会话切分、超时与跨页规则
java·服务器·数据库
骑着蜗牛撵大象3272 小时前
ToolJet + PostgreSQL:后台表格、查询和流程,一次搭成可远程访问的业务系统
数据库·低代码·docker·postgresql·内部工具·tooljet