由于 "Unknown column 'UM_USER_ID' in 'field list'",将 WSO2 IS 5.9 升级到 WSO2 IS 5.10 失败

Upgrading WSO2 IS 5.9 to WSO2 IS 5.10 failed due to "Unknown column 'UM_USER_ID' in 'field list'"

我正在尝试将我现有的 WSO2 IS 5.9 实例升级到 WSO2 IS 5.10。但是,迁移失败并显示 JDBC 错误 "Unknown column 'UM_USER_ID' in 'field list",即使我完全按照 https://is.docs.wso2.com/en/latest/setup/migration-guide 的迁移指南进行操作。

从外观上看,WSO2 似乎在 运行 升级数据库的实际迁移任务之前就崩溃了,最终 'UM_USER_ID' 列不存在。

不知道有没有人有线索?

以下是我的环境和实际错误的详细信息:

以下是日志文件中的实际异常:

TID:[-1234] [] [2020-04-03 17:11:25,228] [] INFO {org.wso2.carbon.core.internal.CarbonCoreActivator} - 启动 WSO2 Carbon ...
TID:[-1] [] [2020-04-03 17:11:24,348] [] INFO {org.ops4j.pax.logging.spi.support.EventAdminConfigurationNotifier} - 发送事件管理员通知(配置成功)到 org/ops4j/pax/logging/Configuration
TID:[-1234] [] [2020-04-03 17:11:25,267] [] INFO {org.wso2.carbon.core.internal.CarbonCoreActivator} - 操作系统:Linux 4.15.0-76-generic , AMD64
TID:[-1234] [] [2020-04-03 17:11:25,268] [] 信息 {org.wso2.carbon.core.internal.CarbonCoreActivator} - Java 主页:/usr/lib/jvm/java-8-openjdk-amd64/jre
TID:[-1234] [] [2020-04-03 17:11:25,271] [] 信息 {org.wso2.carbon.core.internal.CarbonCoreActivator} - Java 版本:1.8.0_242
TID:[-1234] [] [2020-04-03 17:11:25,273] [] INFO {org.wso2.carbon.core.internal.CarbonCoreActivator} - Java VM:OpenJDK 64 位服务器 VM 25.242- b08,私人建筑
TID:[-1234] [] [2020-04-03 17:11:25,275] [] 信息 {org.wso2.carbon.core.internal.CarbonCoreActivator} - Carbon 主页:/opt/wso2is
TID:[-1234] [] [2020-04-03 17:11:25,288] [] 信息 {org.wso2.carbon.core.internal.CarbonCoreActivator} - Java 临时目录:/opt/wso2is/tmp
TID:[-1234] [] [2020-04-03 17:11:25,288] [] 信息 {org.wso2.carbon.core.internal.CarbonCoreActivator} - 用户:root,en-US,Etc/UTC
TID: [-1] [] [2020-04-03 17:11:25,769] [] INFO {org.wso2.carbon.crypto.provider.internal.DefaultCryptoProviderComponent} - 'CryptoService.Secret' 属性 尚未设置。 'org.wso2.carbon.crypto.provider.SymmetricKeyInternalCryptoProvider' 不会注册为内部加密提供商。如果提供者需要注册,请设置秘密。
TID: [-1] [] [2020-04-03 17:11:26,187] [] INFO {org.wso2.carbon.event.output.adapter.kafka.internal.ds.KafkaEventAdapterServiceDS} - 成功部署Kafka输出事件适配器服务
TID:[-1] [] [2020-04-03 17:11:27,225] [] INFO {org.wso2.carbon.identity.oauth.uma.grant.internal.UMA2GrantServiceComponent} - 策略评估器注册成功:DefaultPolicyEvaluator
TID:[-1] [] [2020-04-03 17:11:27,225] [] INFO {org.wso2.carbon.identity.oauth.uma.grant.internal.UMA2GrantServiceComponent} - UMA Grant 组件已成功激活。
TID:[-1234] [] [2020-04-03 17:11:27,844] [] INFO {org.wso2.carbon.ldap.server.DirectoryActivator} - 嵌入式 LDAP 已禁用。
TID:[-1] [] [2020-04-03 17:11:27,887] [] 信息 {org.wso2.carbon.mex.internal.Office365SupportMexComponent} - Office365Support MexServiceComponent 包已成功激活。
TID:[-1] [] [2020-04-03 17:11:27,903] [] INFO {org.wso2.carbon.mex2.internal.DynamicCRMCustomMexComponent} - DynamicCRMSupport MexServiceComponent 包已成功激活。
TID:[-1234] [] [2020-04-03 17:11:31,884] [] 错误 {org.wso2.carbon.user.core.common.DefaultRealm} - nullType class java.lang.reflect.InvocationTargetException org.wso2.carbon.user.core.UserStoreException: nullType class java.lang.reflect.InvocationTargetException
    在 org.wso2.carbon.user.core.common.DefaultRealm.createObjectWithOptions(DefaultRealm.java:397)
    在 org.wso2.carbon.user.core.common.DefaultRealm.initializeObjects(DefaultRealm.java:224)
    在 org.wso2.carbon.user.core.common.DefaultRealm.init(DefaultRealm.java:129)
    在 org.wso2.carbon.user.core.common.DefaultRealmService.initializeRealm(DefaultRealmService.java:276)
    在 org.wso2.carbon.user.core.common.DefaultRealmService.(DefaultRealmService.java:102)
    在 org.wso2.carbon.user.core.common.DefaultRealmService.(DefaultRealmService.java:115)
    在 org.wso2.carbon.user.core.internal.Activator.startDeploy(Activator.java:72)
    在 org.wso2.carbon.user.core.internal.BundleCheckActivator.start(BundleCheckActivator.java:61)
    在 org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:842)
    在 org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1)
    在 java.security.AccessController.doPrivileged(本机方法)
    在 org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:834)
    在 org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:791)
    在 org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:1013)
    在 org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:365)
    在 org.eclipse.osgi.container.Module.doStart(Module.java:598)
    在 org.eclipse.osgi.container.Module.start(Module.java:462)
    在 org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel$1.run(ModuleContainer.java:1820)
    在 org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor$2$1.execute(EquinoxContainerAdaptor.java:150)
    在 org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1813)
    在 org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1770)
    在 org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1735)
    在 org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1661)
    在 org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1)
    在 org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:234)
    在 org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:345)
