【问题标题】:SonarQube Update Database for Version 7 Fails版本 7 的 SonarQube 更新数据库失败
【发布时间】:2018-07-17 22:15:30
【问题描述】:

我们正在运行安装程序以将 SonarQube 更新到 7.0 版 - 我们遇到数据库故障(请参阅下面的堆栈跟踪)。

知道我们如何克服这个问题吗?

2018.02.07 07:16:47 INFO  web[][o.s.s.p.d.m.DatabaseMigrationImpl] Starting DB Migration and container restart
2018.02.07 07:16:47 INFO  web[][DbMigrations] Executing DB migrations...
2018.02.07 07:16:47 INFO  web[][DbMigrations] #1907 'Populate table live_measures'...
2018.02.07 07:16:48 ERROR web[][DbMigrations] #1907 'Populate table live_measures': failure | time=788ms
2018.02.07 07:16:48 ERROR web[][DbMigrations] Executed DB migrations: failure | time=790ms
2018.02.07 07:16:48 ERROR web[][o.s.s.p.d.m.DatabaseMigrationImpl] DB migration failed | time=902ms
2018.02.07 07:16:48 ERROR web[][o.s.s.p.d.m.DatabaseMigrationImpl] DB migration ended with an exception
org.sonar.server.platform.db.migration.step.MigrationStepExecutionException: Execution of migration step #1907 'Populate table live_measures' failed
       at org.sonar.server.platform.db.migration.step.MigrationStepsExecutorImpl.execute(MigrationStepsExecutorImpl.java:79)
       at org.sonar.server.platform.db.migration.step.MigrationStepsExecutorImpl.execute(MigrationStepsExecutorImpl.java:67)
       at java.util.Iterator.forEachRemaining(Iterator.java:116)
       at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
       at java.util.stream.ReferencePipeline$Head.forEachOrdered(ReferencePipeline.java:590)
       at org.sonar.server.platform.db.migration.step.MigrationStepsExecutorImpl.execute(MigrationStepsExecutorImpl.java:52)
       at org.sonar.server.platform.db.migration.engine.MigrationEngineImpl.execute(MigrationEngineImpl.java:50)
       at org.sonar.server.platform.db.migration.DatabaseMigrationImpl.doUpgradeDb(DatabaseMigrationImpl.java:105)
       at org.sonar.server.platform.db.migration.DatabaseMigrationImpl.doDatabaseMigration(DatabaseMigrationImpl.java:80)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
       at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalStateException: Error during processing of row: [uuid=eea5cd4b-3c1c-4001-bf83-85c1062a1b7c,project_uuid=3dabb938-1a4a-4c82-b0a7-0b20cc419be9,metric_id=10019,value=1,text_value=null,variation_value_1=0,measure_data=null]
       at org.sonar.server.platform.db.migration.step.SelectImpl.newExceptionWithRowDetails(SelectImpl.java:89)
       at org.sonar.server.platform.db.migration.step.SelectImpl.scroll(SelectImpl.java:81)
       at org.sonar.server.platform.db.migration.step.MassUpdate.execute(MassUpdate.java:91)
       at org.sonar.server.platform.db.migration.version.v70.PopulateLiveMeasures.execute(PopulateLiveMeasures.java:57)
       at org.sonar.server.platform.db.migration.step.DataChange.execute(DataChange.java:44)
       at org.sonar.server.platform.db.migration.step.MigrationStepsExecutorImpl.execute(MigrationStepsExecutorImpl.java:75)
       ... 11 common frames omitted
Caused by: java.sql.BatchUpdateException: ORA-00001: unique constraint (SONARQUBE_IDM.LIVE_MEASURES_COMPONENT) violated
       at oracle.jdbc.driver.OraclePreparedStatement.executeLargeBatch(OraclePreparedStatement.java:10032)
       at oracle.jdbc.driver.T4CPreparedStatement.executeLargeBatch(T4CPreparedStatement.java:1364)
       at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:9839)
       at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:234)
       at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
       at org.apache.commons.dbcp.DelegatingStatement.executeBatch(DelegatingStatement.java:297)
       at org.sonar.server.platform.db.migration.step.UpsertImpl.addBatch(UpsertImpl.java:42)
       at org.sonar.server.platform.db.migration.step.MassUpdate.callSingleHandler(MassUpdate.java:118)
       at org.sonar.server.platform.db.migration.step.MassUpdate.lambda$execute$0(MassUpdate.java:91)
       at org.sonar.server.platform.db.migration.step.SelectImpl.scroll(SelectImpl.java:78)
       ... 15 common frames omitted

【问题讨论】:

  • 无法迁移预期的度量。你有/有自定义插件吗?
  • 能否提供以下 SQL 请求的结果? SELECT p.uuid, p.project_uuid, pm.metric_id, pm.value, pm.text_value, pm.variation_value_1, pm.measure_data FROM project_measures pm INNER JOIN projects p on p.uuid = pm.component_uuid INNER JOIN snapshots s on s。 uuid = pm.analysis_uuid WHERE s.islast = 1 且 pm.person_id 为 null 且 pm.component_uuid = 'eea5cd4b-3c1c-4001-bf83-85c1062a1b7c' 且 pm.metric_id = 10019

标签: sonarqube sonarqube-ops


【解决方案1】:

我们遇到了同样的问题。

执行迁移步骤 #1907 '填充表 live_measures' 失败;[...]错误:重复的键值违反了唯一约束 "live_measures_component

我检查了数据库中导致此查询出现问题的条目(我们使用 PostgreSQL,因此您必须检查查询语法是否对 Oracle 仍然有效):

SELECT p.uuid, pm.metric_id, COUNT(1) FROM project_measures pm INNER JOIN projects p on p.uuid = pm.component_uuid INNER JOIN snapshots s on s.uuid = pm.analysis_uuid WHERE s.islast = TRUE and pm.person_id is null GROUP BY p.uuid, pm.metric_id HAVING COUNT(1) > 1;

有 > 3.500 (!) 个具有相同 uuid 和 metric_id 的条目,因此没有机会手动调整某些表条目。

由于我们没有足够的时间对此进行进一步分析,并且我们想解决这个问题,因此我们决定删除并重新创建索引“live_measures_component”,而无需在表 live_measures 上使用 UNIQUE 键。

以下语句也应该适用于您:(对于大型数据库,应考虑这些语句的持续时间...)

DROP INDEX "live_measures_component";
CREATE INDEX live_measures_component ON live_measures (component_uuid,metric_id);

此解决方法使我们能够完成数据库迁移。我不知道这种解决方法是否有一些副作用(也许来自 sonarqube 的人可以知道) - 但是在数据库中有超过 3.500 个“有问题”的条目,这是我们目前唯一的可能性。

希望这会有所帮助。

【讨论】:

  • 谢谢 - 删除并重新创建索引解决了问题,我们能够完成更新
  • 我也希望 SonarQube 的某个人阅读此内容并解释副作用。上述解决方案在 MySQL 中对我有用。我只有 88 个条目。
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2013-05-16
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
相关资源
最近更新 更多