KingbaseES新版MySQL兼容版:旧版迁移与功能实测
前言 最近电科金仓出了新版本,MySQL 兼容版的变化挺大。手头正好有一台服务器还在跑旧的标准版 KingbaseES,借着这次产品体验官活动的机会,干脆来个彻底的升级:卸载旧版、全新安装 MySQL 兼容版、逐项验证兼容特性。整个过程一步不落地记录了下来。 很多团队都有这个顾虑:手头的 MySQL
前言
最近电科金仓出了新版本,MySQL 兼容版的变化挺大。手头正好有一台服务器还在跑旧的标准版 KingbaseES,借着这次产品体验官活动的机会,干脆来个彻底的升级:卸载旧版、全新安装 MySQL 兼容版、逐项验证兼容特性。整个过程一步不落地记录了下来。
很多团队都有这个顾虑:手头的 MySQL 项目想换国产数据库,但不知道迁移要改多少东西。KingbaseES MySQL 兼容版到底能兼容多少 MySQL 语法?改动有多大?这篇文章就用实际操作来回答这些问题。
一、环境说明
服务器环境是这样的:
| 项目 | 详情 |
|---|---|
| 操作系统 | CentOS 7.6 |
| 服务器 | 腾讯云(主机名 VM-0-17-centos) |
| 现有软件 | KingbaseES V009R001C010(标准版,安装于 /opt/Kingbase/ES/V9/KESRealPro/V009R001C010) |
| 目标版本 | KingbaseES V009R003C018B0003(MySQL 兼容版) |
| 安装包目录 | /opt/software |
用 ll 命令看看 /opt 目录,能看到 Kingbase(旧版安装目录,属主是 kingbase 用户)和 software(存放安装包)都在。

用 find 命令确认了一下,旧版是 KingbaseES V009R001C010(标准版),二进制文件在 /opt/Kingbase/ES/V9/KESRealPro/V009R001C010/Server/bin/ 这个路径下。旧版还在运行,装新版之前得先把它清理干净,不然配置文件容易冲突。
二、旧版 KingbaseES 卸载
2.1 确认旧版运行状态并停止服务
卸载之前有一件事不能省——确认数据库是否在运行。不能在服务还开着的时候直接删文件,那样很容易把数据搞坏。
# 检查数据库进程是否存活
ps aux | grep sys_ctl# 查找数据目录(配置文件所在目录即为数据目录)
find /opt/Kingbase -name "kingbase.conf" 2>/dev/null
find /opt/Kingbase -name "postgresql.conf" 2>/dev/null
情况一(常见):数据库正在运行
ps aux 输出中能看到类似下面这样的内容,说明服务还在跑着:
kingbase 1234 ... /opt/Kingbase/ES/V9/KESRealPro/V009R001C010/Server/bin/kingbase -D /data/kingbase
这种情况下,先备份数据(如果有需要保留的),然后把服务停掉:
# 切换到 kingbase 用户
su - kingbase# 若旧版数据库中有重要数据,先导出备份
/opt/Kingbase/ES/V9/KESRealPro/V009R001C010/Server/bin/sys_dump -U system -d <数据库名> -f /tmp/backup.sql# 停止数据库服务(-D 填入 find 到的数据目录路径)
/opt/Kingbase/ES/V9/KESRealPro/V009R001C010/Server/bin/sys_ctl -D <数据目录> stop# 确认停止成功,应显示 "server stopped"
/opt/Kingbase/ES/V9/KESRealPro/V009R001C010/Server/bin/sys_ctl -D <数据目录> status# 切换回 root 用户
exit
情况二:数据库未运行
我这边的情况是,ps aux | grep sys_ctl 只出现了 grep 进程本身,find 也什么都没找到。也就是说旧版压根就没初始化过数据库,没数据需要备份,直接卸载就行。
2.2 执行卸载
KingbaseES 自带了卸载程序,位置在安装目录下,优先用这个:
# 以 root 用户执行官方卸载程序
/opt/Kingbase/ES/V9/Uninstaller
跟着向导走即可,操作不复杂。
如果卸载程序跑完后还有文件残留,手动清理一下:
# 删除残余安装目录
rm -rf /opt/Kingbase/# 清理系统服务注册(如果有的话)
systemctl stop kingbase 2>/dev/null
systemctl disable kingbase 2>/dev/null
rm -f /etc/systemd/system/kingbase*.service
systemctl daemon-reload# 清理 kingbase 用户的环境变量
su - kingbase -c "sed -i '/Kingbase/d' ~/.bash_profile && sed -i '/Kingbase/d' ~/.bashrc"
2.3 验证卸载完成
ls /opt/Kingbase 2>/dev/null && echo "目录仍存在,请检查" || echo "旧版已清除,卸载完成"
看到这个提示就说明清干净了,可以装新版了。