原因:java.lang.reflect.InvocationTargetException
    在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
    在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    在 java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    在 org.wso2.carbon.user.core.common.DefaultRealm.createObjectWithOptions(DefaultRealm.java:351)
    ... 还有 25 个
原因:org.wso2.carbon.user.core.UserStoreException:检索用户名的用户 ID 时发生数据库错误:admin
    在 org.wso2.carbon.user.core.jdbc.UniqueIDJDBCUserStoreManager.doGetUserIDFromUserNameWithID(UniqueIDJDBCUserStoreManager.java:1284)
    在 org.wso2.carbon.user.core.common.AbstractUserStoreManager.getUserIDFromUserName(AbstractUserStoreManager.java:11773)
    在 org.wso2.carbon.user.core.common.AbstractUserStoreManager.addInitialAdminData(AbstractUserStoreManager.java:8401)
    在 org.wso2.carbon.user.core.jdbc.JDBCUserStoreManager.(JDBCUserStoreManager.java:319)
    在 org.wso2.carbon.user.core.jdbc.JDBCUserStoreManager.(JDBCUserStoreManager.java:258)
    在 org.wso2.carbon.user.core.jdbc.UniqueIDJDBCUserStoreManager.(UniqueIDJDBCUserStoreManager.java:125)
    ... 30 更多
原因:com.mysql.jdbc.exceptions。jdbc4.MySQLSyntaxErrorException:'field list' 中的未知列 'UM_USER_ID'
    在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
    在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    在 java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    在 com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    在 com.mysql.jdbc.Util.getInstance(Util.java:408)
    在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944)
    在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3978)
    在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3914)
    在 com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530)
    在 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683)
    在 com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2495)
    在 com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1903)
    在 com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2011)
    在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
    在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    在 java.lang.reflect.Method.invoke(Method.java:498)
    在 org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114)
    在 com.sun.proxy.$Proxy51.execute 查询(未知来源)
    在 org.wso2.carbon.user.core.jdbc.UniqueIDJDBCUserStoreManager.doGetUserIDFromUserNameWithID(UniqueIDJDBCUserStoreManager.java:1275)
    ... 35 更多

TID:[-1234] [] [2020-04-03 17:11:31,976] [] 错误 {org.wso2.carbon.user.core.internal.Activator} - 无法启动用户管理器核心包组织.wso2.carbon.user.core.UserStoreException:无法初始化领域。
    在 org.wso2.carbon.user.core.common.DefaultRealmService.initializeRealm(DefaultRealmService.java:286)
    在 org.wso2.carbon.user.core.common.DefaultRealmService.(DefaultRealmService.java:102)
    在 org.wso2.carbon.user.core.common.DefaultRealmService.(DefaultRealmService.java:115)
    在 org.wso2.carbon.user.core.internal.Activator.startDeploy(Activator.java:72)
    在 org.wso2.carbon.user.core.internal.BundleCheckActivator.start(BundleCheckActivator.java:61)
    在 org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:842)
    在 org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1)
    在 java.security.AccessController.doPrivileged(本机方法)
    在 org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:834)
    在 org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:791)
    在 org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:1013)
    在 org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:365)
    在 org.eclipse.osgi.container.Module.doStart(Module.java:598)
    在 org.eclipse.osgi.container.Module.start(Module.java:462)
    在 org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel$1.run(ModuleContainer.java:1820)
    在 org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor$2$1.execute(EquinoxContainerAdaptor.java:150)
    在 org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1813)
    在 org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1770)
    在 org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1735)
    在 org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1661)
    在 org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1)
    在 org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:234)
    在 org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:345)
