KingbaseES 新版MySQL 兼容版体验:旧版迁移 + 功能实测

前言

最近电科金仓出了新版本,其中 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=InnoDBDEFAULT CHARSET=utf8mb4COMMENT 这些选项放到 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 UNSIGNEDMEDIUMINT 这些 MySQL 专属的类型都认识,建表时写了什么,查出来就是什么,没有被自动转换掉。

5.3 SHOW 系列命令

sql 复制代码
-- 查看所有数据库
SHOW DATABASES;

-- 查看当前数据库的所有表
SHOW TABLES;

-- 查看建表语句
SHOW CREATE TABLE user_info;

SHOW DATABASES 正常出结果了,SHOW TABLES 也把 test 库里的两张表(user_infotype_demo)都列出来了。

SHOW CREATE TABLE 的结果也不错,把建表时写的 MySQL 语法原样还回来了,ENGINE=InnoDBDEFAULT 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_INCREMENTSHOW TABLESGROUP_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 国产化替换需求的话,这个版本值得认真看看。

相关推荐
倔强的石头_3 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
冬奇Lab3 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
ClouGence4 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
无响应de神4 天前
三、用户与权限管理
数据库·mysql
麦聪聊数据5 天前
数据服务化时代:企业数据能力输出的核心路径
数据库
shushangyun_5 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
DARLING Zero two♡5 天前
【MySQL数据库】数据类型与表约束
数据库·mysql
曹牧5 天前
Oracle EXPLAIN PLAN
数据库·oracle
BD_Marathon5 天前
SQL学习指南——视图
数据库·sql