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:
启动:
docker up -d
访问mysql的phpAdmin后台:
通过此后台新建sonarqube空数据库,并准备还原数据。
恢复数据到新数据库
导入从待升级的mysql数据库的数据:
由于数据较大,等了一个小时左右,终于导入成功。
或者使用navigate for mysql工具进行数据恢复也行。
使用新数据库启动sonarqube
sonarqube-mysql.sh :
启动sonarqube7.0 连接新mysql数据库:
启动成功,并登陆进去能看到原项目数据:
将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工具
注意,pgsql版本是9.6.24
运行迁移工具
./mysql-migrator -source source.properties -target target.properties
转换成功。。。。。
ps: 由于mysql6.7版本转pgsql时,pgsql版本不能高于10.0,低于9.0
用转后的pgsql库启动sonrqube7.0
这个就是将上面的mysql版本的sonrqube7.0改成连接pgsql 9.6.4版本的数据库
sonarqube.sh:
启动成功,并更新了好多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:
postgresql10 我用的是docker, postgresql10.sh:
执行:
进入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
- 开始执行
执行一段时间后,成功完成。
使用pgsql10的库启动sonarqube7.0
sonarqube.sh:
为什么要用postgresql10.0去连sonrqube7.0?
因为我要将postgresql升级到10,才能连sonrqube7.4以后的版本,否则直接用postgresql9.6是升不上去的!!!!
启动一下:
启动后,一样更新了一堆index,但之后报出了需要手动升级的一个提示。
按照提示找到官网的说法:
那就手动执行下setup接口: http://127.0.0.1:9003/setup
按照指引继续upgrade,等了好久,终于成功了:
使用升级后的pgsql10的库启动sonarqube7.4
启动成功后,继续上次升级的步骤。
这一步的成功是里程碑式的,所以需要将pgsql10的sonarqube库备份一下:
使用升级后的7.4的pgsql10的库启动sonrqube7.9.1
启动成功后,再次重复升级动作,最后成功后,再将数据库备份一下:
使用升级后的7.9.1的pgsql10的库启动sonrqube7.9.6
启动成功后,再次重复升级动作,最后成功后,7.9.6的升级成功也是一个里程碑,代表升级已经步入正轨,再将数据库备份一下:
使用升级后的7.9.6的pgsql10的库启动sonrqube8.9.1
不要着急直接升到8.9.6,因为你也不知道跨这么大步子有没有什么坑,就先升到8.9.1:
启动成功后,再次重复升级动作,最后成功后,再将数据库备份一下:
使用升级后的8.9.1的pgsql10的库启动sonrqube8.9.6
启动成功后,再次重复升级动作,最后成功后,再将数据库备份一下:
哈哈,最后终于给升级成功了,艹!!!!!
参考文章:
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