文章目录
  1. 1. sonarqube7.0升级到8.9.6踩坑记
    1. 1.1. 升级前的困难
    2. 1.2. 尝试过的路径
    3. 1.3. 操作步骤
      1. 1.3.1. 迁移mysql数据
      2. 1.3.2. 恢复数据到新数据库
      3. 1.3.3. 使用新数据库启动sonarqube
      4. 1.3.4. 将mysql数据库转成pgsql
      5. 1.3.5. 用转后的pgsql库启动sonrqube7.0
      6. 1.3.6. 将转后的pgsql9.6版本的库转成pgsql10.0的库
      7. 1.3.7. 使用pgsql10的库启动sonarqube7.0
      8. 1.3.8. 使用升级后的pgsql10的库启动sonarqube7.4
      9. 1.3.9. 使用升级后的7.4的pgsql10的库启动sonrqube7.9.1
      10. 1.3.10. 使用升级后的7.9.1的pgsql10的库启动sonrqube7.9.6
      11. 1.3.11. 使用升级后的7.9.6的pgsql10的库启动sonrqube8.9.1
      12. 1.3.12. 使用升级后的8.9.1的pgsql10的库启动sonrqube8.9.6

sonarqube7.0升级到8.9.6踩坑记

最近公司由于log4j2 核弹级bug影响,需要升级sonarqube到安全版本,截止目前sonarqube的安全版本是8.9.6,log4j2升级到了2.17,故最终目标是升级到8.9.6。

升级前的困难

  • 7.0 —>8.9.6跨的版本太多,数据结构已完全不兼容
  • 原7.0使用的数据库是mysql 5.7
  • sonarqube 7.9.1之后就不支持mysql了,官方建议使用postgresql
  • sonarqube 8.9.6 支持的postgresql数据库版本是10.0+

注意: 本来遇到这些问题的时候,想把原来的代码规则导出,重新搭建新的sonarqube就行了,发现除了代码规则,还有很多项目配置,没办法要求业务团队重新配置项目数据。

尝试过的路径

  • 将7.0对应的mysql数据导出,还原到另一环境的mysql上,直接使用8.9.6启动—–失败(不支持mysql)
  • 将7.0的mysql数据导出,还原到对应数据库,使用相同版本的sonarqube启动成功,使用MySQL Migrator工具转成postgresql(9.6.3版本)—-启动sonrqube7.0成功—-换成7.9失败(pgsql版本太低)
  • 将pgsql9.6启动sonrqube7.1成功,并开始打补丁,打完补丁后将sonrqube版本换成7.4, 启动失败(提示pgsql版本太低)
  • 将pgsql9.6的原始数据通过pgloader工具强转入到pgsql 10的版本库中,并使用sonrqube7.0启动成功,但需要执行setup打升级补丁
  • 将pgsql10的数据使用sonrqube7.1启动成功,并打补丁成功
  • 将pgsql10打过补丁的数据库,连接sonrqube7.4版本,启动成功,并需要执行setup打升级补丁
  • 将打完7.4版本的pgsql10数据库连接sonrqube7.9.1版本,启动成功,但需要执行setup打升级补丁
  • 将打完7.9.1升级补丁的pgsql10数据库连接sonrqube7.9.6版本,启动成功,也需要执行setup打升级补丁
  • 将打完7.9.6升级补丁的pgsql10数据库连接sonrqube8.9版本,启动成功,也需要执行setup打升级补丁
  • 将打完8.9升级补丁的pgsql10数据库连接sonrqube8.9.6版本, 启动成功,也需要执行setup打升级补丁,至此,升级完毕

以上采坑路径不完全记录我的试错路径,但大致体现了我的操作轨迹。

最终能走向迁移的正途,还是在sonarqube官方发现的:

image-20211230215034245

官方说,你不能直接从7.0升级到8.9.5, 那我现在要升级到8.9.6不也不一样吗

然后官方就列出了三个升级的例子,我这边好像比较符合第3个例子,而我是7.0,我是不是得回退到6.7.7呢?后面经过反复操作,发现是不需要回退到6.7.7的。

https://community.sonarsource.com/t/unable-to-upgrade-from-version-7-0-to-8-9-5/55297

每个sonarqube版本对应的数据库支持版本在官方文档上都有列出:

image-20211230215804292

https://docs.sonarqube.org/7.4/requirements/requirements/

操作步骤

