KingbaseES V9R2 单机环境升级实施指南:基于 sys_upgrade 的完整实践

4 阅读18分钟

KingbaseES V9R2 单机环境升级实施指南:基于 sys_upgrade 的完整实践


前言

KingbaseES V9R2 系列作为金仓数据库的重要版本,持续通过小版本迭代修复问题、优化性能并增强功能。其中,V9R2C14 版本引入了读写分离智能路由、FastPath 锁优化及增强的数据安全策略,对于使用 V9R2 系列的用户而言,升级至最新版本是获取这些改进的直接途径。

本文档基于 V009R002C013 升级至 V009R002C014 的实际测试环境,详细复盘了使用 sys_upgrade 工具进行单机版升级的完整流程。内容涵盖工具原理、升级模式选择、前置参数检查、执行步骤、常见问题处理及回退方案。旨在为 DBA 提供一份逻辑清晰、可落地执行的标准化操作指南,确保升级过程安全、可控。


一、sys_upgrade 工具概述

1.1 工具定位

sys_upgrade 是 KingbaseES 官方提供的版本升级工具,其设计目标是在不进行数据转储(dump)的前提下,完成数据库版本的就地升级。通过升级系统目录元数据,使新版本的服务进程能够兼容并访问旧版本的数据文件,从而将升级停机时间从数小时缩短至分钟级。

1.2 工作原理

理解 sys_upgrade 的工作原理,有助于正确执行升级操作并预判可能的风险。其核心机制是升级系统目录元数据,而非迁移用户数据

┌─────────────────────────────────────────────────────────────────────────────┐
│                         sys_upgrade 工作原理                                │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│   旧数据目录                              新数据目录                         │
│   ┌─────────────────────┐                ┌─────────────────────┐            │
│   │  sys_catalog (C13)  │                │  sys_catalog (C14)  │            │
│   │  · 系统表结构       │                │  · 全新创建的结构   │            │
│   │  · 元数据(源)     │  ──提取转换─▶  │  · 升级后的元数据   │            │
│   ├─────────────────────┤                ├─────────────────────┤            │
│   │  user_data          │                │  user_data          │            │
│   │  · 表/索引文件      │  ──硬链接/拷贝─▶│  · 复用物理文件     │            │
│   │  · 物理存储         │                │  · 二进制兼容       │            │
│   └─────────────────────┘                └─────────────────────┘            │
│                                                                             │
│   本质:1. 重建系统表 2. 转换元数据 3. 复用数据文件                          │
└─────────────────────────────────────────────────────────────────────────────┘

工作流程说明

  1. 兼容性验证:检查新旧集群的二进制兼容性
  2. 停止服务:确保两个集群都处于停止状态
  3. 分析差异:识别系统表结构变化
  4. 创建新系统表:在新目录中初始化新版本的系统表
  5. 复用数据文件:通过硬链接或拷贝复用用户数据文件
  6. 转换导入元数据:从旧系统表提取元数据,转换后导入新系统表
  7. 更新文件映射:在新系统表中建立到复用文件的正确引用
  8. 生成后处理脚本:创建统计信息更新等脚本

核心理解:用户数据(表、索引等)文件在物理层面保持不变,sys_upgrade 通过升级系统表结构,使新版本的服务进程能够正确读取这些文件。这也是为什么 sys_upgrade 能够实现快速升级的本质原因。

1.3 关键限制

使用 sys_upgrade 前,需了解以下限制:

限制类型说明
平台限制仅支持 Linux,不支持 Windows
数据类型限制用户表中严禁包含 regproc、regprocedure、regoper、regoperator、regconfig、regnamespace、regdictionary 等 OID 依赖类型(regtype、regclass、regrole 可正常升级)
文件系统要求使用链接模式(-k)时,新旧数据目录必须在同一文件系统

1.4 升级模式对比

sys_upgrade 提供三种升级模式,可根据磁盘空间和安全需求选择:

模式命令参数特点回退风险适用场景
拷贝模式(默认)物理复制文件,新旧库完全独立✅ 低(旧库独立存在)首次升级、重要生产库
链接模式-k创建硬链接,几乎不占额外空间⚠️ 高(启动新库后旧库不可用)。如需保留旧库,可在升级前复制旧集簇副本,在副本上执行链接模式升级大数据库、磁盘空间紧张
克隆模式--clone文件系统级写时复制(CoW)✅ 低(CoW技术)支持 reflink 的文件系统(XFS/Btrfs)

推荐:对于生产环境,建议优先使用拷贝模式,确保旧库独立可回退。

1.5 支持的升级路径

sys_upgrade 支持以下版本升级至当前版本:

  • 已发布的 KingbaseES(Oracle 兼容版)历史版本(如 V009R002C013、V009R002C012、V009R002C010)
  • KingbaseES V009R001C010(Oracle 兼容模式)

二、升级前准备

2.0 环境信息确认

本文档基于以下测试环境编写,请根据实际环境调整路径:

