零改造迁移实录:2000+存储过程从 SQL Server 迁移至 KingbaseES V9R4C12
在信创窗口期,我们将拥有 2000+ 存储过程、300+ 链接服务器的核心业务,从 SQL Server 2016/2019 平移到 KingbaseES V9R4C12(SQL Server 兼容版)。本文记录了一次'从下载到上线'的完整旅程,涵盖部署安装、兼容性验证、性能对比、踩坑与填坑及上线割接方案。
一、为什么要'平替'
过去十年,团队的核心业务一直跑在 SQL Server 2016/2019 双节点 AlwaysOn 集群上。随着国央企信创节奏加快,继续留在 Windows + SQL Server 技术栈不仅面临合规风险,License 费用也逐年攀升。经过多轮 PoC,我们把目光锁定在 KingbaseES V9R4C12(SQL Server 兼容版)——官方宣称'数据库平替用金仓',推出低风险迁移方案,这些对背负 2000+ 存储过程、300+ 链接服务器的系统来说,诱惑力极大。
二、Windows 与 Linux 安装部署
2.1 下载与安装
2.1.1 Windows 下载与安装
打开金仓官网地址,筛选 V9R4C12(SQLServer 兼容版),选择 X64_Windows 安装包。
下载完成后双击打开文件,会自动跳转到驱动器,点击 KINGBSASE.EXE 开始安装。
- 简介,点击接受然后下一步。
- 许可协议,新手建议完全安装。
- 选择安装集,选择想要安装的位置。
- 选择安装文件夹,安装。
- 预安装摘要、添加功能、选择安装集,系统自动安装。
- 正在安装,选择一个文件夹用于存储数据,该文件夹必须为空。
- 选择文件夹,数据库默认端口号:54321,用户名:system,输入对应的密码。
到这里就完成了 Windows 数据库的初始化工作。
2.1.2 Linux 下载与安装
官方下载页提供了 Linux x86_64 一键 tar 包与 Windows GUI 安装向导。
下载后通过 ftp 方式上传到 Linux 服务器上进行安装。
useradd kingbase && echo 'kingbase ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
tar -xzf kingbasees_v9r4c12_linux_x64.tar.gz -C /opt
chown -R kingbase:kingbase /opt/kingbase
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,新建连接,注意密码是刚才上面安装设置的密码。
点击测试连接,提示连接成功。
(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 = -1 allow_connections = TRUE is_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 模式三种库。这里指定:
CREATE DATABASE ss_app DBCOMPATIBILITY='mssql';
\c ss_app
注:DBCOMPATIBILITY 参数只能在建库时指定,后续不可修改。
三、兼容性全景测试
3.1 特殊数据类型'一把梭'
SQL Server 的 ROWVERSION/TIMESTAMP、SQL_VARIANT、UNIQUEIDENTIFIER、SYSNAME 在 KingbaseES 中都有直接映射,测试脚本如下:
CREATE TABLE t1 ( id INT PRIMARY KEY, rv ROWVERSION );
INSERT INTO t1(id) VALUES (1),(2);
SELECT * FROM t1;
CREATE TABLE t2 ( v SQL_VARIANT );
INSERT INTO t2 VALUES (123), ('abc'), (GETDATE());
SELECT v, SQL_VARIANT_PROPERTY(v,'BaseType') AS BaseType FROM t2;
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 行级锁行为
BEGIN TRAN;
UPDATE t1 SET id = id WHERE id = 1;
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 TRY
INSERT INTO t1(id) VALUES (1/0);
END TRY
BEGIN CATCH
RAISERROR('同步失败:%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 代码改动。
验证五种存储过程场景:
- 无参数
- IN 参数
- OUT 参数
- 返回值
- 更新计数
全部通过单元测试,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 结果摘要(单位:秒)
| Query | SQL Server | KingbaseES | 差异 |
|---|
| Q1 | 28.4 | 26.9 | -5% |
| Q5 | 42.1 | 44.3 | +5% |
| Q9 | 118.7 | 115.2 | -3% |
| Q21 | 210.9 | 205.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 Toolkit | 4 h | 原 SQL Server 只读 |
| 增量同步 | 基于 CDC + Debezium 实时同步 | 持续 | 一键切换回 DNS |
| 灰度验证 | 20% 流量到 KingbaseES | 1 周 | 流量权重回退 |
| 全量切换 | 100% 流量 | 0.5 h | 回滚 DNS + 连接池 |
七、写在最后
如果你也在寻找一条 低成本、低风险、周期短 的 SQL Server 信创路线,KingbaseES V9R4C12 值得认真评估。它并不是'阉割版'兼容,而是把 SQL Server 常用语法、类型、接口、工具链几乎 1:1 还原,性能也能打平。
关键字解说
- 信创:全称'信息技术应用创新',是国家主导的软硬件国产化替代工程。
- 平替:'平滑替代'的口语化表达,指在不修改或极少修改业务代码的前提下,将国外数据库完整迁移到国产数据库。
- AlwaysOn:SQL Server 2012+ 推出的高可用与灾难恢复方案。
- KingbaseES:电科金仓自主研发的企业级关系型数据库,基于 PostgreSQL 内核深度改造。
- V9R4C12:KingbaseES 2024 年发布的大版本号,C12 为 SQL Server 兼容特性包。
- 存储过程:在数据库内预编译并持久化的一组 SQL/控制流语句。
- 链接服务器:SQL Server 提供的分布式查询机制。
- 兼容性验证:迁移前必须完成的工程步骤。
- TPCH:Transaction Processing Performance Council 制定的决策支持基准。
- CDC:Change Data Capture,通过解析事务日志把行级变更实时输出。
- Debezium:Red Hat 开源的分布式 CDC 平台。
- KStudio:Kingbase 官方图形化集成开发环境。
- 灰度切换:上线策略,逐步放大流量直至 100% 切走旧库。
- kdb_database_link:KingbaseES 内置的跨库访问扩展。
- kdb_text:KingbaseES 全文检索扩展。