零改造迁移实录:2000+存储过程从SQL Server滑入KingbaseES V9R4C12的72小时

摘要:在信创窗口期,我们把拥有2000+存储过程、300+链接服务器的核心业务,从 SQL Server 2016/2019 平移到 KingbaseES V9R4C12(SQL Server 兼容版)。本文以 30 分钟部署、TPCH 100G 性能 PK、真实踩坑修复、灰度割接 4 小时完成的全过程,给出一条“零改造代码、零业务中断、零 License 费用”的国产数据库替代最短路径,供同样背负合规压力的技术团队参考。

目录

一、为什么要“平替”

二、Windows与Linux安装部署

2.1 下载与安装

2.1.1 Windows下载与安装:

2.1.2 Linux下载与安装:

2.2 金仓数据库开发工县KStudio

2.3 创建兼容库(Linux系统)

三、兼容性全景测试

3.1 特殊数据类型“一把梭”

3.2 语法糖:NOWAIT、SKIP LOCKED、FOR XML、TOP

3.2.1 行级锁行为

3.2.2 FOR XML

3.2.3 TOP 子句

3.3 存储过程与 T-SQL 细节

3.3.1 批处理 GO、PRINT、RAISERROR

3.3.2 “最后一个字段可加逗号”

3.4 JDBC 兼容测试

四、性能对比:TPCH 100G

4.1 硬件规格

4.2 测试方法

4.3 结果摘要(单位:秒)

五、踩坑与填坑

5.1 “IDENTITY_INSERT” 行为差异

5.2 全文索引

5.3 链接服务器

六、割接方案与回退策略

七、写在最后


一、为什么要“平替”

过去十年,我们团队的核心业务一直跑在 SQL Server 2016/2019 双节点 AlwaysOn 集群上。随着国央企信创节奏加快,继续留在 Windows + SQL Server 技术栈不仅面临合规风险,License 费用也逐年攀升。经过多轮 PoC,我们把目光锁定在 KingbaseES V9R4C12(SQL Server 兼容版)——官方宣称“数据库平替用金仓”,推出低风险迁移方案,这些对背负 2000+ 存储过程、300+ 链接服务器的系统来说,诱惑力极大。

本文记录了一次“从下载到上线”的完整旅程:1.部署安装-->2.兼容性验证(数据类型、T-SQL、接口、工具链)-->3.性能对比-->4.踩坑与填坑-->5上线割接方案


二、Windows与Linux安装部署

2.1 下载与安装

金仓官网下载:https://www.kingbase.com.cn/download.html#database

2.1.1 Windows下载与安装:

本文主要针对Windows系统进行交流体验,分享给大家一起交流学习!打开上面金仓官网地址,然后筛选 V9R4C12(SQLServer兼容版),如下图所示

然后选择 X64_Windows(如下图所示)

下面就开始下载,下载完成虎双击打开文件(如下图所示)

然后会自动跳转到下面这个驱动器,点击KINGBSASE.EXE然后开始安装(如下图所示)

接下来就来到安装程序图,如下图所示,点击下一步

1.简介,点击接受然后下一步(如下图)

2.许可协议,新手建议完全安装(如下图所示)

3.选择安装集,选择想要安装的位置,如下图我选择安装在E盘上

4.选择安装文件夹,安装(如下图所示)

5.预安装摘要、添加功能、选择安装集,系统自动安装,如下图所示:

6.正在安装,选择一个文件夹,用于存储数据的,改文件夹必须为空(如下图所示)

7.选择文件夹,数据库默认端口号:54321,用户名:system,然后输入对应的密码(如下图)

到这里就完成了Windows数据库的初始化工作!

2.1.2 Linux下载与安装:

官方下载页提供了 Linux x86_64 一键 tar 包Windows GUI 安装向导。如下图所示,点击下载

下载后如下图所示,通过ftp方式上传到Linux服务器上进行安装

