SonarQube 5.6升级至6.7(专用SQL Server数据库)方案可行性咨询
嘿Atul,结合我帮很多团队处理SonarQube升级的实际经验,来给你详细解答下你的问题:
一、能不能直接从5.6升级到6.7?
答案是可以直接升级!因为5.6和6.7都是SonarQube的LTS(长期支持)版本,官方明确支持从一个LTS版本直接升级到下一个LTS版本。不过升级前得先确认几个前提条件:
- 你的SQL Server版本得达标:6.7要求SQL Server 2012及以上,要是你当前用的版本比这个旧,得先把数据库升到符合要求的版本。
- Java环境要切换:5.6可能还在用Java 7,但6.7必须用Java 8(OpenJDK或者Oracle JDK都行),升级前记得把SonarQube的Java环境换成8。
- 备份是重中之重:升级前一定要完整备份旧的Sonar数据库,还有SonarQube安装目录里的
conf和data文件夹,以防万一出问题能回滚。
二、你提出的并行部署方案可行吗?当然可行!
你的这个思路其实是很多企业升级SonarQube时的首选安全方案——先并行跑新实例验证,没问题再切换,完全不会影响现有项目的使用。我接触过不少用SQL Server的团队都这么干过,成功率很高。下面给你拆解下关键步骤和要注意的坑:
关键操作细节
步骤1:独立安装6.7,配置不同端口
直接下载6.7的安装包,解压到和旧版本完全不同的目录里,然后修改conf/sonar.properties里的端口(比如把默认的9000改成9001),避免和旧实例冲突。要是系统里同时有Java 7和8,记得在conf/wrapper.conf里指定wrapper.java.command为Java 8的路径,确保新实例用对Java版本。步骤2:复制旧数据库到新实例
用SQL Server的SSMS工具先把旧的Sonar数据库完整备份,然后恢复成一个全新的数据库(比如命名为sonar_67)。恢复后要给SonarQube的数据库用户配置好权限,至少要有db_owner权限,不然新实例连不上数据库。步骤3:让新实例关联复制的数据库
修改6.7的conf/sonar.properties,配置好新数据库的连接信息:sonar.jdbc.url=jdbc:sqlserver://<你的数据库地址>:1433;databaseName=sonar_67;encrypt=false sonar.jdbc.username=<你的数据库用户名> sonar.jdbc.password=<你的数据库密码>启动新实例后,SonarQube会自动执行数据库迁移脚本——这一步很关键!脚本会把5.6的数据库结构升级到6.7的版本,而且这个过程是不可逆的,所以一定要用数据库副本,绝对不能碰原数据库,不然旧的5.6实例就废了。
步骤4:全面验证新实例
启动后登录新系统,要重点检查这些内容:- 你那8-10个项目是不是都完整显示,历史的代码质量报告、问题记录、度量数据有没有丢失。
- 选一个项目重新跑一次Sonar扫描,确认结果能正常上传到新实例,没有报错。
- 检查用户、组的权限配置,还有自定义的质量规则、配置是不是都正常生效。
- 要是用了第三方插件,得确认这些插件有没有6.7版本的支持,不兼容的插件要先卸载,不然可能导致新实例启动失败。
步骤5:平稳切换停用旧实例
确认新实例完全没问题后,就可以停掉旧的5.6服务了。旧数据库建议先保留一段时间,以防万一有问题能回滚。之后可以把新实例的端口改回原来的9000,或者通知团队切换到新的访问地址。
要避开的坑
- 数据库迁移不可逆:再强调一遍,必须用数据库副本,不能直接操作原数据库,不然旧实例直接用不了。
- 插件兼容性:5.6的插件很多不兼容6.7,升级前先列出来你用的所有插件,确认有没有对应6.7的版本,没有的话要么找替代,要么暂时停用。
- 索引重建:新实例启动后可能会自动重建搜索索引,这个过程根据数据量大小可能要花几分钟到几十分钟,期间部分功能可能用不了,耐心等它完成就行。
- SQL Server字符集:恢复的数据库要确保collation是
SQL_Latin1_General_CP1_CS_AS,不然可能出现乱码或者字符匹配的问题。
三、总结
直接升级和你提出的并行方案都可行,但并行方案更安全,适合你这种有多个项目依赖的场景,完全不会影响现有业务。只要严格按照步骤来,尤其是做好数据库备份和副本,用SQL Server的情况下肯定能顺利完成升级。
内容的提问来源于stack exchange,提问作者Atul Sureka

