OCP4.2.2升级到OCP4.4.2报错

OCP升级报如下错误,麻烦官方大佬帮看看这个怎么处理叻,docker部署方式,参考的

dataSource LOG ALTER_TABLES sqls SqlTask{ name=cmdb_config, sqls=[
sql 0: ALTER TABLE cmdb_config ADD UNIQUE KEY uk_name (name) GLOBAL
]}
[2026-08-12T14:02:29.009795655] dataSource END ALTER_TABLES sqls:cmdb_config java.sql.SQLException: execute sql task failed. task: cmdb_config, sql + -1:
at com.oceanbase.ocp.bootstrap.core.db.DbInitializer.executeSqlTask(DbInitializer.java:357)
at com.oceanbase.ocp.bootstrap.core.db.DbInitializer.executeSqlTasks(DbInitializer.java:324)
at com.oceanbase.ocp.bootstrap.core.db.DbInitializer.upgrade(DbInitializer.java:241)
at com.oceanbase.ocp.bootstrap.core.db.DbInitializer.initialize(DbInitializer.java:184)
at com.oceanbase.ocp.bootstrap.hooks.OCPInitializer.initDataSource(OCPInitializer.java:231)
at com.oceanbase.ocp.bootstrap.hooks.OCPInitializer.initialize(OCPInitializer.java:86)
at com.oceanbase.ocp.bootstrap.hooks.OCPInitializer.initialize(OCPInitializer.java:191)
at com.oceanbase.ocp.bootstrap.spring.BootstrapRunListener.(BootstrapRunListener.java:60)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
at org.springframework.core.io.support.SpringFactoriesLoader$FactoryInstantiator.instantiate(SpringFactoriesLoader.java:376)
at org.springframework.core.io.support.SpringFactoriesLoader.instantiateFactory(SpringFactoriesLoader.java:224)
at org.springframework.core.io.support.SpringFactoriesLoader.load(SpringFactoriesLoader.java:202)
at org.springframework.core.io.support.SpringFactoriesLoader.load(SpringFactoriesLoader.java:158)
at org.springframework.boot.SpringApplication.getSpringFactoriesInstances(SpringApplication.java:466
)
at org.springframework.boot.SpringApplication.getRunListeners(SpringApplication.java:450)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:309)
at com.oceanbase.ocp.OcpCeServerApplication.main(OcpCeServerApplication.java:25)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.j
ava:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:569)
at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:102)
at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:64)
at org.springframework.boot.loader.launch.PropertiesLauncher.main(PropertiesLauncher.java:580)
Caused by: java.sql.SQLSyntaxErrorException: (conn=286141) Duplicate key name ‘uk_name’
at com.oceanbase.jdbc.internal.util.exceptions.ExceptionFactory.createException(ExceptionFactory.jav
a:110)
at com.oceanbase.jdbc.internal.util.exceptions.ExceptionFactory.create(ExceptionFactory.java:202)
at com.oceanbase.jdbc.OceanBaseStatement.executeBatchExceptionEpilogue(OceanBaseStatement.java:457)
at com.oceanbase.jdbc.OceanBaseStatement.executeBatchExceptionEpilogue(OceanBaseStatement.java:464)
at com.oceanbase.jdbc.OceanBaseStatement.executeBatch(OceanBaseStatement.java:1780)
at com.alibaba.druid.pool.DruidPooledStatement.executeBatch(DruidPooledStatement.java:794)
at com.oceanbase.ocp.bootstrap.util.SQLUtils.executeBatch(SQLUtils.java:144)
at com.oceanbase.ocp.bootstrap.core.db.DbInitializer.lambda$new$1(DbInitializer.java:173)
at com.oceanbase.ocp.bootstrap.core.db.DbInitializer.executeSqlTask(DbInitializer.java:340)
… 27 more
Caused by: com.oceanbase.jdbc.internal.util.exceptions.OceanBaseSqlException: Duplicate key name ‘uk_name’
at com.oceanbase.jdbc.internal.util.exceptions.OceanBaseSqlException.of(OceanBaseSqlException.java:7
9)
at com.oceanbase.jdbc.internal.protocol.AbstractQueryProtocol.exceptionWithQuery(AbstractQueryProtoc
ol.java:207)
at com.oceanbase.jdbc.internal.protocol.AbstractQueryProtocol.executeBatchAggregateSemiColon(Abstrac
tQueryProtocol.java:1201)
at com.oceanbase.jdbc.internal.protocol.AbstractQueryProtocol.executeBatchStmt(AbstractQueryProtocol
.java:1049)
at com.oceanbase.jdbc.OceanBaseStatement.internalBatchExecution(OceanBaseStatement.java:1852)
at com.oceanbase.jdbc.OceanBaseStatement.executeBatch(OceanBaseStatement.java:1767)
… 31 more
Caused by: java.sql.SQLException: Duplicate key name ‘uk_name’
at com.oceanbase.jdbc.internal.protocol.AbstractQueryProtocol.readErrorPacket(AbstractQueryProtocol.
java:2436)
at com.oceanbase.jdbc.internal.protocol.AbstractQueryProtocol.readPacket(AbstractQueryProtocol.java:
2299)
at com.oceanbase.jdbc.internal.protocol.AbstractQueryProtocol.getResult(AbstractQueryProtocol.java:2
187)
at com.oceanbase.jdbc.internal.protocol.AbstractQueryProtocol.executeBatchAggregateSemiColon(Abstrac
tQueryProtocol.java:1198)
… 34 more