迁移mysql数据

  1. 备份导出

通过navigate mysql工具将线上跑的sonarqube7.0的mysql数据备份导出,大小为7.8G:

image-20211231103509224

  1. 准备用于测试升级的mysql

由于源数据库用的mysql版本是5.6,目标数据库我不能用的太高,就用5.7,使用docker能安装:

docker-compose.yml:

version: '3'

volumes:
  mysql_data:
      driver: local

services:
  mysql:
      image: mysql:5.7
      volumes:
        - mysql_data:/var/lib/mysql
      environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: sonarqube
        MYSQL_USER: sonar
        MYSQL_PASSWORD: sonar
      ports:
         - 6666:3306
  adminer:
      image: registry.cn-shanghai.aliyuncs.com/hgq/phpmyadmin-5.0.4
      restart: always
      ports:
         - 9000:80
      environment:
        PMA_HOST: mysql
        PMA_PORT: 3306
        PMA_USER: sonar
        PMA_PASSWORD: sonar

启动:

docker up -d

访问mysql的phpAdmin后台:

image-20220104101254442

通过此后台新建sonarqube空数据库,并准备还原数据。

恢复数据到新数据库

导入从待升级的mysql数据库的数据:

image-20220104101528157

由于数据较大,等了一个小时左右,终于导入成功。

或者使用navigate for mysql工具进行数据恢复也行。

image-20220104103835103

使用新数据库启动sonarqube

sonarqube-mysql.sh :