# 1. 创建 kingbase 用户
useradd kingbase && echo 'kingbase ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers# 2. 解压
tar -xzf kingbasees_v9r4c12_linux_x64.tar.gz -C /opt
chown -R kingbase:kingbase /opt/kingbase# 3. 初始化实例
su - kingbase
/opt/kingbase/install/initdb -D /data/kingbase -E UTF8 --locale=zh_CN.UTF-8
/opt/kingbase/install/kingbase -D /data/kingbase > kingbase.log 2>&1 &

2.2 金仓数据库开发工县KStudio

打开刚才安装的工具Kstudio,如下图所示

新建连接,注意密码是刚才上面安装设置的密码,我这里刚才设置是:qwertyuiop123456

点击测试连接,提示连接成功,如下图:

(1)新建数据库

CREATE DATABASE [xiaoxiang] WITH OWNER = [system] ENCODING 'UTF8' TEMPLATE [template1]TABLESPACE = [sys_default]lc_collate = 'zh_CN.UTF-8'lc_ctype = 'zh_CN.UTF-8'connection_limit = -1allow_connections = TRUEis_template = FALSE;ALTER DATABASE [xiaoxiang] COLLATE Chinese_PRC_CI_AI;

 (2)新增表

CREATE TABLE [public].[title] ([id] integer IDENTITY(1,1) NOT NULL,[title] varchar(128),[description] varchar(512)
);ALTER TABLE [public].[title] SET
TABLESPACE [sys_default];

(3)插入数据库,可以手动写sql,也可以界面操作,非常方便

INSERT INTO [public].[title]
([id], [title], [description])
VALUES(2, '电科金仓2025发布会', '电科金仓2025.07.15在北京举行发布会');

(4)修改表数据

UPDATE [public].[title]
SET [id]=2, [title]='电科金仓2025发布会-通知2', [description]='电科金仓2025.07.15在北京举行发布会2';

(5)删除表数据

DELETE FROM [public].[title]
WHERE [id]=2 AND [title]='电科金仓2025发布会-通知2' AND [description]='电科金仓2025.07.15在北京举行发布会2';

2.3 创建兼容库(Linux系统)

KingbaseES 可以同时创建 Oracle 模式PostgreSQL 模式SQL Server 模式 三种库。这里指定:

-- 通过 ksql 连接
CREATE DATABASE ss_app DBCOMPATIBILITY='mssql';
\c ss_app

注:DBCOMPATIBILITY 参数只能在建库时指定,后续不可修改。


三、兼容性全景测试

3.1 特殊数据类型“一把梭”

SQL Server 的 ROWVERSION/TIMESTAMP、SQL_VARIANT、UNIQUEIDENTIFIER、SYSNAME 在 KingbaseES 中都有直接映射,测试脚本如下:

-- 1. ROWVERSION
CREATE TABLE t1 (id INT PRIMARY KEY,rv ROWVERSION
);-- 插入测试
INSERT INTO t1(id) VALUES (1),(2);
SELECT * FROM t1;
-- rv 字段自动递增,行为与 SQL Server 完全一致-- 2. SQL_VARIANT
CREATE TABLE t2 (v SQL_VARIANT
);
INSERT INTO t2 VALUES (123), ('abc'), (GETDATE());
SELECT v, SQL_VARIANT_PROPERTY(v,'BaseType') AS BaseType FROM t2;-- 3. UNIQUEIDENTIFIER & NEWSEQUENTIALID()
CREATE TABLE t3 (gid UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID() PRIMARY KEY,name SYSNAME
);
INSERT INTO t3(name) VALUES ('体验官');
SELECT * FROM t3;

结论:所有类型均可直接替换,无需改写。

3.2 语法糖:NOWAIT、SKIP LOCKED、FOR XML、TOP

3.2.1 行级锁行为
-- 会话 A
BEGIN TRAN;
UPDATE t1 SET id = id WHERE id = 1;-- 会话 B
SELECT * FROM t1 WHERE id = 1 NOWAIT;   -- 立即报错
SELECT * FROM t1 WHERE id = 1 SKIP LOCKED; -- 跳过被锁行
3.2.2 FOR XML
SELECT * FROM t3 FOR XML RAW, ROOT('root');

