一、概要
任何一款数据库产品的诞生并非一蹴而就,它需要经历一个完整的生命周期。从最初的规划到最终的维护直到退役,而数据库补丁升级也是生命周期中维护阶段的关键活动。补丁策略的完善程度,是一款成熟的数据库产品成熟性的体现之一。KingbaseES(简称KES)金仓数据库管理系统是面向全行业、全客户关键应用的企业级大型通用融合数据库产品。本文将通过搭建Linux系统环境,详细演示KES V9R1版本的补丁升级过程。
二、补丁说明
首先,让我们了解一下金仓数据库KingbaseES版本号中的字母含义:
- V - 主版本号
- R - 发布版本号
- C - 通用版本号
- B - build发版号
- M - 定制版本号
- SP - 补丁版本号
以V9版本为例:
$ kingbase -V
KINGBASE (KingbaseES) V009R001C002B0014
这表示主版本号为009,发布版本号为001,通用版本号为002,build发版号为0014。没有M表示这是通用版本,没有SP表示尚未打补丁。
KingbaseES数据库的补丁分为PSxxx、PSCxxx和PSIxxx三种,其中xxx表示补丁号,是三位数字。
- PS - 常规补丁,用于公开发布的例行升级。
- PSC - 安全补丁,专门用于修复安全漏洞。
- PSI - 临时补丁,为紧急问题提供临时解决方案。
此外,数据库、接口驱动和工具的补丁是独立迭代的,数字较大的补丁号版本会涵盖之前所有数字较小的补丁号版本的所有功能。
可以通过登录金仓官网下载地址https://www.kingbase.com.cn/download.html#patch?patch_packageDrivenToolId=8&patch_versionNumberId=5,选择对应数据库版本的补丁下载。最新版本V9R1C2B14补丁如下图:
官方提供相对应的升级指导书,一并下载了解补丁说明。
V009R001C002B0014PS019版本支持将某些基线版本的数据库系统平滑升级至对应的补丁版本,而不需要通过sys_dump/sys_restore对数据库的数据进行升级。
三、单机升级
1、升级前准备工作
1.选择合适的停机窗口,备份数据库。
2.关闭数据库服务。
[kingbase@node03 ~]$sys_ctl -D $KINGBASE_DATA stop
waiting for server to shut down.... done
server stopped
3.停止sys_securecmdd服务(未使用跳过)。
[kingbase@node03 ~]$ sys_HAscmdd.sh stop
4.创建data_bak目录并备份相关文件
备份bin、lib、share、include目录以及data数据目录
[kingbase@node03 ~]$ mkdir -p /home/kingbase/data_bak
[kingbase@node03 ~]$ cp -r $KINGBASE_DATA/ /home/kingbase/data_bak/
[kingbase@node03 ~]$ cp -r $KINGBASE_HOME/bin /home/kingbase/data_bak
[kingbase@node03 ~]$ cp -r $KINGBASE_HOME/lib /home/kingbase/data_bak
[kingbase@node03 ~]$ cp -r $KINGBASE_HOME/share /home/kingbase/data_bak
[kingbase@node03 ~]$ cp -r $KINGBASE_HOME/include /home/kingbase/data_bak
[kingbase@node03 ~]$ ls /home/kingbase/data_bak
bin data include lib share
5.Kingbase用户上传PS补丁包
[kingbase@node03 ~]$ ls kingbase-server-V009R001C002B0014PS019-linux-x86_64.tar
kingbase-server-V009R001C002B0014PS019-linux-x86_64.tar
2、数据库补丁升级
替换版本包,将解压后的文件直接覆盖原数据库安装目录。
1.解压PS补丁包到KINGBASE_HOME目录下
在安装目录下,解压缩覆盖原程序的lib、bin、share、include目录
[kingbase@node01 ~]$ tar -xf kingbase-server-V009R001C002B0014PS019-linux-x86_64.tar -C $KINGBASE_HOME
2.启sys_securecmdd
通过sys_HAscmdd.sh脚本启动sys_securecmdd,未使用跳过。
2.重启数据库服务
[kingbase@node03 ~]$ sys_ctl -D $KINGBASE_DATA start
waiting for server to start....2025-06-10 21:21:37.942 CST [9801] LOG: config the real archive_command string as soon as possible to archive WAL files
2025-06-10 21:21:37.951 CST [9801] LOG: sepapower extension initialized
2025-06-10 21:21:37.956 CST [9801] LOG: starting KingbaseES V009R001C002B0014PS019 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28), 64-bit
2025-06-10 21:21:37.956 CST [9801] LOG: listening on IPv4 address "0.0.0.0", port 54321
2025-06-10 21:21:37.956 CST [9801] LOG: listening on IPv6 address "::", port 54321
2025-06-10 21:21:37.958 CST [9801] LOG: listening on Unix socket "/tmp/.s.KINGBASE.54321"
2025-06-10 21:21:38.020 CST [9801] LOG: redirecting log output to logging collector process
2025-06-10 21:21:38.020 CST [9801] HINT: Future log output will appear in directory "sys_log".
done
server started
3.检查数据库版本
[kingbase@node03 ~]$ kingbase -V
KINGBASE (KingbaseES) V009R001C002B0014PS019
查看客户端程序ksql的版本
[kingbase@node03 ~]$ ksql -V
ksql (Kingbase) V009R001C002B0014PS019
3、升级后应用测试
4、版本回退
1.停止数据库
2.还原升级前备份的安装目录,包括lib、share、bin、include目录
3.启动数据库
4.检查数据库状态
回退之后如果发现数据有问题,可还原升级前备份数据。
四、集群升级
1、升级前准备工作(所以节点都操作)
1.选择合适的停机窗口,备份数据库。
2.主节点关闭数据库服务。
[kingbase@node01 ~]$ sys_monitor.sh stop
3.主备节点停止sys_securecmdd服务(未使用跳过)。
[kingbase@node01 ~]$ sys_HAscmdd.sh stop
4.创建data_bak目录并备份相关文件
备份bin、lib、share、include目录以及data数据目录
[kingbase@node01 ~]$ mkdir -p /home/kingbase/data_bak
[kingbase@node01 ~]$ cp -r $KINGBASE_DATA/ /home/kingbase/data_bak/
[kingbase@node01 ~]$ cp -r $KINGBASE_HOME/bin /home/kingbase/data_bak
[kingbase@node01 ~]$ cp -r $KINGBASE_HOME/lib /home/kingbase/data_bak
[kingbase@node01 ~]$ cp -r $KINGBASE_HOME/share /home/kingbase/data_bak
[kingbase@node01 ~]$ cp -r $KINGBASE_HOME/include /home/kingbase/data_bak
[kingbase@node01 ~]$ ls /home/kingbase/data_bak
bin data include lib share
5.Kingbase用户上传PS补丁包
[kingbase@node01 ~]$ ls kingbase-server-V009R001C002B0014PS019-linux-x86_64.tar
kingbase-server-V009R001C002B0014PS019-linux-x86_64.tar
2、数据库补丁升级(所以节点都操作)
替换主节点和所有备节点版本包,将解压后的文件直接覆盖原数据库安装目录。
1.解压PS补丁包到KINGBASE_HOME目录下
在安装目录下,解压缩覆盖原程序的lib、bin、share、include目录
[kingbase@node01 ~]$ tar -xf kingbase-server-V009R001C002B0014PS019-linux-x86_64.tar -C $KINGBASE_HOME
2.主备节点启sys_securecmdd
通过sys_HAscmdd.sh脚本启动sys_securecmdd,未使用跳过。
3.重启数据库服务(主节点操作)
[kingbase@node03 ~]$ sys_monitor.sh start
3.检查数据库版本
[kingbase@node03 ~]$ kingbase -V
KINGBASE (KingbaseES) V009R001C002B0014PS019
查看客户端程序ksql的版本
[kingbase@node03 ~]$ ksql -V
ksql (Kingbase) V009R001C002B0014PS019
3、升级后应用测试
4、版本回退
当升级后发现数据库有异常,可以回退版本。
1.停止数据库
2.还原升级前备份的安装目录,包括lib、share、bin、include目录
3.启动数据库
4.检查数据库状态
回退之后如果发现数据有问题,可还原升级前备份数据。
五、补丁修复说明
补丁修复了部分已知问题,请根据实际情况针对性调整如下内容:
# 假定数据目录为/home/kingbase/cluster/test/data
$ cd /home/kingbase/cluster/test/kingbase/bin
# 连接数据库,此处是以system超级用户名连接test库
$ ./ksql -d test -U system -p 端口号 -W
注意1:每个库都需要执行;
注意2:若扩展升级报扩展不存在,有需要可创建扩展,无可忽略;
● 基线 - PS019升级操作
-- 解决 Mysql模式下使用date_format函数引起OOM报错 等问题
# 升级以下插件(mysql模式)
$ alter extension kdb_mysql_functions update to '1.4';
$ alter extension kdb_mysql_datatype update to '1.5';
-- 支持插件tablefunc
# 创建插件(如果有需要)
$ create extension tablefunc;
-- 解决 在escape为off时查询无法返回带%的字符串 等问题
# 升级插件kdb_oracle_datatype(oracle模式)
$ alter extension kdb_oracle_datatype update to '1.11';
-- 支持插件hstore
# 创建插件(如果有需要)
$ create extension hstore;
-- 支持插件ltree
# 创建插件(如果有需要)
$ create extension ltree;
-- 解决 用户只能看到有权限的对象 的问题
# 升级插件security_utils
$ alter extension security_utils update to '1.1';
-- 解决 hstore扩展需包含ghstore_options(internal)函数
# 升级插件sys_trgm
$ alter extension sys_trgm update to '1.6';
-- 支持在dblink对象上创建视图(oracel模式)
# 升级插件kdb_database_link
$ ALTER EXTENSION kdb_database_link UPDATE TO '1.1';
# 执行以下sql操作
$ alter system set allow_system_table_dml=on;
$ select sys_reload_conf;
$ INSERT INTO pg_catalog._proc VALUES (5335, 'binary_upgrade_set_next_sys_namespace_oid', 11, 10, 12, 1, 0, 0, '-', 'f', false, false, true, false, 'v', 'r', 1, 0, 2278, '26', NULL, NULL, NULL, NULL, NULL, 'binary_upgrade_set_next_sys_namespace_oid', NULL, NULL, NULL);
$ alter system set allow_system_table_dml=off;
$ select sys_reload_conf;
-- 解决 kingbase与oracle数据库的user_tables的duration字段的显式不一致(oracle模式)
# 执行附件中的PS015.sql
$ \i PS015.sql
-- 解决 创建job之后,jobagentid没有更新,定时任务触发失败/创建定时任务后执行一次就停止了 的问题
# 升级插件kdb_schedule
$ alter extension kdb_schedule update to '1.6';




