基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
开始升级
更新时间:2025-10-13 15:22:02
本文主要介绍使用升级脚本升级 OceanBase 数据库的操作步骤。
前提条件
OBServer 节点中安装 Python 2.7 的环境,并且已安装以下模块(Modules):
datetimesysosmysql.connectorlogginggetopttime
操作步骤
注意
在下面步骤执行升级脚本时,指定的 -u 参数必须是 sys 租户有读写及 SUPER 权限的用户。
步骤一:备份集群配置项
升级流程开始前需要备份下列配置项旧值,用于执行升级流程后还原:
server_permanent_offline_timeenable_rebalanceenable_rereplication
获取集群级别配置项的语句如下:
obclient [(none)]> SELECT SVR_IP,ZONE,NAME,VALUE FROM OCEANBASE.GV$OB_PARAMETERS WHERE NAME IN ("server_permanent_offline_time", "enable_rebalance", "enable_rereplication");
+------------+-------+-------------------------------+-------+
| SVR_IP | ZONE | NAME | VALUE |
+------------+-------+-------------------------------+-------+
| 10.10.10.2 | zone1 | enable_rebalance | True |
| 10.10.10.2 | zone1 | enable_rereplication | True |
| 10.10.10.2 | zone1 | server_permanent_offline_time | 3600s |
| 10.10.10.1 | zone2 | enable_rebalance | True |
| 10.10.10.1 | zone2 | enable_rereplication | True |
| 10.10.10.1 | zone2 | server_permanent_offline_time | 3600s |
| 10.10.10.3 | zone3 | enable_rebalance | True |
| 10.10.10.3 | zone3 | enable_rereplication | True |
| 10.10.10.3 | zone3 | server_permanent_offline_time | 3600s |
+------------+-------+-------------------------------+-------+
9 rows in set
步骤二:上传并安装目标 RPM 包
使用
scp命令将目标版本的 RPM 包解压到 OBServer 节点中。其中
$rpm_name表示 RPM 包的名称,observer_ip表示 OBServer 节点的 IP,$rpm_dir表示存放 RPM 包的目录。[root@xxx /]# scp $rpm_name admin@observer_ip:/$rpm_dir说明
请联系技术支持人员获取目标版本的 OceanBase 安装包。
安装目标版本 RPM。
其中
$rpm_name表示 RPM 包的名称[root@xxx $rpm_dir]# rpm -Uvh $rpm_name示例如下:
[root@xxx $rpm_dir]# rpm -Uvh oceanbase-4.1.0.0-100001022023032415.el7.x86_64.rpm Preparing... ################################# [100%] Updating / installing... 1:oceanbase-4.1.0.0-100001022023032################################# [ 50%] Cleaning up / removing... 2:oceanbase-4.0.0.0-102000042023022################################# [100%]说明
升级相关脚本和
oceanbase_upgrade_dep.yml文件存放/home/admin/oceanbase/etc目录下。目录/home/admin/oceanbase/etc为 OceanBase 数据库的默认安装目录。重复步骤 1~2,直至所有 OBServer 节点中安装目标版本 RPM 包。
步骤三:查看各个版本升级依赖关系
通过 /home/admin/oceanbase/etc 下的 oceanbase_upgrade_dep.yml 文件查看 OceanBase 各个版本升级依赖关系。
示例如下:
[root@xxx /]# cd /home/admin/oceanbase/etc
[root@xxx /home/admin/oceanbase/etc]# cat oceanbase_upgrade_dep.yml
# 描述oceanbase各个版本升级依赖关系
# 参考文档 release/ptw5y7
# 对于每一个正式发布的ob版本,在下面的yaml文档中添加一项,包括如下属性:
# * version: 待升级的版本,或者升级过程中经过的版本;一般用A.B.C的版本号,如果是A.B.C-D的形式,表示build号必须大于等于D
# * can_be_upgraded_to: 表示该版本经过OB QA兼容性测试,可以*直接*升级到的ob版本号,是一个列表可以包括多个版本
# * deprecated: 缺省为False。如果为True,表示这个版本已经废除。可以作
# 为升级的起点,可以作为升级过度版本,但是不能作为升级目标版本。
# * require_from_binary: 缺省为False。如果为True,表示升级过程中如果作为中间版本,除了运行upgrade脚本,还需要把observer也升级到该版本
#
# OCP的OB升级模块会读取本文件,给定升级的起始版本和目标版本,自动在满
# 足上述约束的情况下寻找一个升级的最短路径。基本算法是:
# 基于如下描述构建一个图,每个版本一个结点,can_be_upgraded_to关系定义
# 一条边,寻找起始版本和升级目标两个版本之间的最短路径。除了起始点,其
# 他节点不能是deprecated。如果有A.B.C和A.B.C-D两种节点匹配,优先选择后
# 者。
#
- version: 4.0.0.0
can_be_upgraded_to:
- 4.1.0.0
require_from_binary:
value: True
when_come_from: [4.0.0.0]
- version: 4.1.0.0
require_from_binary:
value: True
when_come_from: [4.0.0.0, 4.1.0.0]
步骤四:执行脚本 upgrade_checker.py
指定系统租户直连 OBServer 节点的登录信息,执行 upgrade_checker.py 脚本进行升级前置检查,脚本执行成功表示可以继续升级。
示例如下:
[root@xxx /]# cd /home/admin/oceanbase/etc
[root@xxx /home/admin/oceanbase/etc]# python upgrade_checker.py -h 127.0.0.1 -P 2881 -u xxxx@sys -p******
步骤五:执行脚本 upgrade_pre.py
指定系统租户直连 OBServer 节点的登录信息,执行 upgrade_pre.py 脚本,脚本执行成功表示可以继续升级。
示例如下:
[root@xxx /home/admin/oceanbase/etc]# python upgrade_pre.py -h 127.0.0.1 -P 2881 -u xxxx@sys -p******
upgrade_pre.py 脚本会执行以下命令及动作:
alter system begin upgrade。alter system begin rolling upgrade。special pre action:关闭及调整配置项。health check: 集群级别健康检查。
完整的 upgrade_pre.py 脚本能力如下所示:
./upgrade_pre.py [OPTIONS]
-I, --help Display this help and exit.
-V, --version Output version information and exit.
-h, --host=name Connect to host.
-P, --port=name Port number to use for connection.
-u, --user=name User for login.
-p, --password=name Password to use when connecting to server. If password is
not given it's empty string "".
-t, --timeout=name Cmd/Query execute timeout(s).
-m, --module=name Modules to run. Modules should be a string combined by some of
the following strings:
1. begin_upgrade
2. begin_rolling_upgrade
3. special_action
4. health_check
5. all: "all" represents that all modules should be run.
They are splitted by ",".
For example: -m all, or --module=begin_upgrade,begin_rolling_upgrade,special_action
-l, --log-file=name Log file path. If log file path is not given it's ./upgrade_pre.log
Maybe you want to run cmd like that:
./upgrade_pre.py -h 127.0.0.1 -P 2881 -u ****** -p ******
步骤六:集群升级
按 Zone 升级, 每个 Zone 都要按照下面的步骤执行一遍,以 zone1 为例。
执行集群级别健康检查。
[root@xxx /home/admin/oceanbase/etc]# python upgrade_health_checker.py -h 127.0.0.1 -P 2881 -u xxxx@sys -p******停止 Zone(
STOP ZONE)。使用
root用户登录到集群的sys租户,使用以下命令停止 Zone,其中zone_name为 Zone 的名称。ALTER SYSTEM STOP ZONE 'zone_name';示例如下:
obclient [(none)]> ALTER SYSTEM STOP ZONE 'zone1'; Query OK, 0 rows affectedSTOP ZONE命令会等主都切走才返回成功。Zone 内机器停进程,替换新版本 binary 重启。
停止 observer 进程,然后重新启动 observer 进程。
示例如下:
停止 observer 进程。
[root@xxx /home/admin/oceanbase/etc]# kill -9 `pidof observer`重新启动 observer 进程。
[root@xxx /home/admin/oceanbase/etc]# su - admin -bash-4.2$ cd /home/admin/oceanbase && /home/admin/oceanbase/bin/observer说明
再次启动 observer 进程时不需要指定启动参数,因为之前的启动参数已经写到参数文件里了。
执行 Zone 级别健康检查。
[root@xxx /home/admin/oceanbase/etc]# python upgrade_health_checker.py -h 127.0.0.1 -P 2881 -u xxxx@sys -p****** -z 'zone1'Zone 级别健康检查基本上复用了集群级别健康检查逻辑,主要是校验指定 Zone 的所有机器相关状态。
启动 Zone(
start zone)。使用
root用户登录到集群的sys租户,使用以下命令启动 Zone,其中zone_name为 Zone 的名称。ALTER SYSTEM START ZONE 'zone_name';示例如下:
obclient [(none)]> ALTER SYSTEM START ZONE 'zone1'; Query OK, 0 rows affected重复步骤 1~5,直至所有 Zone 升级完成。
步骤七:执行脚本 upgrade_post.py
指定系统租户直连 OBServer 节点的登录信息,执行 upgrade_post.py 脚本完成主要的升级操作及相关检查。
示例如下:
[root@xxx /home/admin/oceanbase/etc]# python upgrade_post.py -h 127.0.0.1 -P 2881 -u xxxx@sys -p******
注意
在执行升级脚本 upgrade_post.py 时,若出现错误,其原因很可能是 RS 切主过。建议通过以下步骤进行排查与修复:
- 可以执行
SELECT * FROM oceanbase.DBA_OB_TENANT_JOBS WHERE job_type = 'upgrade_all' ORDER BY job_id DESC LIMIT 1;验证升级任务状态。若JOB_STATUS显示为inprogress,且MODIFY_TIME为最近时间(与当前时间间隔较短),则可以手动执行一下ALTER SYSTEM RUN UPGRADE JOB 'UPGRADE_ALL';命令解决这个问题。 - 重新执行升级脚本。
该脚本会完成主要的升级操作及相关检查,该脚本会完成以下升级动作。
- 集群级别健康检查。
alter system end rolling upgrade。- 按租户执行 begin upgrade。
- 按租户执行系统变量修正。
- 按租户执行系统表修正。
- 按租户执行虚拟表/视图修正。
- 按租户执行版本相关升级动作。
- 按租户执行内部表自检操作。
- 按租户结束 end upgrade。
- alter system end upgrade:结束集群升级状态。
- upgrade post check:重新打开升级过程中禁用的部分配置项,并执行检查。
上述第 3~5、7、9 步在下列升级场景下不执行:
- 同版本升级。
- 跨版本升级,原版本和目标版本的数据版本一致。
完整的 upgrade_post.py 脚本能力如下所示:
./upgrade_post.py [OPTIONS]
-I, --help Display this help and exit.
-V, --version Output version information and exit.
-h, --host=name Connect to host.
-P, --port=name Port number to use for connection.
-u, --user=name User for login.
-p, --password=name Password to use when connecting to server. If password is
not given it's empty string "".
-t, --timeout=name Cmd/Query execute timeout(s).
-m, --module=name Modules to run. Modules should be a string combined by some of
the following strings:
1. health_check
2. end_rolling_upgrade
3. tenant_upgrade
4. end_upgrade
5. post_check
6. all: "all" represents that all modules should be run.
They are splitted by ",".
For example: -m all, or --module=health_check,begin_rolling_upgrade
-l, --log-file=name Log file path. If log file path is not given it's ./upgrade_pre.log
Maybe you want to run cmd like that:
./upgrade_post.py -h 127.0.0.1 -P 2881 -u *** -p ******
步骤六:还原集群配置项
基于 步骤一 备份的配置项旧值,还原相关配置项。
ALTER SYSTEM SET server_permanent_offline_time = xxx;
ALTER SYSTEM SET enable_rebalance = xxx;
ALTER SYSTEM SET enable_rereplication = xxx;
示例如下:
obclient [(none)]> ALTER SYSTEM SET server_permanent_offline_time = '3600s';
Query OK, 0 rows affected
obclient [(none)]> ALTER SYSTEM SET enable_rebalance = 'True';
Query OK, 0 rows affected
obclient [(none)]> ALTER SYSTEM SET enable_rereplication = 'True';
Query OK, 0 rows affected
后续操作
升级后检查
验证是否升级完成,请参见 升级后检查。
重新配置 cgroup
如果在升级前 OceanBase 集群配置了 cgroup,那么在 OceanBase 集群升级后,需要重新配置 cgroup。详细信息,参见 配置 cgroup。