项目说明
操作系统Red Hat 7.9Linux 环境
旧版本V009R002C013当前生产版本
旧安装目录/opt/Kingbase/ES/V9保持不变
旧数据目录/kdb/data当前生产数据
新安装目录/opt/Kingbase/ES/V9R2C14升级目标版本
新数据目录/kdb/data_V9R2C14升级目标数据
归档目录/kdb/arclogWAL 日志归档位置
备份目录/kdb/backup备份文件存放位置
监听端口54321数据库服务端口
环境语言zh_CN.UTF-8根据当前环境设置

2.1 核心参数检查

sys_upgrade 升级的是整个数据簇,新库初始化参数必须与旧库全局严格一致

说明:同一实例下的所有数据库共享兼容模式、编码、区域设置及大小写敏感配置,只需查询任意一个库即可代表全实例。

-- 连接数据库,记录关键参数
SELECT version();
SHOW database_mode;              -- 兼容模式 (oracle/pg)
SHOW server_encoding;            -- 字符编码 (UTF8/GBK)
SHOW lc_ctype;                   -- 区域设置
SHOW block_size;                 -- 块大小 (通常为 8192)
SHOW segment_size;               -- 段大小 (通常为 1GB)
SHOW wal_segment_size;           -- WAL段大小 (通常为 16MB)
SHOW enable_ci;                  -- 大小写敏感 (off/on)
SHOW data_checksums;             -- 数据校验和 (off/on)
SHOW max_connections;            -- 最大连接数
SHOW shared_buffers;             -- 共享缓冲区大小
SHOW timezone;                   -- 时区
SHOW data_directory;             -- 数据目录路径
SHOW port;                       -- 端口号
# 记录已安装扩展(用于升级后对比)
ksql -U system -d test -c "SELECT extname, extversion FROM sys_extension ORDER BY extname;" > /kdb/backup/extensions_before.txt

2.2 兼容性深度检查

2.2.1 reg* 类型检查

** 阻断项**:用户表中若包含 reg* 类型字段,升级将失败。

-- 检查用户表中是否存在不兼容的 reg* 类型
SELECT 
    n.nspname AS schema_name,
    c.relname AS table_name,
    a.attname AS column_name,
    t.typname AS data_type
FROM sys_class c
JOIN sys_namespace n ON c.relnamespace = n.oid
JOIN sys_attribute a ON c.oid = a.attrelid
JOIN sys_type t ON a.atttypid = t.oid
WHERE t.typname IN ('regproc', 'regprocedure', 'regoper', 'regoperator', 
                    'regconfig', 'regnamespace', 'regdictionary')
  AND c.relkind = 'r'
  AND n.nspname NOT IN ('sys_catalog', 'information_schema', 'pg_catalog', 'sys_toast', 'sys_temp')
  AND n.nspname NOT LIKE 'sys_%'
  AND n.nspname NOT LIKE 'pg_%';
2.2.2 表空间检查
-- 记录自定义表空间信息(如有)
SELECT spcname, oid, sys_tablespace_location(oid) AS location
FROM sys_tablespace 
WHERE spcname NOT LIKE 'sys%';
2.2.3 事务状态检查
-- 检查长事务
SELECT pid, state, now() - xact_start AS duration, query 
FROM sys_stat_activity 
WHERE xact_start IS NOT NULL AND now() - xact_start > interval '1 hour';

-- 检查预备事务
SELECT * FROM sys_prepared_xacts;

2.3 数据备份

** 推荐**:物理冷备份是最可靠的回退方案。

# 停止数据库
sys_ctl -D /kdb/data stop -m fast

# 物理全量备份(包含所有配置文件和用户数据)
BACKUP_DIR="/kdb/backup/data_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
rsync -av --delete /kdb/data/ "$BACKUP_DIR/"

# 验证备份
sys_controldata -D "$BACKUP_DIR" | grep "数据库簇状态"

说明:上述 rsync 命令已完整备份整个数据目录,包括 kingbase.confsys_hba.confkingbase.auto.confsys_ident.conf 等所有配置文件,无需单独备份。

2.4 环境配置调整

# ==================== 归档处理 ====================
# 重要:关闭归档前,必须确保所有WAL日志已归档

# 1. 手动切换WAL日志,触发归档(执行2-3次)
ksql -U system -d test -c "SELECT sys_switch_wal();"
ksql -U system -d test -c "SELECT sys_switch_wal();"
sleep 2

# 2. 检查归档目录,确认最后一个WAL段已归档
ls -lt /kdb/arclog/ | head -5

# 3. 记录当前归档配置值(用于升级后恢复)
grep -E "^archive_(mode|command|timeout)" /kdb/data/kingbase.conf > /kdb/backup/archive_config.txt

# 4. 关闭归档
sed -i 's/^archive_mode = on/archive_mode = off/' /kdb/data/kingbase.conf

# 5. 重新启动数据库服务
sys_ctl -D /kdb/data restart

# 6. 确认归档已关闭
ksql -U system -d test -c "SHOW archive_mode;"
# 预期输出:off

