You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keycloak 15.0.2对接MySQL5.7使用Connector 8.0.27启动报错问题咨询

问题根因分析
  • 首次启动超时回滚:Keycloak 15.0.2首次连接空MySQL库时,需要通过Liquibase执行全量数据库初始化脚本,默认的JTA事务超时时间为300秒(5分钟),不足以完成全量变更执行,事务被强制回滚,因此抛出STATUS_ROLLEDBACK异常。
  • 后续启动表不存在报错:首次启动时变更执行中途事务回滚,Liquibase的变更记录表DATABASECHANGELOG已记录了部分执行完成的变更ID,但对应业务表因为事务回滚并没有实际持久化创建,后续启动时Liquibase会尝试回滚未完成的变更,执行删除外键的SQL时找不到对应表就触发报错。
  • 隐藏兼容问题:MySQL Connector 8.0.27默认的元数据扫描规则、大小写敏感校验与MySQL 5.7默认配置不兼容,会大幅拖慢Liquibase变更执行速度,同时可能出现大写SQL表名匹配不到实际创建的小写表名的问题。
解决方案

步骤1:清理损坏的Keycloak库

登录MySQL执行以下SQL,删除已损坏的半初始化库,重新创建空库:

DROP DATABASE IF EXISTS keycloak;
CREATE DATABASE keycloak DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

步骤2:调整MySQL配置

修改MySQL配置文件my.cnf(Windows环境为my.ini),添加以下参数后重启MySQL服务:

# 表名大小写不敏感,必须在实例首次初始化时配置,已初始化实例修改会导致现有库表异常
lower_case_table_names=1
# 适配Keycloak要求的事务隔离级别
transaction-isolation = READ-COMMITTED

步骤3:延长Keycloak事务超时时间

修改Keycloak配置文件standalone/configuration/standalone.xml(集群模式修改standalone-ha.xml),找到JTA协调器配置项,将默认超时时间从300秒调整为3600秒:

<coordinator-environment default-timeout="3600"/>

步骤4:调整JDBC连接参数

修改Keycloak数据源的JDBC连接URL,添加必要的兼容参数:

jdbc:mysql://<你的MySQL服务地址>:3306/keycloak?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true

其中nullCatalogMeansCurrent=true为必填参数,Connector 8.x默认该参数为false,会导致Liquibase扫描所有库的元数据,大幅拉长变更执行时长。

步骤5:执行首次初始化

启动Keycloak服务,等待首次初始化完成,服务启动成功无报错后,可将步骤3中的事务超时时间改回默认的300秒,后续重启不需要延长超时时间。

内容的提问来源于stack exchange,提问作者shashank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:36:05