由以下原因引起:org.wso2.carbon.user.core.UserStoreException: nullType class java.lang.reflect.InvocationTargetException
    在 org.wso2.carbon.user.core.common.DefaultRealm.initializeObjects(DefaultRealm.java:318)
    在 org.wso2.carbon.user.core.common.DefaultRealm.init(DefaultRealm.java:129)
    在 org.wso2.carbon.user.core.common.DefaultRealmService.initializeRealm(DefaultRealmService.java:276)
    ... 还有 22 个
由以下原因引起:org.wso2.carbon.user.core.UserStoreException: nullType class java.lang.reflect.InvocationTargetException
    在 org.wso2.carbon.user.core.common.DefaultRealm.createObjectWithOptions(DefaultRealm.java:397)
    在 org.wso2.carbon.user.core.common.DefaultRealm.initializeObjects(DefaultRealm.java:224)
    ... 还有 24 个
原因:java.lang.reflect.InvocationTargetException
    在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
    在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    在 java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    在 org.wso2.carbon.user.core.common.DefaultRealm.createObjectWithOptions(DefaultRealm.java:351)
    ... 还有 25 个
原因:org.wso2.carbon.user.core.UserStoreException:检索用户名的用户 ID 时发生数据库错误:admin
    在 org.wso2.carbon.user.core.jdbc.UniqueIDJDBCUserStoreManager.doGetUserIDFromUserNameWithID(UniqueIDJDBCUserStoreManager.java:1284)
    在 org.wso2.carbon.user.core.common.AbstractUserStoreManager.getUserIDFromUserName(AbstractUserStoreManager.java:11773)
    在 org.wso2.carbon.user.core.common.AbstractUserStoreManager.addInitialAdminData(AbstractUserStoreManager.java:8401)
    在 org.wso2.carbon.user.core.jdbc.JDBCUserStoreManager.(JDBCUserStoreManager.java:319)
    在 org.wso2.carbon.user.core.jdbc.JDBCUserStoreManager.(JDBCUserStoreManager.java:258)
    在 org.wso2.carbon.user.core.jdbc.UniqueIDJDBCUserStoreManager.(UniqueIDJDBCUserStoreManager.java:125)
    ... 30 更多
原因:com.mysql.jdbc.exceptions。jdbc4.MySQLSyntaxErrorException:'field list' 中的未知列 'UM_USER_ID'
    在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
    在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    在 java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    在 com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    在 com.mysql.jdbc.Util.getInstance(Util.java:408)
    在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:944)
    在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3978)
    在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3914)
    在 com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530)
    在 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683)
    在 com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2495)
    在 com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1903)
    在 com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2011)
    在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
    在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    在 java.lang.reflect.Method.invoke(Method.java:498)
    在 org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114)
    在 com.sun.proxy.$Proxy51.execute 查询(未知来源)
    在 org.wso2.carbon.user.core.jdbc.UniqueIDJDBCUserStoreManager.doGetUserIDFromUserNameWithID(UniqueIDJDBCUserStoreManager.java:1275)
    ... 35 更多

TID:[-1] [] [2020-04-03 17:11:32,384] [] INFO {org.apache.jasper.servlet.TldScanner} - 至少扫描了一个 JAR 的 TLD,但不包含 TLD。为这个记录器启用调试日志记录,以获得已扫描但未在其中找到 TLD 的 JAR 的完整列表。在扫描过程中跳过不需要的 JAR 可以缩短启动时间和 JSP 编译时间。
TID:[-1] [] [2020-04-03 17:11:32,766] [] INFO {org.wso2.carbon.identity.authenticator.x509Certificate.internal.X509CertificateServiceComponent} - X509 证书 Servlet激活成功。。

这是因为您在迁移前已为主要用户存储配置 UniqueIDJDBCUserStoreManager。因此,它在服务器初始化期间和迁移开始之前失败。

[user_store]
type = "database_unique_id"

因此,解决方案是在迁移过程中使用JDBCUserStoreManager

[user_store]
type = "database"

稍后,您可以切换到 UniqueIDJDBCUserStoreManager,因为我们会在迁移过程中进行必要的架构更新。

PS:如果您在以前的版本中没有启用SCIM,它可能无法更新用户ID [1]。因此,我们必须通过禁用主要用户存储的 SCIM 来开始迁移,因为 5.10.0 设置默认启用 SCIM,而 5.9.0 默认禁用 JDBCUserStoreManager

的 SCIM
[user_store]
type = "database"
scim_enabled=false

[1] https://github.com/wso2/product-is/issues/8034

为添加 UM_USER_ID 列而执行的 mysql 脚本是错误的[1]。 UM_USER_ID 列添加了 DEFAULT 'NONE'

ALTER TABLE `UM_USER` ADD COLUMN `UM_USER_ID` CHAR(36) NOT NULL DEFAULT 'NONE', ADD UNIQUE(UM_USER_ID, UM_TENANT_ID);
UPDATE UM_USER SET UM_USER_ID = UUID();

无法在此处添加 UNIQUE 约束,只有一个用户(管理员用户)的迁移会成功。它已通过 commit[1]

修复

[1]https://github.com/wso2-extensions/identity-migration-resources/commit/888a332c498d40f0e2a049cd17fbcd35caafde99