# ==================== 认证简化 ====================
# 临时改为 trust 认证,避免升级过程中密码验证失败
sed -i 's/scram-sha-256/trust/g' /kdb/data/sys_hba.conf
sed -i 's/md5/trust/g' /kdb/data/sys_hba.conf

# 重新加载认证配置
sys_ctl -D /kdb/data reload

2.5 升级前检查清单

类别检查项命令/方法状态
参数一致性兼容模式SHOW database_mode;
字符编码SHOW server_encoding;
区域设置SHOW lc_ctype;
块大小SHOW block_size;
大小写敏感SHOW enable_ci;
WAL段大小SHOW wal_segment_size;
数据校验和SHOW data_checksums;
段大小SHOW segment_size;
最大连接数SHOW max_connections;
时区SHOW timezone;
归档配置归档配置已记录cat /kdb/backup/archive_config.txt
WAL已完整归档ls -lt /kdb/arclog/ | head -5
兼容性reg*类型检查执行2.2.1节SQL(返回空)
无长事务/预备事务执行2.2.3节SQL(返回空)
数据备份物理备份完成ls -la /kdb/backup/data_*
扩展版本已记录ls -la /kdb/backup/extensions_before.txt
磁盘空间新数据目录空间df -h $NEW_DATA_DIR(≥旧目录2倍)
临时目录空间df -h /tmp(≥旧目录大小)
服务状态旧数据库已停止sys_ctl -D $OLD_DATA_DIR status
无残留 kingbase 进程ps aux | grep kingbase | grep -v grep
连接测试旧库本地连接正常ksql -U system -d test -c "SELECT 1;"
文件权限运行用户一致ls -ld $OLD_DATA_DIR | awk '{print $3}'

提示:建议逐项确认后勾选,确保升级前所有检查项均满足要求。


三、新版本安装与初始化

3.1 定义路径变量

# 定义新旧版本路径变量(举例)
export OLD_INSTALL_DIR=/opt/Kingbase/ES/V9
export OLD_DATA_DIR=/kdb/data
export NEW_INSTALL_DIR=/opt/Kingbase/ES/V9R2C14
export NEW_DATA_DIR=/kdb/data_V9R2C14

3.2 安装新版本

# 创建安装目录
mkdir -p $NEW_INSTALL_DIR

# 解压安装(根据实际安装包格式调整)
cd /opt/Kingbase/ES
tar -xzf /tmp/KingbaseES_V009R002C014_Lin64_install.tar.gz -C $NEW_INSTALL_DIR
...
# 验证安装
$NEW_INSTALL_DIR/Server/bin/ksql -V

3.3 初始化新数据目录

** 关键**:参数必须与 2.1 节记录的值完全一致。

# 根据 2.1 节检查结果执行初始化
$NEW_INSTALL_DIR/Server/bin/initdb \
  -U system \
  -W \                     # 提示输入密码
  -m oracle \              # 根据 2.1 节记录的值
  -E UTF8 \                # 根据 2.1 节记录的值
  --lc-ctype=zh_CN.UTF-8 \ # 根据 2.1 节记录的值
  -D $NEW_DATA_DIR \
  --wal-segsize=16         # 根据 2.1 节记录的值
  # 注意:data_checksums=off 时不加 --data-checksums
  # 注意:enable_ci=off 时不加 --enable-ci

3.4 拷贝配置文件

重要:将旧版本配置文件拷贝至新数据目录,确保参数设置与旧版本一致。

# 拷贝旧版本配置文件到新数据目录
cp $OLD_DATA_DIR/kingbase.conf $NEW_DATA_DIR/          # 主配置文件
cp $OLD_DATA_DIR/sys_hba.conf $NEW_DATA_DIR/           # 认证配置
cp $OLD_DATA_DIR/kingbase.auto.conf $NEW_DATA_DIR/ 2>/dev/null || true  # 动态配置(如有)
cp $OLD_DATA_DIR/sys_ident.conf $NEW_DATA_DIR/ 2>/dev/null || true      # ident配置(按需)

# 修改配置文件中的路径(指向新数据目录)
sed -i "s|$OLD_DATA_DIR|$NEW_DATA_DIR|g" $NEW_DATA_DIR/kingbase.conf
sed -i "s|$OLD_DATA_DIR|$NEW_DATA_DIR|g" $NEW_DATA_DIR/kingbase.auto.conf 2>/dev/null || true

# 临时关闭归档和简化认证
sed -i 's/^archive_mode = on/archive_mode = off/' $NEW_DATA_DIR/kingbase.conf
sed -i 's/scram-sha-256/trust/g' $NEW_DATA_DIR/sys_hba.conf
sed -i 's/md5/trust/g' $NEW_DATA_DIR/sys_hba.conf

说明

  • kingbase.auto.confALTER SYSTEM 命令动态修改的参数文件,如存在建议拷贝
  • sys_ident.conf 仅在配置了 ident 认证方式时需要,大多数环境可忽略
  • 使用 2>/dev/null || true 确保文件不存在时不报错

3.5 处理扩展共享对象

注意sys_upgrade 会自动处理内置扩展的版本升级,对于第三方自定义扩展,需遵循以下原则:

