sonarqube7.0升级到8.9.6踩坑记
- 1. sonarqube7.0升级到8.9.6踩坑记
- 1.1. 升级前的困难
- 1.2. 尝试过的路径
- 1.3. 操作步骤
- 1.3.1. 迁移mysql数据
- 1.3.2. 恢复数据到新数据库
- 1.3.3. 使用新数据库启动sonarqube
- 1.3.4. 将mysql数据库转成pgsql
- 1.3.5. 用转后的pgsql库启动sonrqube7.0
- 1.3.6. 将转后的pgsql9.6版本的库转成pgsql10.0的库
- 1.3.7. 使用pgsql10的库启动sonarqube7.0
- 1.3.8. 使用升级后的pgsql10的库启动sonarqube7.4
- 1.3.9. 使用升级后的7.4的pgsql10的库启动sonrqube7.9.1
- 1.3.10. 使用升级后的7.9.1的pgsql10的库启动sonrqube7.9.6
- 1.3.11. 使用升级后的7.9.6的pgsql10的库启动sonrqube8.9.1
- 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官方发现的:
官方说,你不能直接从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版本对应的数据库支持版本在官方文档上都有列出:
https://docs.sonarqube.org/7.4/requirements/requirements/
操作步骤
迁移mysql数据
- 备份导出
通过navigate mysql工具将线上跑的sonarqube7.0的mysql数据备份导出,大小为7.8G:
- 准备用于测试升级的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后台:
通过此后台新建sonarqube空数据库,并准备还原数据。
恢复数据到新数据库
导入从待升级的mysql数据库的数据:
由于数据较大,等了一个小时左右,终于导入成功。
或者使用navigate for mysql工具进行数据恢复也行。
使用新数据库启动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
启动成功,并登陆进去能看到原项目数据:
将mysql数据库转成pgsql
由于工作正确的mysql数据库版本是5.7, 在转pgsql之前,需要建pgsql版本的数据库。
进入pgsql的docker容器中,建立数据库sonarqube
docker exec -it postgresql sh
进入pgsql容器后:
su - postgres //授权超管账号
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:
看到:
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 中,并使用单独的线程来读取和写入数据。
具体使用方法可以参考:
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空数据库:
- su - postgresql
- createdb -U sonar sonarqube
其它常用postgresql的命令:
- dropdb sonarqube
- adduser userA
- psql -U user_name -d database_name -h serverhost
- 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,但之后报出了需要手动升级的一个提示。
按照提示找到官网的说法:
那就手动执行下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