前言
最近电科金仓出了新版本,其中 MySQL 兼容版变化不小。我服务器上正好还跑着一套旧的 标准版KingbaseES,这次借着电科金仓产品体验官活动,干脆把它彻底升一遍:卸载旧版 → 全新安装 MySQL 兼容版 → 逐项验证兼容特性,整个过程都记下来了。
其实很多团队都有这个顾虑:手头的 MySQL 项目想换国产数据库,但不知道迁移要改多少东西。那 KingbaseES MySQL 兼容版到底能兼容多少 MySQL 语法?改动大不大?这篇文章用实际操作来说明。
@toc
一、环境说明
我这边的服务器环境是这样的:
| 项目 | 详情 |
|---|---|
| 操作系统 | 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 确认旧版运行状态并停止服务
卸载之前有一步不能省------得先看看数据库有没有在跑。不能在服务还开着的时候直接删文件,这样很可能把数据搞坏。
bash
# 检查数据库进程是否存活
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 输出中能看到类似以下内容,说明服务在跑着:
bash
kingbase 1234 ... /opt/Kingbase/ES/V9/KESRealPro/V009R001C010/Server/bin/kingbase -D /data/kingbase
这种情况下,先备份数据(如果有要保留的),然后把服务停掉:
bash
# 切换到 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 自带了卸载程序,位置在安装目录下,优先用这个:
bash
# 以 root 用户执行官方卸载程序
/opt/Kingbase/ES/V9/Uninstaller
跟着向导走就行了,挺简单的。
如果卸载程序跑完还有文件没删干净,手动清一下:
bash
# 删除残余安装目录
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 验证卸载完成
bash
ls /opt/Kingbase 2>/dev/null && echo "目录仍存在,请检查" || echo "旧版已清除,卸载完成"
看到这个提示就说明清干净了,可以装新版了。 
三、下载 MySQL 兼容版
去金仓官网的下载页,找到"安装包类型说明"那一块,选 KingbaseES 数据库安装包(MySQL 兼容) ,然后点 VM_Linux (也就是 x86 虚拟机或者物理机用的那个),版本选 V009R003C018B0003。

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

四、安装 KingbaseES MySQL 兼容版
我用的是云服务器,没有图形界面,所以选命令行安装(console 模式),下面把每一步的交互都记下来了。
4.1 安装前准备
bash
# 以 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 安装包
bash
# 创建挂载点
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 启动命令行安装
bash
# 切换到 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 兼容版和普通版最不一样的地方,初始化的时候要加一个参数指定兼容模式,不加的话就是普通模式了:
bash
# 进入数据库二进制文件目录
cd /opt/Kingbase/ES/V9/Server/bin
# 初始化数据库,--dbmode=mysql 指定 MySQL 兼容模式
# ⚠️ 注意:请以 kingbase 用户执行
./initdb -D /data/kingbase -U system -W --dbmode=mysql
# 根据提示输入两次 system 用户密码(建议设置强密码,如 Kingbase@2024)
💡 踩坑提示 :参数名是
--dbmode=mysql,中间没有连字符。我一开始写成--db-mode=mysql直接报unrecognized option了。不确定的话可以先跑一下./initdb --help | grep -i mysql,本版本(V009R003C018)会告诉你是-m, --dbmode=MODE。
4.5 启动数据库服务
bash
# 启动服务
./sys_ctl -D /data/kingbase start
# 验证服务状态(出现 "server is running" 即成功)
./sys_ctl -D /data/kingbase status

4.6 连接数据库验证
bash
# 连接数据库(-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 兼容版怎么样?试一下:
sql
-- 使用完整 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 专有数据类型
sql
-- 测试 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 系列命令
sql
-- 查看所有数据库
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 常用函数
sql
-- 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 分页语法
sql
-- 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(类似 Navicat 的图形管理工具)和 KDTS 数据迁移工具,不用再单独装别的,DBA 日常管理用这些够了。
4. 合规这块有优势 KingbaseES 本身就满足等保、信创的合规要求,在政务、金融这类对数据主权有要求的场景里,这是 MySQL 给不了的东西。
美中不足
1. 默认端口不是 3306 KingbaseES 默认端口是 54321,MySQL 是 3306,客户端工具和部分框架连接时要注意改一下。虽然可以在 kingbase.conf 里改掉,但不是开箱即用的,这点要留意。
2. 安装包挺大的 ISO 包体积不小,网络不好的话传服务器得等一会儿,希望以后能有更轻量的安装方式。
适用场景推荐
| 使用场景 | 推荐度 |
|---|---|
| 政务/金融信创替换,合规优先 | ⭐⭐⭐⭐⭐ |
| 已有 MySQL 项目平滑迁移国产化 | ⭐⭐⭐⭐⭐ |
| 新项目数据库技术选型 | ⭐⭐⭐⭐ |
| 个人学习、了解国产数据库 | ⭐⭐⭐⭐ |
最后
整体体验下来,KingbaseES MySQL 兼容版的兼容性比我预想的要好一些,主流 MySQL 语法基本都能跑,安装流程也不复杂。有 MySQL 国产化替换需求的话,这个版本值得认真看看。