处理原则说明
查阅官方文档确认第三方扩展是否支持目标数据库版本
优先使用新版本从新版本的 contrib 包或扩展仓库安装对应版本
兼容性测试如必须使用旧版本文件,需在测试环境验证后再用于生产
准备回退方案复制前备份原文件,确保可快速回退
# 如确认兼容,从旧版本复制(谨慎操作)
# cp $OLD_INSTALL_DIR/Server/lib/xxx.so $NEW_INSTALL_DIR/Server/lib/

四、执行升级

4.1 sys_upgrade 参数说明

在执行升级前,了解各参数含义有助于正确使用工具:

参数说明本文档使用值注意事项
-b, --old-bindir旧版本可执行文件目录$OLD_INSTALL_DIR/Server/bin必须存在且可执行
-B, --new-bindir新版本可执行文件目录$NEW_INSTALL_DIR/Server/bin必须存在且可执行
-d, --old-datadir旧版本数据目录$OLD_DATA_DIR必须存在且可读
-D, --new-datadir新版本数据目录$NEW_DATA_DIR必须为空或不存在
-U, --username数据库超级用户system需有足够权限
-c, --check仅检查兼容性,不执行升级可用于预检查
-j, --jobs并行进程数4建议为CPU核心数
-v, --verbose输出详细日志开启便于排查问题
-s, --socketdir升级期间使用的套接字目录当前目录当当前目录路径过长导致套接字创建失败时指定
-k, --link硬链接模式未使用⚠️ 启动新库后旧库不可用
--clone克隆模式(reflink)未使用需文件系统支持
-o, --old-options旧实例额外选项-o '-c config_file=...'
-O, --new-options新实例额外选项-o
-r, --retain保留日志文件调试时使用
-s, --socketdir套接字目录路径长时需指定
-p, --old-port旧实例端口(仅检查模式)-c 模式且旧库运行时需要
-P, --new-port新实例端口(仅检查模式)-c 模式且新库运行时需要

4.1.1 关键参数详解

连接相关参数说明

  • -p, --old-port-P, --new-port 仅在检查模式-c)且数据库运行时需要
  • 本文档执行升级时数据库已停止,sys_upgrade 会自动启动临时实例,无需指定端口参数

