基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
升级前准备
更新时间:2026-04-07 18:00:49
OceanBase 开发者中心(OceanBase Developer Center,ODC)的升级需要预先确认元数据库和机器环境。
元数据库
部署 Web 版 ODC 时创建了元数据库用于存储使用 ODC 过程中产生的用户数据。
升级 ODC 时使用与部署时相同的元数据库并运行对应版本的 ODC 镜像,在升级前,请先确认元数据库的租户名、租户所在的集群名、数据库名称、用户名和密码等信息。
说明
- ODC V3.3.0 之后版本提供变更流程和操作审计等企业级管控能力。
- ODC V3.3.1 之后版本解除对 MetaDB 版本的限制。
- MetaDB 所在 OceanBase 租户规格推荐 2C8G 及以上配置,配置过低容易导致性能问题。
机器环境
Web 版 ODC 运行环境配置,按照 ODC 用户数量的经验值:
| ODC 用户数量 | 服务器类型 | 服务器数量 | 功能最低配置 | 性能最低配置 |
|---|---|---|---|---|
| 20 | ODC Docker 部署服务器 | 1 台,可复用 OCP 管控服务器 | 2C,4GB 内存 | 4C,16GB 内存 |
| 100 | ODC Docker 部署服务器 | 3 台,可复用 OCP 管控服务器 | 4C,16GB 内存 | 8C,32GB 内存 |
| 500 | ODC Docker 部署服务器 | 3 台,可复用 OCP 管控服务器 | 8C,32GB 内存 | 16C,64GB 内存 |
更多用户视使用情况调整资源。
说明
- 实际资源消耗取决于并发用户数量和用户使用的功能,表格中的配置是供参考的经验值。
- Web 版 ODC 需要运行在以上规格的服务器上,因此在升级 ODC 应用时请确认机器环境。
- 升级 ODC 应用时需重新在机器上拉取和运行 ODC 镜像,因此在升级前请确认机器安装了 Docker 并可以正常运行。
(可选)升级预操作
ODC V4.4.1 升级的元数据库数据升级实现了可重入性设计,如果您期望可以快速的完成升级过程的历史数据迁移,那么可以预先执行一些数据迁移动作,这些数据迁移动作不会影响旧版本的运行。
检查确认是否需要预先进行历史数据迁移。
ODC 版本升级的元数据库数据升级是自动进行的,某些功能的改动可能会引入较多的数据迁移和修正。ODC V4.4.1 的主要元数据升级来自于工单/作业模块的重构,查询当前数据库中的数据量信息,判断是否需要预先进行数据迁移。
SQL 计划被重新设计,作为作业模块的功能,历史数据会由工单模块迁移到作业模块。执行如下命令,如果查询的数据量大于 100000, 建议您预先进行数据迁移。详细操作步骤,请参见步骤 2。
use odc_metadb; select count(1) from flow_instance where parent_instance_id in (select id from schedule_schedule where job_type in 'SQL_PLAN');分区计划也进行了重新设计,执行如下命令,如果查询的数据量大于 100000, 建议您预先进行数据迁移。详细操作步骤,请参见步骤 3。
use odc_metadb; select count(1) from flow_instance where parent_instance_id in (select distinct flow_instance_id from partitionplan);作业模块也可能存在一些历史工单无用数据,执行如下 SQL 获取数据。如果查询的数据量大于 100000, 建议您可以执行如下 SQL 进行数据迁移。详细操作操作,请参见步骤 4。
use odc_metadb; select count(1) FROM schedule_task WHERE job_group IN ('SQL_PLAN', 'PARTITION_PLAN') AND job_id IS NULL
SQL 计划历史数据手动迁移,重复执行该 SQL 直到没有更多数据插入。
#1. 查询 sql 计划的子任务(数据库变更)。 #2. 获取 sqlplan 的子任务相关信息。 #3. 联表查询,循环批量查询批量插入。 INSERT INTO schedule_task ( job_group, job_name, parameters_json, status, executor, fire_time, progress_percentage, result_json, create_time, update_time, job_id ) SELECT 'SQL_PLAN' AS job_group, CAST(plan_data.schedule_id AS CHAR) AS job_name, tt.parameters_json AS parameters_json, CASE WHEN tt.status IN ('FAILED', 'EXEC_TIMEOUT', 'CANCELED', 'DONE') THEN tt.status ELSE 'CANCELED' END AS status, tt.executor, COALESCE(tt.last_heartbeat_time, tt.create_time) AS fire_time, COALESCE(tt.progress_percentage, 0) AS progress_percentage, tt.result_json, tt.create_time, tt.update_time AS update_time, -plan_data.flow_instance_id AS job_id FROM ( SELECT fi.id AS flow_instance_id, ss.id AS schedule_id FROM flow_instance fi JOIN schedule_schedule ss ON fi.parent_instance_id = ss.id WHERE ss.job_type = 'SQL_PLAN' AND fi.id > (SELECT COALESCE(-MIN(job_id), 0) FROM schedule_task WHERE job_group = 'SQL_PLAN') ORDER BY fi.id LIMIT ? ) plan_data JOIN flow_instance_node_task fint ON fint.flow_instance_id = plan_data.flow_instance_id JOIN task_task tt ON tt.id = fint.task_task_id WHERE fint.task_type = 'ASYNC' AND fint.is_start_endpoint = 1;如果您想回滚手动迁移的 SQL 计划历史数据,可以执行如下 SQL 直到没有更多的数据需要删除。
delete from schedule_task where job_group = 'SQL_PLAN' and job_id < 0 order by job_id asc limit 5000分区计划历史数据手动迁移,重复执行该 SQL 直到没有更多数据插入。
#1. 查询历史分区计划的 schedule_id,以及分区计划下的数据库变更工单(parent_flow_id = 分区计划的 flow_instance_id)。 #2. 查询 task_task 关联信息,整合成 schedule_task 所对应的字段。 #3. 通过应用层绑定 schedule_id 作为 job_name 批量插入。 INSERT INTO schedule_task ( job_group, job_name, parameters_json, status, executor, fire_time, progress_percentage, result_json, create_time, update_time, job_id ) SELECT 'PARTITION_PLAN' AS job_group, CAST(plan_data.schedule_id AS CHAR) AS job_name, tt.parameters_json AS parameters_json, tt.status AS status, tt.executor, COALESCE(tt.last_heartbeat_time, tt.create_time) AS fire_time, COALESCE(tt.progress_percentage, 0) AS progress_percentage, tt.result_json, tt.create_time, tt.update_time AS update_time, -plan_data.flow_instance_id AS job_id FROM ( SELECT fi.id AS flow_instance_id, mapped.schedule_id FROM flow_instance fi JOIN ( SELECT p.flow_instance_id, COALESCE( MAX(CASE WHEN COALESCE(ptp.strategy, 'CREATE') = 'CREATE' THEN pt.schedule_id END), MAX(pt.schedule_id) ) AS schedule_id FROM partitionplan p JOIN partitionplan_table pt ON p.id = pt.partitionplan_id LEFT JOIN partitionplan_table_partitionkey ptp ON pt.id = ptp.partitionplan_table_id GROUP BY p.flow_instance_id ) mapped ON fi.parent_instance_id = mapped.flow_instance_id WHERE mapped.schedule_id IS NOT NULL AND fi.id > (SELECT COALESCE(-MIN(job_id), 0) FROM schedule_task WHERE job_group = 'PARTITION_PLAN') ORDER BY fi.id LIMIT ? ) plan_data JOIN flow_instance_node_task fint ON fint.flow_instance_id = plan_data.flow_instance_id JOIN task_task tt ON tt.id = fint.task_task_id WHERE tt.task_type = 'ASYNC';如果您想回滚手动迁移的分区计划历史数据,可以执行如下 SQL 直到没有更多的数据需要删除。
delete from schedule_task where job_group = 'PARTITION_PLAN' and job_id < 0 order by job_id asc limit 5000作业模块无用数据清理。
创建无用数据备份表。
CREATE TABLE IF NOT EXISTS `schedule_task_backup` LIKE `schedule_task`;备份数据,重复执行如下SQL直到没有更多数据插入。
REPLACE INTO schedule_task_backup ( id, job_name, job_group, parameters_json, status, executor, fire_time, progress_percentage, result_json, create_time, update_time, job_id ) SELECT id, job_name, job_group, parameters_json, status, executor, fire_time, progress_percentage, result_json, create_time, update_time, job_id FROM schedule_task WHERE job_group IN ('SQL_PLAN', 'PARTITION_PLAN') AND job_id IS NULL AND id > (SELECT COALESCE(MAX(id), 0) FROM `schedule_task_backup`) ORDER BY id LIMIT 10000删除主表数据,重复执行如下 SQL 直到没有更多数据删除。
DELETE FROM schedule_task WHERE job_group IN ('SQL_PLAN', 'PARTITION_PLAN') AND job_id IS NULL and id <= (SELECT COALESCE(MAX(id), 0) FROM `schedule_task_backup`) ORDER BY id LIMIT 10000如果您想回滚手动清理的数据,重复执行如下 SQL 直到没有更多数据插入。
INSERT INTO schedule_task ( id, job_name, job_group, parameters_json, status, executor, fire_time, progress_percentage, result_json, create_time, update_time, job_id ) SELECT id, job_name, job_group, parameters_json, status, executor, fire_time, progress_percentage, result_json, create_time, update_time, job_id FROM schedule_task_backup WHERE id > (SELECT COALESCE(MAX(id), 0) FROM `schedule_task` where job_id is NULL and id <= (select max(bak.id) from schedule_task_backup as bak)) ORDER BY id LIMIT 10;