三、下载 MySQL 兼容版
到金仓官网的下载页面,找到"安装包类型说明"那一块,选择 KingbaseES 数据库安装包(MySQL 兼容),然后点 VM_Linux(也就是 x86 虚拟机或物理机用的版本),版本选 V009R003C018B0003。

顺手在同一个页面把授权文件也下载了,用开发版那个就行,有效期 365 天,测试够用了。
然后用 WinSCP 或 Xftp 把 ISO 包和授权文件传到服务器的 /opt/software 目录下:
# 确认文件已上传(文件名以实际下载的为准)
ls -lh /opt/software/
# 应该能看到 .iso 安装包和 .dat 授权文件

四、安装 KingbaseES MySQL 兼容版
因为是云服务器,没有图形界面,所以选择命令行安装(console 模式)。下面把每一步的交互过程都记下来了。
4.1 安装前准备
# 以 root 用户执行# 临时关闭 SELinux(防止安装被拦截)
setenforce 0# 临时关闭防火墙
systemctl stop firewalld# 确认 kingbase 用户存在(卸载旧版后用户通常仍保留)
id kingbase || useradd -u 2000 kingbase# 重新创建安装目录并赋权(新版路径为 ES/V9 层级)
mkdir -p /opt/Kingbase/ES/V9
chown -R kingbase:kingbase /opt/Kingbase
chmod -R 755 /opt/Kingbase# 创建数据目录
mkdir -p /data/kingbase
chown -R kingbase:kingbase /data/kingbase
chmod -R 755 /data/kingbase
4.2 挂载 ISO 安装包
# 创建挂载点
mkdir -p /opt/software/KingbaseESV9# 挂载 ISO(文件名以实际上传的为准)
mount /opt/software/KingbaseES_V009R003C018B0003_Lin64_install.iso /opt/software/KingbaseESV9# 验证挂载成功(应能看到 setup.sh)
ls /opt/software/KingbaseESV9

ISO 挂载上去之后目录是只读的。如果要修改静默安装的配置文件,记得先复制出来再改,否则改不了。
4.3 启动命令行安装
# 切换到 kingbase 用户(KingbaseES 禁止 root 直接安装)
su - kingbase# 进入挂载目录,启动命令行安装
cd /opt/software/KingbaseESV9
sh setup.sh -i console
接下来进入安装向导,交互步骤如下:
① 接受许可协议
按空格键翻页阅读完协议,然后输入 1 表示接受,按 Enter。
② 选择授权文件
输入授权文件的绝对路径(如 /opt/software/license_V009R001C001-开发版.dat),按 Enter。
若暂无授权文件,直接按 Enter 使用试用授权。
③ 选择安装路径
直接按 Enter 使用默认路径 /opt/Kingbase/ES/V9。
④ 选择安装集
输入 1(完全安装,包含数据库服务器、KStudio 管理工具、KDTS 迁移工具等),按 Enter。
⑤ 安装预览确认
检查安装目录、组件列表、磁盘空间是否充足,确认无误后输入 N 开始安装。
⑥ 等待安装完成
安装过程约 5-10 分钟,屏幕会持续显示进度(如 Processing package: Server (4/9))。
看到 "安装完成" 等字样即表示成功。
⑦ 创建快捷方式
按 Y 确认创建,输入 1 选择当前用户,程序组名保持默认,按 Enter 退出。
如果前面跟着操作的话,一路默认即可。

直到提示安装成功。

4.4 初始化数据库(指定 MySQL 兼容模式)
这一步是安装 MySQL 兼容版和普通版最大的区别所在。初始化时需加一个参数指定兼容模式,不加的话就是普通模式了:
# 进入数据库二进制文件目录
cd /opt/Kingbase/ES/V9/Server/bin# 初始化数据库,--dbmode=mysql 指定 MySQL 兼容模式
# 注意:请以 kingbase 用户执行
./initdb -D /data/kingbase -U system -W --dbmode=mysql# 根据提示输入两次 system 用户密码(建议设置强密码,如 Kingbase@2024)
4.5 启动数据库服务
# 启动服务
./sys_ctl -D /data/kingbase start# 验证服务状态(出现 "server is running" 即成功)
./sys_ctl -D /data/kingbase status