ocp是社区版的么?

是的

执行哪一步的报的错 能截个图么?

启动的时候

你们这两个日志 都发一下

只有一个日志文件,另一个没有
bootstrap.log (2.2 MB)

大佬还能升级吗?

这个应该是个bug,你登录到ocp 元数据库的 meta_database库,执行

ALTER TABLE cmdb_config DROP KEY uk_name;

再升级试下

按照旭辉发老师操作一下 从日志来看增加表的唯一索引有冲突 这个执行报错
ALTER TABLE cmdb_config ADD UNIQUE KEY uk_name (name) GLOBAL

执行了这个,删了,启动他又会报这个错

删除后检查一下

SHOW INDEX FROM cmdb_config;

这个好像是其它表,也是这个错

大佬,没有好的处理方式吗?我看不止一个表包错其他表的索引也会报错。

这张表,还是先删除吧,需要连带之前那个uk一起删除 再升级吧

config_properties

这是系统性的 OCP 4.2.2 → 4.4.2 升级问题:OBTableParser.java 解析旧版 SHOW CREATE TABLE 时无法正确识别部分已有的 unique 索引,导致升级脚本重复执行 ADD UNIQUE KEY ... ,只要表上已存在同名 uk 索引就会报错

在 MetaDB 上执行以下存储过程,只删除实际存在的、以 uk_ 开头的唯一索引 ,让升级脚本重新创建:

-- 请先备份元数据库

DELIMITER $$

CREATE PROCEDURE drop_ocp_unique_indexes()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE idx_name VARCHAR(255);
  DECLARE tbl_name VARCHAR(255);

  DECLARE cur CURSOR FOR
    SELECT TABLE_NAME, INDEX_NAME
    FROM information_schema.STATISTICS
    WHERE TABLE_SCHEMA = DATABASE()
      AND INDEX_NAME LIKE 'uk_%'
      AND NON_UNIQUE = 0;

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur;
  read_loop: LOOP
    FETCH cur INTO tbl_name, idx_name;
    IF done THEN
      LEAVE read_loop;
    END IF;
    SET @sql = CONCAT('ALTER TABLE `', tbl_name, '` DROP KEY `', idx_name, '`');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
  END LOOP;
  CLOSE cur;
END$$

DELIMITER ;

CALL drop_ocp_unique_indexes();
DROP PROCEDURE drop_ocp_unique_indexes;

执行完后重启 OCP 4.4.2 容器继续升级即可。

注意事项

  1. 仅对 OCP 独占的 MetaDB 使用:如果该库中有其他业务表也以 uk_ 开头命名唯一索引,上述过程会误删。此时应改用精确列表版本。
  2. 备份:执行前务必对 MetaDB 做快照或逻辑备份。