KingbaseES 支持 RAW、AUTO、EXPLICIT、PATH 四种模式,输出与 SQL Server Management Studio 结果一致。

3.2.3 TOP 子句
SELECT TOP (3) WITH TIES * FROM t2 ORDER BY v;

WITH TIES 也支持,惊喜。

3.3 存储过程与 T-SQL 细节

3.3.1 批处理 GO、PRINT、RAISERROR
PRINT N'开始同步...';BEGIN TRYINSERT INTO t1(id) VALUES (1/0);
END TRY
BEGIN CATCHRAISERROR('同步失败:%s', 16, 1, ERROR_MESSAGE());
END CATCH;
GO -- 批处理分隔符
PRINT '完成';

注意点:

  • RAISERROR 语法完全一致,支持 WITH NOWAIT

  • THROW 同样可用,与 SQL Server 2012+ 行为一致。

3.3.2 “最后一个字段可加逗号”
CREATE TABLE t4 (a INT,b INT,   -- 这里多了个逗号
);

KingbaseES 不会报错,对老系统极其友好。

3.4 JDBC 兼容测试

我们原来的 Spring Boot + MyBatis 项目,连接串从

jdbc:sqlserver://...

改成

jdbc:kingbase8://...?compatibleMode=mssql

即可,无一行 Java 代码改动

验证五种存储过程场景:

  1. 无参数

  2. IN 参数

  3. OUT 参数

  4. 返回值

  5. 更新计数

全部通过单元测试,MyBatis XML 中的 statementType="CALLABLE" 无需调整。


四、性能对比:TPCH 100G

4.1 硬件规格

  • 2 × Intel 6230R 26C52T

  • 512 GB DDR4

  • NVMe SSD 3.2 TB RAID0

  • CentOS 7.9 + 关闭 NUMA

4.2 测试方法

  • SQL Server 2019 企业版(无补丁)

  • KingbaseES V9R4C12(mssql 模式)

  • TPCH 100G 数据,表结构、索引脚本完全一致

4.3 结果摘要(单位:秒)

QuerySQL ServerKingbaseES差异
Q128.426.9-5%
Q542.144.3+5%
Q9118.7115.2-3%
Q21210.9205.4-3%

结论:两者互有胜负,整体差距在 ±5% 以内,可视为同一梯队。


五、踩坑与填坑

5.1 “IDENTITY_INSERT” 行为差异

KingbaseES 支持 SET IDENTITY_INSERT ON,但作用域仅限当前会话,事务提交后仍保持 ON,而 SQL Server 会自动 OFF。
解决:在存储过程末尾显式 SET IDENTITY_INSERT OFF

5.2 全文索引

SQL Server 的 CONTAINS/CONTAINSTABLE 默认启用;KingbaseES 需安装 kdb_text 扩展并手动创建词典。
解决

CREATE EXTENSION kdb_text;
-- 创建中文分词配置

5.3 链接服务器

KingbaseES 提供 kdb_database_link 扩展,可连接 SQL Server、Oracle、MySQL。

CREATE EXTENSION kdb_database_link;
SELECT dblink_connect('conn', 'sqlserver://user:pwd@host:1433/db');

实测分布式查询性能损耗 <10%,已用于 ETL。


六、割接方案与回退策略

阶段动作时间窗口回退方案
全量迁移使用 SSDT + Kingbase Migration Toolkit4 h原 SQL Server 只读
增量同步基于 CDC + Debezium 实时同步持续一键切换回 DNS
灰度验证20% 流量到 KingbaseES1 周流量权重回退
全量切换100% 流量0.5 h回滚 DNS + 连接池


七、写在最后

如果你也在寻找一条 低成本、低风险、周期短 的 SQL Server 信创路线,KingbaseES V9R4C12 值得认真评估。它并不是“阉割版”兼容,而是把 SQL Server 常用语法、类型、接口、工具链几乎 1:1 还原,性能也能打平。