4.6 连接数据库验证
# 连接数据库(-p 54321 为默认端口)
./ksql -U system -d test -p 54321# 输入密码后,出现 "test=#" 提示符即连接成功# 查看数据库版本信息
SELECT version();# 退出
q

五、MySQL 兼容功能体验
接下来进入正题。直接在 ksql 里跑了一批 SQL,把 MySQL 中常用的语法挨个测了一遍。下面逐项记录结果。
连接方式见上一节,进入之后看到 test=# 提示符就可以开始了。
5.1 AUTO_INCREMENT 自增主键
AUTO_INCREMENT 大概是 MySQL 里用得最多的特性之一。PostgreSQL 原生不认这个语法,得改成 SERIAL。那 KingbaseES 兼容版表现如何?试一下:
-- 使用完整 MySQL 建表语法,包含 ENGINE=InnoDB、DEFAULT CHARSET 等 MySQL 专有子句
CREATE TABLE user_info (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100),
create_time DATETIME DEFAULT NOW()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';-- 插入数据(不指定 id,让自增主键自动赋值)
INSERT INTO user_info (username, email) VALUES ('张三', 'zhangsan@example.com');
INSERT INTO user_info (username, email) VALUES ('李四', 'lisi@example.com');
INSERT INTO user_info (username, email) VALUES ('王五', 'wangwu@example.com');-- 查询结果,验证 id 是否自动递增
SELECT * FROM user_info;

结果是跑通了。三条插入都返回 INSERT 0 1,id 自己从 1 递增到 3,create_time 也自动带上了时间戳。还有一个地方很到位:ENGINE=InnoDB、DEFAULT CHARSET=utf8mb4、COMMENT 这些选项放到 KingbaseES 里直接不报错,就好像这些选项本来就在那里一样。对迁移来说基本没有额外成本。
结论:这块整体没问题,旧的 MySQL 建表脚本基本可以直接拿来用。
5.2 MySQL 专有数据类型
-- 测试 MySQL 特有数据类型
CREATE TABLE type_demo (
id TINYINT UNSIGNED,
score MEDIUMINT,
big_num BIGINT,
flag TINYINT(1), -- MySQL 中常用作布尔值
content TEXT,
status ENUM('active', 'inactive', 'pending') -- 枚举类型
);-- 查看表结构(MySQL 风格命令)
SHOW COLUMNS FROM type_demo;
SHOW COLUMNS FROM 出来的格式和 MySQL 的完全一致,Field、Type、Null、Key 这几列都有。可以看到 TINYINT UNSIGNED、MEDIUMINT 这些 MySQL 专属的类型都识别出来了。建表时写了什么,查出来就是什么,没有被自动转换掉。

5.3 SHOW 系列命令
-- 查看所有数据库
SHOW DATABASES;-- 查看当前数据库的所有表
SHOW TABLES;-- 查看建表语句
SHOW CREATE TABLE user_info;

SHOW DATABASES 正常输出结果,SHOW TABLES 也把 test 库里的两张表(user_info 和 type_demo)都列出来了。
SHOW CREATE TABLE 的结果也不错,把建表时写的 MySQL 语法原样返回了,ENGINE=InnoDB、DEFAULT CHARSET=utf8mb4 这些都保留着。也就是说,要把表结构导出来给 MySQL 用,直接拿这个就行。

5.4 MySQL 常用函数
-- GROUP_CONCAT:MySQL 特有字符串聚合函数(PostgreSQL 原生为 string_agg)
SELECT
GROUP_CONCAT(username ORDER BY id SEPARATOR '、') AS 所有用户
FROM user_info;-- IFNULL:替换 NULL 值(对应 PostgreSQL 的 COALESCE)
SELECT
username,
IFNULL(email, '未填写') AS 联系邮箱
FROM user_info;-- IF:MySQL 条件函数(对应 SQL 标准的 CASE WHEN)
SELECT
username,
IF(id = 1, '首位用户', '普通用户') AS 用户标签
FROM user_info;-- FIND_IN_SET:在逗号分隔的字符串中查找元素
SELECT FIND_IN_SET('李四', '张三,李四,王五') AS 位置;

