#问题来源#
综合了所有的现实系统考虑后,最后决定使用9.98版本,来满足现在的需求,结果又卡壳了。。。。一波三折
背景:
将8.9版本的数据从PG10导出后,直接导入9.9对应的PG14A版本,,使用pg_dumall,导出的sql,导入后,启动服务一直停留在维护页面,停留了一夜
一、页面含义
这个页面代表 SonarQube 正在执行数据库迁移升级,属于版本跨代升级必经流程: 8.9(LTS)升级至 9.9(LTS)会自动触发数据库结构变更,服务会进入维护锁状态,禁止用户访问,迁移完成后页面自动恢复。
二、分场景排查处理
场景 1:刚启动升级,页面刚出现(正常等待阶段)
- 不要刷新、不要重启服务,等待后台执行数据库迁移;
- 查看 SonarQube 日志目录
sonarqube/logs/sonar.log,观察日志关键词:Executing migration step:正在执行表结构、索引、数据迁移Migration completed:迁移完成,页面会自动退出维护模式
- 迁移耗时取决于数据库数据量:
- 小项目(十万行代码内):5–30 分钟
- 大量历史项目、千万级扫描记录:1–4 小时都正常
场景 2:长时间停留在维护页,日志报错(卡死 / 迁移失败)
1)前置校验:升级前置条件是否满足(8.9→9.9 硬性要求)
- 数据库版本
- PostgreSQL ≥9.6(推荐 13+);MySQL/Oracle 部分旧版本不再支持 若使用 MySQL,9.9 已大幅限制兼容,推荐切换 PostgreSQL
- Java 运行环境SonarQube 9.9 必须使用 Java 17,不能沿用 8.9 的 Java11,否则迁移直接崩溃
- 磁盘空间数据库磁盘预留至少原库 30% 空闲空间,迁移会生成临时表 / 备份数据
- 插件兼容8.9 旧插件大多不兼容 9.9,升级前全部移除
extensions/plugins目录下第三方插件,升级完成后再安装适配 9.9 的新版插件
2)常见报错与修复
报错 1:数据库权限不足
日志出现permission denied for table解决:给 SonarQube 数据库账号授予ALTER, CREATE, DROP, INDEX, REFERENCES全部权限。
报错 2:内存不足迁移中断
日志OutOfMemoryError修改sonarqube/conf/sonar.properties调整 JVM 参数:
# 迁移阶段调高内存 sonar.web.javaOpts=-Xmx4G -Xms2G sonar.ce.javaOpts=-Xmx4G -Xms2G sonar.search.javaOpts=-Xmx2G -Xms1G修改后重启 SonarQube,会继续上次未完成的迁移。
报错 3:8.9 旧数据库结构脏数据 / 约束冲突
- 先停止 SonarQube 服务;
- 备份完整数据库;
- 进入数据库执行脏数据清理(根据日志报错表删除无效外键 / 重复索引);
- 重启服务重新触发迁移。
场景 3:管理员误操作,想跳过 / 重置维护锁(不推荐优先用)
只有确认数据库迁移完全失败且回滚备份后才能执行:
- 停止 SonarQube;
- 连接数据库,执行 SQL 清空维护标记:
UPDATE properties SET text_value='' WHERE kee='sonar.core.maintenance.lock';- 重启服务,会重新发起完整迁移。
警告:迁移中途执行此操作会直接损坏数据库,仅回滚备份后使用!
三、标准 8.9→9.9 升级完整步骤(避免卡死维护页)
- 全量备份
- SonarQube 安装目录完整备份
- PostgreSQL/MySQL 数据库全量备份
- 停止旧 8.9 服务
- 替换为 9.9 安装包,保留
conf/sonar.properties数据库配置 - 删除旧插件目录所有第三方插件
- 配置 Java17 环境变量,修改 JVM 内存参数
- 启动 9.9 服务,只查看日志,不访问页面
- 日志输出
Migration completed successfully后,刷新页面登录 - 登录后安装适配 9.9 的新版代码语言插件
四、补充提示页面两段文字说明
install SonarLint in your IDE维护等待期间可提前在本地 IDE 安装 SonarLint,本地实时扫描替代等待服务恢复。read the upgrade guide官方升级文档:专门说明跨 LTS 版本(8.9→9.9)数据库迁移、兼容性、回滚方案,出现异常优先查阅官方升级指南。