15 个关键字解说:
1. 信创  
全称“信息技术应用创新”,是国家主导的软硬件国产化替代工程,要求核心系统逐步脱离国外产品,实现供应链安全与合规。  

2. 平替  
“平滑替代”的口语化表达,指在不修改或极少修改业务代码、不中断服务的前提下,将国外数据库完整迁移到国产数据库。  

3. AlwaysOn  
SQL Server 2012+ 推出的高可用与灾难恢复方案,通过同步或异步副本实现读写分离、秒级故障转移,是企业级架构的核心支柱。  

4. KingbaseES  
电科金仓自主研发的企业级关系型数据库,基于 PostgreSQL 内核深度改造,支持 Oracle、SQL Server、MySQL 多兼容模式,具备国产密码算法与可信计算能力。  

5. V9R4C12  
KingbaseES 2024 年发布的大版本号,其中 V9 代表内核世代,R4 为第四次功能增强,C12 为 SQL Server 兼容特性包,可直接解析 T-SQL 语法。  

6. 存储过程  
在数据库内预编译并持久化的一组 SQL/控制流语句,可接受参数、返回结果集,减少网络往返、提升复杂业务性能,是大型系统的粘合剂。  

7. 链接服务器  
SQL Server 提供的分布式查询机制,通过 OLE DB/ODBC 把异构数据库(Oracle、MySQL、文件)映射为本地“服务器”,实现跨实例 JOIN。  

8. 兼容性验证  
迁移前必须完成的工程步骤:逐一比对数据类型、系统函数、锁行为、错误码、驱动接口,确保应用在新库上的行为与原库 100% 一致。  

9. TPCH  
Transaction Processing Performance Council 制定的决策支持基准,包含 8 张表、22 条复杂查询,用于衡量 OLAP 场景下 100 GB~100 TB 的性能。  

10. CDC  
Change Data Capture,通过解析事务日志把行级变更(INSERT/UPDATE/DELETE)实时输出到 Kafka、Debezium 等消息流,实现增量同步。  

11. Debezium  
Red Hat 开源的分布式 CDC 平台,支持 SQL Server、MySQL、Oracle、PostgreSQL,可把事务日志转为 JSON 事件流,供下游系统实时消费。  

12. KStudio  
Kingbase 官方图形化集成开发环境,集成 SQL 编辑器、对象管理、性能监控、迁移向导,可一键替换 SQL Server Management Studio。  

13. 灰度切换  
上线策略:先让 1%~20% 的只读流量或边缘业务访问新库,通过监控指标、错误日志确认稳定后,再逐步放大流量,直至 100% 切走旧库。  

14. kdb_database_link  
KingbaseES 内置的跨库访问扩展,语法与 SQL Server 链接服务器对齐,可透明访问 Oracle、MySQL、SQL Server 远程表,支持分布式事务。  

15. kdb_text  
KingbaseES 全文检索扩展,支持中文分词、同义词、权重排序、高亮片段,补全 SQL Server CONTAINS/FREETEXT 功能,迁移无需改查询逻辑。

本文相关链接推荐:

1、【金仓数据库征文】政府项目数据库迁移:从MySQL 5.7到KingbaseES的蜕变之路

2、【金仓数据库征文】学校AI数字人:从Sql Server到KingbaseES的数据库转型之路

3、电科金仓2025发布会,国产数据库的AI融合进化与智领未来

4、国产数据库逆袭:老邓的“六大不敢替”被金仓逐一破解

5、《一行代码不改动!用KES V9 2025完成SQL Server → 金仓“平替”迁移并启用向量检索》

6、《赤兔引擎×的卢智能体:电科金仓如何用“三骏架构”重塑AI原生数据库一体机》

7、探秘KingbaseES在线体验平台:技术盛宴还是虚有其表?

8、破除“分布式”迷思:回归数据库选型的本质

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918995.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S HPA 弹性水平扩缩容 Pod 详解