四个函数全部跑通了。GROUP_CONCAT 把用户名按顺序拼接起来,分隔符也生效了;IFNULL 该返回原值的返回原值;IF 正常区分了首位用户;FIND_IN_SET 返回了 2,位置是对的。这几个函数在 PostgreSQL 原生里是没有的。如果项目里用了不少这类函数,迁移到 KingbaseES 基本不用改。
5.5 反引号标识符 + LIMIT 分页语法
-- MySQL 使用反引号 ` 来引用标识符(PostgreSQL 使用双引号)
SELECT `id`, `username`, `email`
FROM `user_info`
WHERE `id` >= 1;-- MySQL 特有的 LIMIT offset, count 分页写法(第 1 页,每页 2 条)
SELECT * FROM user_info LIMIT 0, 2;-- 标准 LIMIT ... OFFSET 写法(两种写法均兼容)
SELECT * FROM user_info LIMIT 2 OFFSET 0;

反引号括起来的列名和表名都能正常识别,查出来的结果和不加反引号的完全一致。分页方面,LIMIT 0, 2 这种 MySQL 特有的写法也支持,和标准的 LIMIT 2 OFFSET 0 效果一样,返回的数据相同。这意味着分页查询的代码也不需要一个一个改了。
5.6 兼容性汇总对比
| MySQL 语法特性 | KingbaseES MySQL 兼容版 | 原生 PostgreSQL |
|---|---|---|
AUTO_INCREMENT 自增主键 | 完全支持 | 需改用 SERIAL |
ENGINE=InnoDB 等建表选项 | 语法兼容(忽略引擎参数) | 不识别 |
DEFAULT CHARSET=utf8mb4 | 语法兼容 | 不识别 |
TINYINT / MEDIUMINT | 完全支持 | 仅支持 SMALLINT/INT |
ENUM 枚举类型 | 完全支持 | 支持 |
DATETIME 类型 | 完全支持 | 需用 TIMESTAMP |
SHOW COLUMNS FROM | 完全支持 | 不支持 |
SHOW DATABASES/TABLES | 完全支持 | 不支持 |
SHOW CREATE TABLE | 完全支持 | 不支持 |
GROUP_CONCAT() | 完全支持 | 需用 string_agg |
IFNULL() / IF() | 完全支持 | 需用 COALESCE/CASE |
FIND_IN_SET() | 完全支持 | 不支持 |
反引号 ` 标识符 | 完全支持 | 需用双引号 |
LIMIT offset, count 写法 | 完全支持 | 需用 LIMIT + OFFSET |
可以看出来,日常用到的 MySQL 语法基本上都覆盖到了。对于已有 MySQL 项目来说,大部分 SQL 不用改就能直接跑。
六、总结与评价
这次从头到尾走了一遍:旧版清理、安装新版、验证功能。谈谈总体感受。
亮点
1. MySQL 兼容度比预期好
测试下来,AUTO_INCREMENT、SHOW TABLES、GROUP_CONCAT、反引号这些基本都能用,主流 MySQL 语法覆盖得挺全的。对于想做国产化替换的团队来说,迁移工作量其实没有想象中那么大。
2. 三种安装方式都有 有图形界面的用图形化安装,没有界面的服务器用命令行安装,大批量部署用静默安装。三种方式都支持,按实际情况选择就行。
3. 工具链够用 安装完成后,自带了 KStudio(类似 Na vicat 的图形管理工具)和 KDTS 数据迁移工具,不需要再单独安装其他工具。DBA 日常管理用这些已经足够。
4. 合规方面有优势 KingbaseES 本身就满足等保、信创的合规要求,在政务、金融这类对数据主权有要求的场景里,这是 MySQL 给不了的东西。
美中不足
1. 默认端口不是 3306
KingbaseES 默认端口是 54321,而 MySQL 是 3306。客户端工具和部分框架连接时要注意改一下。虽然可以在 kingbase.conf 里改掉,但不是开箱即用的,这一点需要留意。
2. 安装包体积较大 ISO 包不小,网络不好的话传到服务器需要等一会儿。希望以后能有更轻量的安装方式。
适用场景推荐
| 使用场景 | 推荐度 |
|---|---|
| 政务/金融信创替换,合规优先 | |
| 已有 MySQL 项目平滑迁移国产化 | |
| 新项目数据库技术选型 | |
| 个人学习、了解国产数据库 |
最后
整体体验下来,KingbaseES MySQL 兼容版的兼容性比预想的要更好一些。主流 MySQL 语法基本都能跑,安装流程也不复杂。有 MySQL 国产化替换需求的话,这个版本值得认真看一看。
