升级Artifactory 6.23.42至7.41.14时Derby数据库v60迁移失败
Artifactory Pro 6.23.42 升级至7.41.14(Derby数据库)失败解决
环境信息
- CentOS 7.9.2009
- Derby数据库
- 使用RPM包升级:
- 原版本:
jfrog-artifactory-pro-6.23.42.rpm - 目标版本:
jfrog-artifactory-pro-7.41.14.rpm(为规避CentOS7对JDK17的兼容性问题,选择支持JDK11的最后一个版本)
- 原版本:
升级操作步骤
- 停止Artifactory服务:
systemctl stop artifactory - 执行RPM升级:
yum update jfrog-artifactory-pro-7.41.14.rpm - 启动服务:
systemctl start artifactory
报错现象
migration.log未记录错误信息- 数据库迁移执行到
v60转换器时失败,核心错误:Failed to execute query: 'ALTER TABLE' cannot be performed on 'REPLICATION_ERRORS' because it does not exist. artifactory-service.log中完整报错(翻译后):2023-04-06T17:18:15.512Z [jfrt ] [INFO ] [af075423d2f70fd8] [o.j.c.AbstractDbConverter:51 ] [Catalina-utility-2 ] - 转换器`v59`执行完成,状态为`SKIPPED`。 2023-04-06T17:18:15.531Z [jfrt ] [INFO ] [af075423d2f70fd8] [o.j.c.AbstractDbConverter:36 ] [Catalina-utility-2 ] - 开始执行转换器v60,描述:"为表`replication_errors`添加列`event_category`。" 2023-04-06T17:18:15.532Z [jfrt ] [INFO ] [af075423d2f70fd8] [j.c.u.PreDefinedConverters:398] [Catalina-utility-2 ] - 在/templates/default/add_column.tpl查找默认数据库转换模板 2023-04-06T17:18:15.534Z [jfrt ] [INFO ] [af075423d2f70fd8] [j.c.u.PreDefinedConverters:404] [Catalina-utility-2 ] - 在/templates/derby/add_column.tpl查找Derby数据库专属转换模板 2023-04-06T17:18:15.539Z [jfrt ] [WARN ] [af075423d2f70fd8] [o.j.s.u.DbStatementUtils:62 ] [Catalina-utility-2 ] - 执行查询失败:'ALTER TABLE'无法执行于'REPLICATION_ERRORS',因为该表不存在。 ALTER TABLE replication_errors ADD COLUMN event_category VARCHAR(225) 2023-04-06T17:18:15.540Z [jfrt ] [INFO ] [af075423d2f70fd8] [o.j.c.AbstractDbConverter:51 ] [Catalina-utility-2 ] - 转换器`v60`执行完成,状态为`FAILED`。 2023-04-06T17:18:15.552Z [jfrt ] [ERROR] [af075423d2f70fd8] [d.c.m.ConverterManagerImpl:278] [Catalina-utility-2 ] - 转换失败。请分析错误后重新启动Artifactory。错误信息:Failed to convert v60 : Failed to convert v60 2023-04-06T17:18:15.557Z [jfrt ] [ERROR] [af075423d2f70fd8] [tifactoryHomeConfigListener:55] [Catalina-utility-2 ] - 初始化Artifactory主目录失败,捕获异常: java.lang.IllegalStateException: Failed to convert v60 : Failed to convert v60 at org.artifactory.storage.db.converter.markers.ConverterManagerImpl.handleException(ConverterManagerImpl.java:281) at org.artifactory.storage.db.converter.markers.ConverterManagerImpl.serviceConvert(ConverterManagerImpl.java:238) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655) at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658) at org.artifactory.storage.db.converter.markers.ConverterManagerImpl.convertDatabase(ConverterManagerImpl.java:156) at org.artifactory.lifecycle.storage.db.init.PostDbSchemaInitializationManager.convertAndInit(PostDbSchemaInitializationManager.java:61) at org.artifactory.lifecycle.storage.db.init.HaInitLock.runInsideInitLockIfNeeded(HaInitLock.java:110) at org.artifactory.lifecycle.storage.db.init.PostDbSchemaInitializationManager.init(PostDbSchemaInitializationManager.java:50) at org.artifactory.lifecycle.webapp.servlet.BasicConfigurationManager.initArtifactoryInstallation(BasicConfigurationManager.java:154) at org.artifactory.lifecycle.webapp.servlet.BasicConfigurationManager.initialize(BasicConfigurationManager.java:126) at org.artifactory.lifecycle.webapp.servlet.ArtifactoryHomeConfigListener.initBasicConfigManager(ArtifactoryHomeConfigListener.java:61) at org.artifactory.lifecycle.webapp.servlet.ArtifactoryHomeConfigListener.contextInitialized(ArtifactoryHomeConfigListener.java:53) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4768) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5230) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:726) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:698) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:696) at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:690) at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1889) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:829) Caused by: org.jfrog.converter.DbConverterRuntimeException: Failed to convert v60 at org.artifactory.storage.db.DatabaseConverterAdapter.convert(DatabaseConverterAdapter.java:49) at org.artifactory.storage.db.converter.markers.ConverterManagerImpl.serviceConvert(ConverterManagerImpl.java:234) ... 25 common frames omitted Caused by: org.jfrog.converter.DbConverterExecutionException: Failed to convert v60 at org.jfrog.converter.util.DbConverterUtil.executeConverters(DbConverterUtil.java:79) at org.jfrog.converter.util.DbConverterUtil.calculateAndExecute(DbConverterUtil.java:114) at org.artifactory.storage.db.DatabaseConverterAdapter.convert(DatabaseConverterAdapter.java:44) ... 26 common frames omitted Caused by: org.jfrog.converter.DbConverterExecutionException: Failed to convert v60 at org.jfrog.converter.predefined.PreDefinedDbConverter.executeConverter(PreDefinedDbConverter.java:37) at org.jfrog.converter.AbstractDbConverter.convert(AbstractDbConverter.java:39) at org.jfrog.converter.util.DbConverterUtil.executeConverters(DbConverterUtil.java:75) ... 28 common frames omitted Caused by: java.sql.SQLSyntaxErrorException: 'ALTER TABLE'无法执行于'REPLICATION_ERRORS',因为该表不存在。 at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source) at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source) at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source) at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source) at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source) at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source) at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source) at org.apache.derby.impl.jdbc.EmbedStatement.executeLargeUpdate(Unknown Source) at org.apache.derby.impl.jdbc.EmbedStatement.executeUpdate(Unknown Source) at com.zaxxer.hikari.pool.ProxyStatement.executeUpdate(ProxyStatement.java:120) at com.zaxxer.hikari.pool.HikariProxyStatement.executeUpdate(HikariProxyStatement.java) at org.jfrog.storage.dbtype.DefaultDbTypeHelper.executeUpdateQuery(DefaultDbTypeHelper.java:68) at org.jfrog.storage.util.DbStatementUtils.executeSqlStream(DbStatementUtils.java:57) at org.jfrog.converter.predefined.PreDefinedDbConverter.executeConverter(PreDefinedDbConverter.java:35) ... 30 common frames omitted Caused by: org.apache.derby.iapi.error.StandardException: 'ALTER TABLE'无法执行于'REPLICATION_ERRORS',因为该表不存在。 at org.apache.derby.iapi.error.StandardException.newException(Unknown Source) at org.apache.derby.iapi.error.StandardException.newException(Unknown Source) at org.apache.derby.impl.sql.compile.DDLStatementNode.justGetDescriptor(Unknown Source) at org.apache.derby.impl.sql.compile.DDLStatementNode.getTableDescriptor(Unknown Source) at org.apache.derby.impl.sql.compile.DDLStatementNode.getTableDescriptor(Unknown Source) at org.apache.derby.impl.sql.compile.AlterTableNode.bindStatement(Unknown Source) at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source) at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source) at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(Unknown Source) ... 38 common frames omitted 2023-04-06T17:18:15.577Z [jfrt ] [ERROR] [af075423d2f70fd8] [actoryContextConfigListener:90] [Catalina-utility-2 ] - 初始化Artifactory上下文失败:Artifactory主目录未初始化。
问题原因
在Artifactory 6.x版本中,若从未配置过仓库复制功能,系统不会自动创建REPLICATION_ERRORS表。但7.x版本的升级脚本默认认为该表存在,尝试执行ALTER TABLE添加字段时触发错误,导致迁移中断。
解决步骤
- 停止Artifactory服务(若当前处于启动失败状态,确保服务已停止):
systemctl stop artifactory - 连接到Derby数据库:
在Derby的交互式工具中执行连接命令:cd /var/opt/jfrog/artifactory/bin ./ijconnect 'jdbc:derby:/var/opt/jfrog/artifactory/data/db/artifactory'; - 创建
REPLICATION_ERRORS表,使用6.x版本的标准表结构:CREATE TABLE REPLICATION_ERRORS ( ID BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), REPO_PATH VARCHAR(1024) NOT NULL, ERROR_TYPE VARCHAR(255) NOT NULL, ERROR_MESSAGE CLOB, CREATED TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, NODE_ID VARCHAR(255), CONSTRAINT REPLICATION_ERRORS_PK PRIMARY KEY (ID) ); - 退出Derby交互式工具:
exit; - 启动Artifactory服务:
systemctl start artifactory - 检查
/var/opt/jfrog/artifactory/logs/artifactory-service.log,确认数据库迁移完成,服务正常启动。
内容的提问来源于stack exchange,提问作者8None1
相关产品推荐
相关产品推荐