文章目录1、前置准备2、需求场景3、Scale 静态扩缩容3.1、创建 Deployment 脚本3.2、Scale 扩缩容3、HPA 自动扩缩容3.1、安装 Metrics3.2、创建 Deployment 演示案例3.3、创建 HPA3.4、触发 HPA 自动扩缩容1、前置准备 本次案例演示&#xff0c;我选择了阿里云ECS&#xff08…

对话访谈|盘古信息×智晟威:深度挖掘数字化转型的奥秘

在数字化转型的浪潮中&#xff0c;传统设备企业如何突破“纯硬件”的边界&#xff0c;实现从“卖产品”到“卖生态”的跨越&#xff1f;数字化转型究竟是“高不可攀的奢侈品”&#xff0c;还是“触手可及的生存技能”&#xff1f;近日&#xff0c;广东盘古信息科技股份有限公司…

什么是模型预测控制?

一、概念模型预测控制&#xff08;Model Predictive Control, MPC&#xff09;是一种先进的控制方法&#xff0c;广泛应用于工业过程控制、机器人控制、自动驾驶等领域。MPC的核心思想是利用系统的动态模型预测未来的行为&#xff0c;并通过优化算法计算出当前时刻的最优控制输…

类与类加载器

在Java中&#xff0c;类和类加载器是密切相关的两个概念&#xff0c;理解它们有助于我们更好地掌握Java的运行机制。什么是Java类&#xff1f;Java类就像是一个模板或蓝图&#xff0c;它定义了对象的属性和行为。比如"汽车"可以看作一个类&#xff0c;它有颜色、品牌…

一文速通Python并行计算:14 Python异步编程-协程的管理和调度

一文速通 Python 并行计算&#xff1a;14 Python 异步编程-协程的管理和调度 摘要&#xff1a; Python 异步编程基于 async/await 构建协程&#xff0c;运行在事件循环中。协程生成 Task&#xff0c;遇到 await 时挂起&#xff0c;I/O 完成触发回调恢复运行&#xff0c;通过…

Node.js面试题及详细答案120题(16-30) -- 核心模块篇

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

RabbitMQ:Windows版本安装部署

目录一、概述二、OPT三、安装RabbitMQ四、登录测试一、概述 什么是MQ&#xff0c;有什么做作用&#xff1f; MQ即MessageQueue&#xff0c;消息队列。可以分为两部分理解&#xff1a;消息Message用于在不同的应用程序中传递数据。队列Queue&#xff0c;一种FIFO先进先出的数据…

酒店行业安全体系构建与优化策略

酒店行业安全体系构建与优化策略为确保酒店行业领导及宾客的安全&#xff0c;构建全面的治安联防体系及事故处理预案至关重要。某招待所通过设立保卫部&#xff0c;细化内保、治安、防火及交通管理职能&#xff0c;并下设警卫班、监控中心和电瓶车班&#xff0c;以全方位保障安…

python30-正则表达式

在Python中需要通过正则表达式对字符串进⾏匹配的时候&#xff0c;可以使⽤⼀个python自带的模块&#xff0c;名字为re。 re模块的使用&#xff1a;import re 一、匹配函数 1-1、re.match函数&#xff1a;返回匹配对象 match函数实现的是精准匹配&#xff0c;尝试从字符串的…

EP1C12F324I7N Altera Cyclone FPGA

EP1C12F324I7N 是 阿尔特拉 Altera Cyclone 系列中的一款 SRAM-based FPGA&#xff0c;定位为低成本、低功耗、面向嵌入式与消费/工业类量产应用的器件。该器件提供约 12,060 个逻辑单元&#xff08;Logic Elements&#xff09;&#xff0c;片上嵌入式存储约 234 kbit&#xff…

html5语义元素

1、参考&#xff1a;HTML5 语义元素 | 菜鸟教程 2、实战 HTML5 <section> 元素 <section> 标签定义文档中的节&#xff08;section、区段&#xff09;。比如章节、页眉、页脚或文档中的其他部分。 根据W3C HTML5文档: section 包含了一组内容及其标题。 <!D…

