---
title: "升级前准备 - 开发者中心 ODC V4.4.1 | OceanBase 文档中心"
description: 升级前准备 OceanBase 开发者中心（OceanBase Developer Center，ODC）的升级需要预先确认元数据库和机器环境。 元数据库 部署 Web 版 ODC 时创建了元数据库用于存储使用 ODC 过程中产生的用户数据。 升级 ODC 时使用与部署时相同的元数据库并运行对应版本的 ODC 镜像，…
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*lqS5SYzz_YEAAAAAAAAAAAAADiGDAQ/original) 开发者中心 ODCV 4.4.1

# 升级前准备

更新时间：2026-04-07 18:00:49

[编辑](https://github.com/oceanbase/odc-doc/edit/V4.4.1/zh-CN/1200.upgrade-guide/200.preparation-for-upgrade.md)  

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 升级的元数据库数据升级实现了可重入性设计，如果您期望可以快速的完成升级过程的历史数据迁移，那么可以预先执行一些数据迁移动作，这些数据迁移动作不会影响旧版本的运行。

1. 检查确认是否需要预先进行历史数据迁移。

   ODC 版本升级的元数据库数据升级是自动进行的，某些功能的改动可能会引入较多的数据迁移和修正。ODC V4.4.1 的主要元数据升级来自于工单/作业模块的重构，查询当前数据库中的数据量信息，判断是否需要预先进行数据迁移。

      - SQL 计划被重新设计，作为作业模块的功能，历史数据会由工单模块迁移到作业模块。执行如下命令，如果查询的数据量大于 100000, 建议您预先进行数据迁移。详细操作步骤，请参见步骤 2。

       ```sql
       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。

       ```sql
       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。

       ```sql
       use odc_metadb;
       select count(1)  FROM schedule_task WHERE job_group IN ('SQL_PLAN', 'PARTITION_PLAN') AND job_id IS NULL

       ```
 2. SQL 计划历史数据手动迁移，重复执行该 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 直到没有更多的数据需要删除。

   ```sql
   delete from schedule_task where job_group = 'SQL_PLAN' and job_id < 0 order by job_id asc limit 5000

   ```
 3. 分区计划历史数据手动迁移，重复执行该 SQL 直到没有更多数据插入。

   ```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 直到没有更多的数据需要删除。

   ```sql
   delete from schedule_task where job_group = 'PARTITION_PLAN' and job_id < 0 order by job_id asc limit 5000

   ```
 4. 作业模块无用数据清理。

      1. 创建无用数据备份表。

        ```sql
        CREATE TABLE IF NOT EXISTS `schedule_task_backup` LIKE `schedule_task`;

        ```
      2. 备份数据，重复执行如下SQL直到没有更多数据插入。

        ```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

        ```
      3. 删除主表数据，重复执行如下 SQL 直到没有更多数据删除。

        ```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

        ```
      4. 如果您想回滚手动清理的数据，重复执行如下 SQL 直到没有更多数据插入。

        ```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;

        ```

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