#!/bin/bash
HOST_NAME=$1.rios.com
MAP_DIR=~/docker_map/$1
echo "start $MAP_DIR $HOST_NAME"
docker stop $1
docker rm $1
rm -rf $MAP_DIR/data/*
## 创建数据目录
mkdir -p $MAP_DIR/data/$1/sonarqube_conf $MAP_DIR/data/$1/sonarqube_extensions $MAP_DIR/data/$1/sonarqube_logs $MAP_DIR/data/$1/sonarqube_data
chmod 777 -R $MAP_DIR/data/$1/

## 运行
docker run  -itd  --name $1 \
    -p 9001:9000 \
    -e SONARQUBE_JDBC_URL=jdbc:mysql://127.0.0.1:6666/sonarqube?useUnicode=true\&characterEncoding=utf8 \
    -e SONARQUBE_JDBC_USERNAME=sonar \
    -e SONARQUBE_JDBC_PASSWORD=sonar \
    -v $MAP_DIR/data/$1/sonarqube_conf:/opt/sonarqube/conf \
    -v $MAP_DIR/data/$1/sonarqube_extensions:/opt/sonarqube/extensions \
    -v $MAP_DIR/data/$1/sonarqube_logs:/opt/sonarqube/logs \
    -v $MAP_DIR/data/$1/sonarqube_data:/opt/sonarqube/data \
    sonarqube:$2
## 验证
docker logs -f $1

启动sonarqube7.0 连接新mysql数据库:

sh ./sonarqube-mysql.sh sonarqube-mysql  7.0

启动成功,并登陆进去能看到原项目数据:

image-20220104104751377

将mysql数据库转成pgsql

由于工作正确的mysql数据库版本是5.7, 在转pgsql之前,需要建pgsql版本的数据库。

  • 进入pgsql的docker容器中,建立数据库sonarqube

    • docker exec -it postgresql sh

    • 进入pgsql容器后:

      1. su - postgres //授权超管账号

      2. createdb -U sonar sonarqube //创建sonarqube数据库, 授权给sonar用户

数据库建好后,就可以进行转换了,sonrqube的mysql 转pgsql必须用指定工具转才生效,否则使用其它方式转到pgsql会有不少问题,这个工具就是 Mysql Migrator工具:

  • MySQL Migrator工具

    项目信息:https://github.com/SonarSource/mysql-migrator

    #解压
    wget https://binaries.sonarsource.com/Distribution/mysql-migrator/mysql-migrator-1.1.0.119.zip
    unzip mysql-migrator-1.1.0.119.zip && cd bin
    
    #source.properties
    sonar.jdbc.username=sonar
    sonar.jdbc.password=sonar
    sonar.jdbc.url=jdbc:mysql://localhost:6666/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
    
    #target.properties
    sonar.jdbc.username=sonar
    sonar.jdbc.password=sonar
    sonar.jdbc.url=jdbc:postgresql://127.0.0.1:55432/sonarqube
    

注意,pgsql版本是9.6.24

  • 运行迁移工具

    ./mysql-migrator -source source.properties -target target.properties


[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table organizations ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table organization_members ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table groups_users ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table rules_parameters ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table rules_profiles ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table org_qprofiles ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table default_qprofiles ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table project_qprofiles ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table qprofile_edit_users ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table qprofile_edit_groups ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table groups ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table snapshots ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table group_roles ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table rule_repositories ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table rules ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table rules_metadata ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table events ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table quality_gates ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table quality_gate_conditions ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table properties ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table project_links ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table duplications_index ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table project_measures ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table internal_properties ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table projects ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table manual_measures ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table active_rules ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table notifications ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table user_roles ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table active_rule_parameters ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table users ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table metrics ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table loaded_templates ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table issues ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table issue_changes ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table permission_templates ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table perm_tpl_characteristics ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table perm_templates_users ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table perm_templates_groups ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table qprofile_changes ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table file_sources ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table ce_queue ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table ce_activity ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table ce_task_characteristics ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table ce_task_input ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table ce_scanner_context ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table user_tokens ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table webhook_deliveries ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table es_queue ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table plugins ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table project_branches ...
[main] INFO org.sonarsource.sqdbmigrator.migrator.ContentCopier - copying table analysis_properties ...
Tables                    Records  Seconds
------------------------  -------  -------
organizations                   1      0.1
organization_members            4      0.0
groups_users                    5      0.0
rules_parameters              686      0.1
rules_profiles                 18      0.0
org_qprofiles                  18      0.0
default_qprofiles               9      0.1
project_qprofiles               0      0.0
qprofile_edit_users             0      0.0
qprofile_edit_groups            0      0.0
groups                          2      0.0
snapshots                      22      0.0
group_roles                    28      0.0
rule_repositories              25      0.0
rules                        2888      0.3
rules_metadata                  0      0.0
events                         21      0.0
quality_gates                   1      0.0
quality_gate_conditions         5      0.0
properties                      4      0.0
project_links                  11      0.0
duplications_index              0      0.0
project_measures             3839      0.3
internal_properties             3      0.0
projects                       55      0.1
manual_measures                 0      0.0
active_rules                 2957      0.1
notifications                   0      0.0
user_roles                      0      0.0
active_rule_parameters        167      0.0
users                           4      0.0
metrics                       145      0.0
loaded_templates                2      0.0
issues                        473      0.1
issue_changes                   0      0.0
permission_templates            1      0.0
perm_tpl_characteristics        0      0.0
perm_templates_users            0      0.0
perm_templates_groups           4      0.0
qprofile_changes             6543      0.3
file_sources                   22      0.0
ce_queue                        0      0.0
ce_activity                    22      0.0
ce_task_characteristics         0      0.0
ce_task_input                   0      0.0
ce_scanner_context             22      0.0
user_tokens                     0      0.0
webhook_deliveries              0      0.0
es_queue                        0      0.0
plugins                        14      0.0
project_branches               11      0.0
analysis_properties             0      0.0

Migration successful in 2.7 seconds


#检查pg中的数据
\c sonarqube
\dt
select * from projects;


转换成功。。。。。

ps: 由于mysql6.7版本转pgsql时,pgsql版本不能高于10.0,低于9.0

用转后的pgsql库启动sonrqube7.0

这个就是将上面的mysql版本的sonrqube7.0改成连接pgsql 9.6.4版本的数据库

sonarqube.sh:

#!/bin/bash
HOST_NAME=$1.rios.com
MAP_DIR=~/docker_map/$1
echo "start $MAP_DIR $HOST_NAME"
docker stop $1
docker rm $1
mkdir -p $MAP_DIR/data
rm -rf $MAP_DIR/data/*
## 创建数据目录
mkdir -p $MAP_DIR/data/$1/sonarqube_conf $MAP_DIR/data/$1/sonarqube_extensions $MAP_DIR/data/$1/sonarqube_logs $MAP_DIR/data/$1/sonarqube_data
chmod 777 -R $MAP_DIR/data/$1/

## 运行
docker run  -itd  --name $1 \
    --link postgresql \
    -p 9002:9000 \
    -e SONARQUBE_JDBC_URL=jdbc:postgresql://postgresql:5432/sonarqube?currentSchema=public \
    -e SONARQUBE_JDBC_USERNAME=sonar \
    -e SONARQUBE_JDBC_PASSWORD=sonar \
    -e TZ=Asia/Shanghai \
    -v $MAP_DIR/data/$1/sonarqube_conf:/opt/sonarqube/conf \
    -v $MAP_DIR/data/$1/sonarqube_extensions:/opt/sonarqube/extensions \
    -v $MAP_DIR/data/$1/sonarqube_logs:/opt/sonarqube/logs \
    -v $MAP_DIR/data/$1/sonarqube_data:/opt/sonarqube/data \
    sonarqube:$2
## 验证
docker logs -f $1

启动成功,并更新了好多index:

image-20220104162733498

image-20220104162850001

看到:

​ Compute Engine starting up…..

​ Process[ce] is up

​ SonarQube is up

就代表完全启动成功了。。。。。

将转后的pgsql9.6版本的库转成pgsql10.0的库

这一步就很神奇,之前尝试过很多次,因为之前用的是postgresql 12+的版本,怎么都不行,无法转,后面换成10.0就ok了,这里说的转,不是强转,更不是pg_dump和pg_restore、psql这些命令(千万不要这样去还原,因为会破坏pgsql10的默认数据库结构,导致转换失败)。

我们需要使用一个叫PGLoader的工具。

  • PGLoader

Pgloader 是一个支持任意数据库迁移至 pgsql 的命令行工具。使用 COPY 流式传输协议将数据加载到 PostgreSQL 中,并使用单独的线程来读取和写入数据。

PGLoader官方源码地址

具体使用方法可以参考:

https://zhuanlan.zhihu.com/p/400282089

安装好PGLoader以后,编写pgload-pg.load:

LOAD DATABASE
 FROM pgsql://postgres:sonar@localhost:55432/sonarqube
 INTO pgsql://sonar:sonar@127.0.0.1:55433/sonarqube

 WITH include drop, create tables, create indexes, workers = 8, concurrency = 1

ALTER SCHEMA 'sonarqube' RENAME TO 'public';

postgresql10 我用的是docker, postgresql10.sh:

#!/bin/bash
HOST_NAME=$1.rios.com
MAP_DIR=~/docker_map/$1
echo "start $MAP_DIR $HOST_NAME"
docker stop $1
docker rm $1

## 创建数据目录
mkdir -p $MAP_DIR/data
chmod 777 -R $MAP_DIR/data

## 运行

docker run -itd  --name $1 --restart always \
    -p 55433:5432 \
    -v $MAP_DIR/data:/var/lib/postgresql/data \
    -e POSTGRES_USER=sonar \
        -e POSTGRES_PASSWORD=sonar \
        -e ALLOW_IP_RANGE=0.0.0.0/0 \
       postgres:10
## 验证
docker logs -f $1

执行:

sh ./postgresql10.sh postgresql10

进入postgresql10容器中,并创建sonarqube空数据库:

  1. su - postgresql
  2. createdb -U sonar sonarqube

其它常用postgresql的命令:

  1. dropdb sonarqube
  2. adduser userA
  3. psql -U user_name -d database_name -h serverhost
  4. sudo -u postgres createuser –superuser dbuser
  • 开始执行
pgloader ./pgload-pg.load

执行一段时间后,成功完成。

使用pgsql10的库启动sonarqube7.0

sonarqube.sh:

#!/bin/bash
HOST_NAME=$1.rios.com
MAP_DIR=~/docker_map/$1
echo "start $MAP_DIR $HOST_NAME"
docker stop $1
docker rm $1
mkdir -p $MAP_DIR/data
rm -rf $MAP_DIR/data/*
## 创建数据目录
mkdir -p $MAP_DIR/data/$1/sonarqube_conf $MAP_DIR/data/$1/sonarqube_extensions $MAP_DIR/data/$1/sonarqube_logs $MAP_DIR/data/$1/sonarqube_data
chmod 777 -R $MAP_DIR/data/$1/

## 运行
docker run  -itd  --name $1 \
    --link postgresql10 \
    -p 9003:9000 \
    -e SONARQUBE_JDBC_URL=jdbc:postgresql://postgresql10:5432/sonarqube?currentSchema=public \
    -e SONARQUBE_JDBC_USERNAME=sonar \
    -e SONARQUBE_JDBC_PASSWORD=sonar \
    -e TZ=Asia/Shanghai \
    -v $MAP_DIR/data/$1/sonarqube_conf:/opt/sonarqube/conf \
    -v $MAP_DIR/data/$1/sonarqube_extensions:/opt/sonarqube/extensions \
    -v $MAP_DIR/data/$1/sonarqube_logs:/opt/sonarqube/logs \
    -v $MAP_DIR/data/$1/sonarqube_data:/opt/sonarqube/data \
    sonarqube:$2
## 验证
docker logs -f $1

为什么要用postgresql10.0去连sonrqube7.0?

因为我要将postgresql升级到10,才能连sonrqube7.4以后的版本,否则直接用postgresql9.6是升不上去的!!!!

启动一下:

sh ./sonarqube.sh sonarqube-7.0 7.0

启动后,一样更新了一堆index,但之后报出了需要手动升级的一个提示。

按照提示找到官网的说法:

image-20220104174326248

那就手动执行下setup接口: http://127.0.0.1:9003/setup

按照指引继续upgrade,等了好久,终于成功了:

使用升级后的pgsql10的库启动sonarqube7.4

sh ./sonarqube sonarqube-7.4 7.4

启动成功后,继续上次升级的步骤。

这一步的成功是里程碑式的,所以需要将pgsql10的sonarqube库备份一下:

 pg_dump -U sonarqube ./sonarqube-7.4.sql

使用升级后的7.4的pgsql10的库启动sonrqube7.9.1

sh ./sonarqube sonarqube-7.9.1 7.9.1-community

启动成功后,再次重复升级动作,最后成功后,再将数据库备份一下:

pg_dump -U sonarqube ./sonarqube-7.9.1.sql

使用升级后的7.9.1的pgsql10的库启动sonrqube7.9.6

sh ./sonarqube sonarqube-7.9.6 7.9.6-community

启动成功后,再次重复升级动作,最后成功后,7.9.6的升级成功也是一个里程碑,代表升级已经步入正轨,再将数据库备份一下:

pg_dump -U sonarqube ./sonarqube-7.9.6.sql

使用升级后的7.9.6的pgsql10的库启动sonrqube8.9.1

不要着急直接升到8.9.6,因为你也不知道跨这么大步子有没有什么坑,就先升到8.9.1:

sh ./sonarqube sonarqube-8.9.1 8.9.1-community

启动成功后,再次重复升级动作,最后成功后,再将数据库备份一下:

pg_dump -U sonarqube ./sonarqube-8.9.1.sql

使用升级后的8.9.1的pgsql10的库启动sonrqube8.9.6

sh ./sonarqube sonarqube-8.9.6 8.9.6-community

启动成功后,再次重复升级动作,最后成功后,再将数据库备份一下:

pg_dump -U sonarqube ./sonarqube-8.9.6.sql

哈哈,最后终于给升级成功了,艹!!!!!

参考文章:

https://www.cnblogs.com/mascot1/p/11295048.html

https://blog.csdn.net/liumiaocn/article/details/102788571

https://community.sonarsource.com/t/unable-to-upgrade-from-version-7-0-to-8-9-5/55297

https://github.com/xuhuisheng/sonar-l10n-zh/releases/tag/sonar-l10n-zh-plugin-8.9

https://cloud.tencent.com/developer/article/1185186

文章目录
  1. 1. sonarqube7.0升级到8.9.6踩坑记
    1. 1.1. 升级前的困难
    2. 1.2. 尝试过的路径
    3. 1.3. 操作步骤
      1. 1.3.1. 迁移mysql数据
      2. 1.3.2. 恢复数据到新数据库
      3. 1.3.3. 使用新数据库启动sonarqube
      4. 1.3.4. 将mysql数据库转成pgsql
      5. 1.3.5. 用转后的pgsql库启动sonrqube7.0
      6. 1.3.6. 将转后的pgsql9.6版本的库转成pgsql10.0的库
      7. 1.3.7. 使用pgsql10的库启动sonarqube7.0
      8. 1.3.8. 使用升级后的pgsql10的库启动sonarqube7.4
      9. 1.3.9. 使用升级后的7.4的pgsql10的库启动sonrqube7.9.1
      10. 1.3.10. 使用升级后的7.9.1的pgsql10的库启动sonrqube7.9.6
      11. 1.3.11. 使用升级后的7.9.6的pgsql10的库启动sonrqube8.9.1
      12. 1.3.12. 使用升级后的8.9.1的pgsql10的库启动sonrqube8.9.6