java调用PyTorch 训练模型实现神经网络全流程

以下是完整的操作流程:用 PyTorch 训练模型 → 导出为 ONNX 格式 → 用 Java 加载并推理,兼顾开发效率(PyTorch 快速训练)和生产部署(Java 稳定运行)。 一、PyTorch 训练模型并导出为 ONNX 1. 安装依赖 bash pip install torch onnx # PyTorch 和 ONNX 库2. 训练一个…

Maven - Spring Boot 项目打包本地 jar 的 3 种方法

文章目录Pre概述方案思路构建流程图工作机制说明目录结构示例POM 配置模板构建与验证注意事项方案优缺点Pre Maven - Manual Maven JAR Installation&#xff1a;用 mvn install:install-file 安装本地 JAR 的实用指南 概述 在 Spring Boot 项目中&#xff0c;通常依赖包会从…

平替 Claude Code,API接入 GPT-5,Codex CLI 国内直接使用教程

最新升级接入GPT-5的 Codex 拥有可以媲美 Claude Code 的AI编码能力&#xff0c;本文将指导你在 Windows系统上部署原生的 Codex CLI程序&#xff0c;并且接入超低价中转API&#xff0c;让你在国内直接用上超高性价比的 OpenAI Codex CLI 应用。关于 CodexCodex 是 OpenAI 开发…

kubernertes (K8S)部署

参考&#xff1a; https://blog.csdn.net/yu33575/article/details/135387548 二进制安装k8s&#xff1a; https://blog.csdn.net/qq_73990369/article/details/143217084 K8S二进制安装与部署 &#xff1a;https://blog.csdn.net/fantuan_sss/article/details/139073366 k8s…

LeetCode 简单JS刷题

目录 返回数组最后一个元素 2787.将一个数字表示成幂的和的方案数 326.3的幂 1780.判断一个数字是否可以表示成三的幂的和 342.4的幂 返回数组最后一个元素 1.请你编写一段代码实现一个数组方法&#xff0c;使任何数组都可以调用 array.last() 方法&#xff0c;这个方法将…

七大排序算法全解析:从入门到精通

目录 一.排序的概念 二.常见排序算法的实现 2.1 插入排序 &#xff08;1&#xff09;直接插入排序&#xff1a; 当插入第i(i>1)个元素时&#xff0c;前面的array[0],array[1],…,array[i-1]已经排好序&#xff0c;此时用array[i]的排序码与array[i-1],array[i-2],…的排序…

20250814在荣品RD-RK3588开发板的Android13下解决卡迪的LCD屏在开机的时候brightness最暗【背光的pwm信号的极性反了】

20250814在荣品RD-RK3588开发板的Android13下解决卡迪的LCD屏在开机的时候brightness最暗【背光的pwm信号的极性反了】 2025/8/14 11:33缘起&#xff1a;在荣品RD-RK3588开发板的Android13下&#xff0c;卡迪的LCD屏在开机的时候很暗&#xff0c;几乎看不见。 在命令行查看亮度…

Flink的状态管理

一、状态的概念Flink的状态其实你就可以将其想象为中间结果就可以了。在Flink中&#xff0c;算子的任务可以分为无状态和有状态两种情况。无状态算子任务在计算过程中是不依赖于其他数据的&#xff0c;只根据当前的输入数据就可以得到结果输出。比如之前讲到的Map、FlatMap、Fi…

GoLand 项目从 0 到 1:第八天 ——GORM 命名策略陷阱与 Go 项目启动慢问题攻坚

第八天核心任务&#xff1a;解决开发中的两大技术卡点今天的开发不仅聚焦于代码层面的数据库字段映射问题&#xff0c;还遭遇了一个困扰团队许久的环境难题 ——Go 项目启动异常缓慢。经过多维度排查&#xff0c;我们不仅理清了 GORM 命名策略的设计逻辑&#xff0c;还找到了影…