升级模式选择

  1. 默认模式(拷贝):最安全,新旧库独立,回退简单
  2. 链接模式(-k:节省空间,但启动新库后旧库数据同步变更
  3. 克隆模式(--clone:需要文件系统支持(XFS/Btrfs/APFS)

性能优化参数

  • -j:并行处理,显著提升大数据库升级速度
  • 建议值:min(CPU核心数, 表空间数量)

4.1.2 环境变量支持

sys_upgrade 也支持通过环境变量指定参数,优先级:命令行 > 环境变量 > 默认值。

环境变量对应参数示例值
KBBINOLD-b/opt/Kingbase/ES/V9/Server/bin
KBBINNEW-B/opt/Kingbase/ES/V9R2C14/Server/bin
KBDATAOLD-d/kdb/data
KBDATANEW-D/kdb/data_V9R2C14
KBUSER-Usystem

4.2 停止所有数据库实例

# 停止旧数据库
$OLD_INSTALL_DIR/Server/bin/sys_ctl -D $OLD_DATA_DIR stop -m fast

# 确认无残留进程
ps -ef | grep kingbase | grep -v grep

4.3 兼容性预检查

必须执行:预检查通过后再执行正式升级。

$NEW_INSTALL_DIR/Server/bin/sys_upgrade \
  -b $OLD_INSTALL_DIR/Server/bin \
  -B $NEW_INSTALL_DIR/Server/bin \
  -d $OLD_DATA_DIR \
  -D $NEW_DATA_DIR \
  -U system \
  -c

预期输出*集簇是兼容的/Clusters are compatible*

4.4 执行正式升级

$NEW_INSTALL_DIR/Server/bin/sys_upgrade \
  -b $OLD_INSTALL_DIR/Server/bin \
  -B $NEW_INSTALL_DIR/Server/bin \
  -d $OLD_DATA_DIR \
  -D $NEW_DATA_DIR \
  -U system \
  -j 4 \
  -v

成功标志:输出 升级完成/Upgrade Complete,并在当前目录生成 analyze_new_cluster.shdelete_old_cluster.sh 两个脚本。

说明sys_upgrade 会报告所有影响升级成功的失败、重建和重新索引情况。升级成功后,sys_upgrade 会在执行该命令时的工作目录中生成必要的后处理脚本。


五、升级后处理

5.1 启动新数据库并验证参数

# 启动新数据库
$NEW_INSTALL_DIR/Server/bin/sys_ctl -D $NEW_DATA_DIR start

# 验证关键参数(升级后,参数应从旧配置继承)
$NEW_INSTALL_DIR/Server/bin/ksql -U system -p 54321 -d test -c "
-- 基础参数
SELECT '1. 版本' as item, version() as value;
SELECT '2. 兼容模式' as item, current_setting('database_mode') as value;
SELECT '3. 字符编码' as item, current_setting('server_encoding') as value;
SELECT '4. 区域设置' as item, current_setting('lc_ctype') as value;

-- 存储参数
SELECT '5. 块大小' as item, current_setting('block_size') as value;
SELECT '6. 段大小' as item, current_setting('segment_size') as value;
SELECT '7. WAL段大小' as item, current_setting('wal_segment_size') as value;

-- 功能参数
SELECT '8. 大小写敏感' as item, current_setting('enable_ci') as value;
SELECT '9. 数据校验和' as item, current_setting('data_checksums') as value;

-- 运行时参数(应从旧配置继承)
SELECT '10. 最大连接数' as item, current_setting('max_connections') as value;
SELECT '11. 共享缓冲区' as item, current_setting('shared_buffers') as value;
SELECT '12. 时区' as item, current_setting('timezone') as value;
"

预期输出(应与 2.1 节记录的值一致):

 item | value
------+------------------------------------------------
 1. 版本 | KingbaseES V009R002C014 ...
 2. 兼容模式 | oracle
 3. 字符编码 | UTF8
 4. 区域设置 | zh_CN.UTF-8
 5. 块大小 | 8192
 6. 段大小 | 131072
 7. WAL段大小 | 16MB
 8. 大小写敏感 | off
 9. 数据校验和 | off
10. 最大连接数 | 300
11. 共享缓冲区 | 128MB
12. 时区 | Asia/Shanghai

5.2 更新统计信息

** 关键**:统计信息不会通过 sys_upgrade 自动迁移,必须手动执行。

# 进入生成脚本的目录(执行 sys_upgrade 时的当前目录,通常为用户家目录)
cd ~

# 执行统计信息更新,传递正确的端口号
./analyze_new_cluster.sh --port 54321

> **脚本说明**:
> - **来源**:`analyze_new_cluster.sh` 是 `sys_upgrade` 执行成功后**自动生成**的脚本,位于执行 `sys_upgrade` 命令的当前工作目录中。
> - **作用**:调用 `vacuumdb` 工具为新集群中的所有数据库更新优化器统计信息。
> 
> **执行必要性**:`sys_upgrade` **不会自动迁移统计信息**,必须手动执行此脚本。如果不执行,新集群的查询优化器将使用过时或缺失的统计信息,可能导致严重的性能问题。
> 
> **执行时机**:必须在**新数据库启动后、业务连接前**执行。
> 
> **警告说明**:执行过程中出现的 `WARNING: skipping "_kingbase_loginfo"` 是正常现象。`_kingbase_loginfo` 是 KingbaseES 内部用于系统日志记录的特殊表,`vacuumdb` 工具无法对其收集统计信息,这不会影响用户业务表的统计信息更新。

5.3 恢复归档配置

# 恢复归档模式
sed -i 's/^archive_mode = off/archive_mode = on/' $NEW_DATA_DIR/kingbase.conf

# 重新启动数据库服务
$NEW_INSTALL_DIR/Server/bin/sys_ctl -D $NEW_DATA_DIR restart

# 验证归档功能
$NEW_INSTALL_DIR/Server/bin/ksql -U system -p 54321 -d test -c "SELECT sys_switch_wal();"
ls -lt /kdb/arclog/ | head -5

5.4 验证扩展版本

# 记录升级后扩展版本
$NEW_INSTALL_DIR/Server/bin/ksql -U system -p 54321 -d test -c "SELECT extname, extversion FROM sys_extension ORDER BY extname;" > /tmp/extensions_after.txt

# 对比升级前后差异
diff /kdb/backup/extensions_before.txt /tmp/extensions_after.txt

结果解读

  • 无差异或仅内置扩展版本号增加:正常,sys_upgrade 已自动处理
  • 出现自定义扩展缺失:需按照 3.5 节原则处理
  • 出现扩展版本回退:异常,需检查升级过程

5.5 恢复安全配置

# 将认证方式改回原来的加密方式
sed -i 's/trust/scram-sha-256/g' $NEW_DATA_DIR/sys_hba.conf

# 重新加载配置
$NEW_INSTALL_DIR/Server/bin/sys_ctl -D $NEW_DATA_DIR reload

5.6 更新环境变量

# 编辑用户配置文件
vi ~/.bashrc

# 修改以下内容
export KINGBASE_HOME=$NEW_INSTALL_DIR
export KINGBASE_DATA=$NEW_DATA_DIR
export KINGBASE_PORT=54321
export PATH=$KINGBASE_HOME/Server/bin:$PATH
export LD_LIBRARY_PATH=$KINGBASE_HOME/Server/lib:$LD_LIBRARY_PATH

# 使配置生效
source ~/.bashrc

# 验证
ksql -V

5.7 升级后验证清单

类别检查项命令预期结果状态
核心参数版本号SELECT version();V009R002C014
兼容模式SHOW database_mode;与升级前一致
字符编码SHOW server_encoding;与升级前一致
区域设置SHOW lc_ctype;与升级前一致
块大小SHOW block_size;与升级前一致
段大小SHOW segment_size;与升级前一致
大小写敏感SHOW enable_ci;与升级前一致
数据校验和SHOW data_checksums;与升级前一致
WAL段大小SHOW wal_segment_size;与升级前一致
最大连接数SHOW max_connections;与升级前一致
共享缓冲区SHOW shared_buffers;与升级前一致
时区SHOW timezone;与升级前一致
归档归档模式SHOW archive_mode;on
归档功能检查归档目录有新文件生成
扩展扩展列表完整diff extensions_before.txt extensions_after.txt仅内置扩展版本号增加
环境变量KINGBASE_HOMEecho $KINGBASE_HOME新版本路径
KINGBASE_DATAecho $KINGBASE_DATA新数据目录
数据数据库列表\l与升级前一致
业务数据抽样查询数据完整

5.8 清理旧环境(稳定后执行)

警告:确认新库稳定运行至少一周后再执行清理。

# 重命名保留(推荐)
mv $OLD_DATA_DIR /kdb/data_old_final_$(date +%Y%m%d)
mv $OLD_INSTALL_DIR /opt/Kingbase/ES/V9_old_final

六、应急回退方案

6.1 回退触发条件

  • 新数据库无法启动
  • 数据验证发现丢失或损坏
  • 业务应用出现兼容性问题
  • 性能严重劣化且无法快速调优

6.2 回退方式选择

回退操作取决于升级时使用的模式,不同模式下旧库状态不同:

升级模式旧库状态直接启动旧库推荐回退方式
拷贝模式(默认)完好独立✅ 可以直接启动旧库
链接模式(-k已损坏❌ 不可以从备份恢复
克隆模式(--clone不确定⚠️ 可能可以从备份恢复

⚠️ 重要提示:最安全的做法是无论何种模式,均从物理备份恢复,确保数据一致性和完整性。以下方案提供两种回退方式,请根据实际情况选择。

6.3 回退步骤

6.3.1 方案一:从物理备份恢复(推荐,适用于所有模式)

优点:最可靠,确保数据完整性,适用于任何升级模式。

# 1. 停止新数据库(如仍在运行)
$NEW_INSTALL_DIR/Server/bin/sys_ctl -D $NEW_DATA_DIR stop -m immediate

# 2. 备份当前状态(可选,便于问题分析)
mv $OLD_DATA_DIR $OLD_DATA_DIR_crash_$(date +%Y%m%d_%H%M%S) 2>/dev/null || true

# 3. 从物理备份恢复旧数据目录
cp -rp /kdb/backup/data_YYYYMMDD_HHMMSS $OLD_DATA_DIR

# 4. 修复权限
chown -R kingbase:kingbase $OLD_DATA_DIR
chmod 700 $OLD_DATA_DIR

# 5. 恢复环境变量(编辑 ~/.bashrc,改回旧路径)
# export KINGBASE_HOME=$OLD_INSTALL_DIR
# export KINGBASE_DATA=$OLD_DATA_DIR
# source ~/.bashrc

# 6. 启动旧数据库
$OLD_INSTALL_DIR/Server/bin/sys_ctl -D $OLD_DATA_DIR start

# 7. 验证业务
ksql -U system -p 54321 -d test -c "SELECT 1;"
6.3.2 方案二:直接启动旧库(仅适用于拷贝模式)

说明:仅当确认使用默认拷贝模式升级时,可采用此快速回退方式。

# 1. 停止新数据库
$NEW_INSTALL_DIR/Server/bin/sys_ctl -D $NEW_DATA_DIR stop -m immediate

# 2. 确认旧数据目录完好
ls -la $OLD_DATA_DIR/global/sys_control

# 3. 恢复环境变量(编辑 ~/.bashrc,改回旧路径)
# export KINGBASE_HOME=$OLD_INSTALL_DIR
# export KINGBASE_DATA=$OLD_DATA_DIR
# source ~/.bashrc

# 4. 启动旧数据库
$OLD_INSTALL_DIR/Server/bin/sys_ctl -D $OLD_DATA_DIR start

# 5. 验证业务
ksql -U system -p 54321 -d test -c "SELECT 1;"

6.4 回退后处理

无论使用哪种回退方式,建议执行以下检查:

# 1. 确认数据库状态
sys_ctl -D $OLD_DATA_DIR status

# 2. 确认归档配置已恢复
ksql -U system -d test -c "SHOW archive_mode;"

# 3. 确认备份任务已恢复(如有)
crontab -l | grep -iE "backup|dump"

# 4. 确认业务数据完整
ksql -U system -d test -c "SELECT COUNT(*) FROM your_business_table;"

6.5 回退方案选择指南

┌─────────────────────────────────────────────────────────────┐
│                   确认升级时使用的模式                        │
└─────────────────────────────────────────────────────────────┘
                              │
        ┌─────────────────────┼─────────────────────┐
        ▼                     ▼                     ▼
┌───────────────┐    ┌───────────────┐    ┌───────────────┐
│   拷贝模式    │    │   链接模式    │    │   克隆模式    │
│   旧库完好    │    │  旧库已损坏   │    │  旧库不确定   │
└───────────────┘    └───────────────┘    └───────────────┘
        │                     │                     │
        ▼                     ▼                     ▼
┌───────────────┐    ┌───────────────┐    ┌───────────────┐
│ 两种方案均可  │    │ 必须从备份恢复 │    │ 推荐从备份恢复 │
│ 推荐备份恢复  │    │               │    │               │
└───────────────┘    └───────────────┘    └───────────────┘

6.6 回退方案速查表

升级模式直接启动旧库从备份恢复推荐方案
拷贝模式✅ 可行✅ 可行备份恢复(最安全)
链接模式❌ 不可行✅ 必须备份恢复
克隆模式⚠️ 不确定✅ 可行备份恢复

提示:无论使用哪种模式,建议在升级前完成物理备份(2.3节),并确保备份文件可读、完整。回退前确认备份文件存在且为升级前状态。


七、测试案例

7.1 案例环境

项目
操作系统Red Hat 7.9
旧版本KingbaseES V009R002C013
新版本KingbaseES V009R002C014
旧安装目录/opt/Kingbase/ES/V9
旧数据目录/kdb/data
新安装目录/opt/Kingbase/ES/V9R2C14
新数据目录/kdb/data_V9R2C14
归档目录/kdb/arclog
监听端口54321

7.2 升级前信息收集

-- 连接数据库,记录关键参数
SELECT version();
         version
-------------------------
 KingbaseES V009R002C013
(1 行记录)

SHOW database_mode;              -- 兼容模式 (oracle/pg)
 database_mode
---------------
 oracle
(1 行记录)

SHOW server_encoding;            -- 字符编码 (UTF8/GBK)
 server_encoding
-----------------
 UTF8
(1 行记录)

SHOW lc_ctype;                   -- 区域设置
  lc_ctype
-------------
 zh_CN.UTF-8
(1 行记录)

SHOW block_size;                 -- 块大小 (通常为 8192)
 block_size
------------
 8192
(1 行记录)

SHOW segment_size;               -- 段大小 (通常为 1GB)
 segment_size
--------------
 1GB
(1 行记录)

SHOW wal_segment_size;           -- WAL段大小 (通常为 16MB)
 wal_segment_size
------------------
 16MB
(1 行记录)

SHOW enable_ci;                  -- 大小写敏感 (off/on)
 enable_ci
-----------
 off
(1 行记录)

SHOW data_checksums;             -- 数据校验和 (off/on)
 data_checksums
----------------
 off
(1 行记录)

SHOW max_connections;            -- 最大连接数
 max_connections
-----------------
 100
(1 行记录)

SHOW shared_buffers;             -- 共享缓冲区大小
 shared_buffers
----------------
 1GB
(1 行记录)

SHOW timezone;                   -- 时区
   TimeZone
---------------
 Asia/Shanghai
(1 行记录)

SHOW data_directory;             -- 数据目录路径
 data_directory
----------------
 /kdb/data
(1 行记录)

SHOW port;                       -- 端口号
 port
-------
 54321
(1 行记录)

7.3 执行升级

$ /opt/Kingbase/ES/V9R2C14/Server/bin/sys_upgrade \
    -b /opt/Kingbase/ES/V9/Server/bin \
    -B /opt/Kingbase/ES/V9R2C14/Server/bin \
    -d /kdb/data -D /kdb/data_V9R2C14 \
    -U system -j 4 -v

Performing Consistency Checks
-----------------------------
Checking cluster versions                                   ok
...
*Clusters are compatible*

Performing Upgrade
-----------------
...
Upgrade Complete

7.4 升级后验证

SELECT '1. 版本' as item, version() as value;
  item   |          value
---------+-------------------------
 1. 版本 | KingbaseES V009R002C014
(1 行记录)

SELECT '2. 兼容模式' as item, current_setting('database_mode') as value;
    item     | value
-------------+--------
 2. 兼容模式 | oracle
(1 行记录)

SELECT '3. 字符编码' as item, current_setting('server_encoding') as value;
    item     | value
-------------+-------
 3. 字符编码 | UTF8
(1 行记录)

SELECT '4. 区域设置' as item, current_setting('lc_ctype') as value;
    item     |    value
-------------+-------------
 4. 区域设置 | zh_CN.UTF-8
(1 行记录)

test=# SELECT '5. 块大小' as item, current_setting('block_size') as value;
   item    | value
-----------+-------
 5. 块大小 | 8192
(1 行记录)

SELECT '6. 段大小' as item, current_setting('segment_size') as value;
   item    | value
-----------+-------
 6. 段大小 | 1GB
(1 行记录)

test=# SELECT '7. WAL段大小' as item, current_setting('wal_segment_size') as value;
     item     | value
--------------+-------
 7. WAL段大小 | 16MB
(1 行记录)

SELECT '8. 大小写敏感' as item, current_setting('enable_ci') as value;
     item      | value
---------------+-------
 8. 大小写敏感 | off
(1 行记录)

SELECT '9. 数据校验和' as item, current_setting('data_checksums') as value;
     item      | value
---------------+-------
 9. 数据校验和 | off
(1 行记录)

SELECT '10. 最大连接数' as item, current_setting('max_connections') as value;
      item      | value
----------------+-------
 10. 最大连接数 | 100
(1 行记录)

SELECT '11. 共享缓冲区' as item, current_setting('shared_buffers') as value;
      item      | value
----------------+-------
 11. 共享缓冲区 | 1GB
(1 行记录)

SELECT '12. 时区' as item, current_setting('timezone') as value;
   item   |     value
----------+---------------
 12. 时区 | Asia/Shanghai
(1 行记录)

7.5 统计信息更新

$ cd ~
$ ./analyze_new_cluster.sh --port 54321

vacuumdb: processing database "test": Generating minimal optimizer statistics (1 target)
vacuumdb: processing database "test": Generating medium optimizer statistics (10 targets)
vacuumdb: processing database "test": Generating default (full) optimizer statistics

Done

7.6 归档恢复验证

$ sed -i 's/^archive_mode = off/archive_mode = on/' /kdb/data_V9R2C14/kingbase.conf
$ /opt/Kingbase/ES/V9R2C14/Server/bin/sys_ctl -D /kdb/data_V9R2C14 restart
$ ksql -U system -d test -c "SELECT sys_switch_wal();"
$ ls -lt /kdb/arclog/ | head -3
total 32768
-rw------- 1 kingbase kingbase 16777216 Mar 26 10:30 000000010000000000000001

八、总结

8.1 关键参数一致性要求

参数检查命令初始化参数
database_modeSHOW database_mode;-m oracle
server_encodingSHOW server_encoding;-E UTF8
lc_ctypeSHOW lc_ctype;--lc-ctype=zh_CN.UTF-8
wal_segment_sizeSHOW wal_segment_size;--wal-segsize=16
enable_ciSHOW enable_ci;off 时不加 --enable-ci
data_checksumsSHOW data_checksums;off 时不加 --data-checksums

8.2 核心流程回顾

升级前准备 → 新版本安装 → 执行升级 → 升级后处理 → 稳定运行
    │            │            │            │
    ├─ 参数检查  ├─ 初始化    ├─ 预检查    ├─ 统计信息更新
    ├─ 数据备份  ├─ 拷贝配置  ├─ 正式升级  ├─ 归档恢复
    ├─ 关闭归档  ├─ 扩展处理  │            ├─ 扩展验证
    └─ 简化认证  └─           └─           └─ 环境变量更新

8.3 关键注意事项

  1. 参数一致性:新库初始化参数必须与旧库完全一致,特别是 enable_cidata_checksums
  2. 备份先行:物理冷备份是最可靠的回退方案
  3. 关闭归档:升级过程中归档必须关闭,关闭前确保 WAL 已归档
  4. 分步验证:预检查通过后再执行正式升级
  5. 统计信息更新:升级后必须执行统计信息更新,否则影响查询性能
  6. 扩展处理:第三方扩展需查阅官方文档确认兼容性,优先使用新版本
  7. 环境变量更新:升级后同步更新 KINGBASE_HOMEKINGBASE_DATA
8.4 常见问题速查
错误信息原因解决方案
Checking database safety function switch is offFATAL: lock file "kingbase.pid" already exists升级工具尝试启动旧库时,发现旧库实例已经在运行,导致无法获取锁文件。必须先停止旧库服务。执行 $OLD_INSTALL_DIR/Server/bin/sys_ctl -D $OLD_DATA_DIR stop -m fast,确认进程退出后,再重新执行 sys_upgrade
旧集簇不使用数据校验和,但新集簇使用数据校验和新库初始化时错误地添加了 --data-checksums 参数,导致新旧库二进制不兼容。删除新数据目录,重新执行 initdb不要添加 --data-checksums 参数。
WARNING: skipping "_kingbase_loginfo"_kingbase_loginfo 是 KingbaseES 内部用于系统日志记录的特殊表,vacuumdb 工具无法对其收集统计信息。正常现象,可忽略,不影响用户业务表的统计信息更新。
analyze_new_cluster.sh: --port: command not found执行统计信息更新脚本时未指定端口参数,或参数格式错误。请指定端口号执行,例如:./analyze_new_cluster.sh --port 54321
ERROR: could not access file "xxx.so"升级后新库启动或查询时,找不到旧库使用的扩展插件动态链接文件。检查新旧库的 shared_preload_libraries 配置,确保新库安装了相同的插件(如 orafce),并将 .so 文件拷贝至新库的 lib 目录。

参考资料

  1. 金仓数据库管理系统 KingbaseES V9 版本说明书(V009R002C014)— 产品版本特性说明
  2. 金仓数据库管理系统 KingbaseES 工具参考手册(V009R002C014)— sys_upgrade 工具详解
  3. KingbaseES 官方文档中心help.kingbase.com.cn/
  4. 金仓技术社区bbs.kingbase.com.cn/