使用Helm配置Keycloak+PostgreSQL时出现client_id列不存在错误
解决Keycloak切换PostgreSQL后出现"column 'client_id' does not exist"错误
我来帮你搞定这个问题——这个报错我之前处理过好几次,本质就是Keycloak依赖的数据库表结构没正确创建,尤其是带client_id列的表压根没生成出来。先理清楚你的情况:
问题回顾
你用Helm部署Keycloak 3.4.0.Final,用默认H2数据库时一切正常,但切换到外部PostgreSQL后就炸了,报错:
ERROR: column "client_id" does not exist
你的Helm配置片段是这样的:
keycloak: replicas: 1 image: repository: jboss/keycloak tag: 3.4.0.Final username: admin password: admin service: type: LoadBalancer persistence: deployPostgres: false dbVendor: POSTGRES dbName: keycloak dbHost: xxx.pgsql.domain.com dbPort: 5432 dbUser: keycloak
为啥会出这问题?
Keycloak 3.4.0是个比较老的版本了(2017年发布),切换到PostgreSQL出问题大概率是这几个原因:
- 你没配置数据库密码,Keycloak连不上数据库,自然没法自动初始化表结构
- 外部PostgreSQL没提前执行Keycloak的初始化脚本,表和列都没创建
- 你的PostgreSQL版本太高,和Keycloak 3.4.0的驱动不兼容(这个版本只支持PostgreSQL 9.x)
一步步解决
1. 先补上数据库密码配置
你的配置里缺了dbPassword或者对应的Secret,Keycloak没密码连不上PostgreSQL,根本没法初始化。两种方式补充:
- 测试环境可以直接明文配置(生产环境不推荐):
persistence: # ... 其他配置保持不变 ... dbPassword: 你的PostgreSQL密码 - 生产环境用Kubernetes Secret更安全:
先创建Secret:
然后在Helm配置里指定:kubectl create secret generic keycloak-db-secret --from-literal=password=你的PostgreSQL密码persistence: # ... 其他配置保持不变 ... existingSecret: keycloak-db-secret existingSecretKey: password
2. 手动执行初始化脚本(如果自动初始化失败)
老版本Keycloak的自动初始化偶尔会出问题,你可以手动给PostgreSQL创建表结构:
- 下载Keycloak 3.4.0.Final的源码包,找到
docs/javadocs/org/keycloak/connections/jpa/updater/liquibase/changeLog/postgres目录下的所有脚本 - 用psql连接到你的数据库:
psql -h xxx.pgsql.domain.com -U keycloak -d keycloak - 按顺序执行这些脚本,先跑基础schema的脚本,再执行更新脚本,确保所有表和列都正确生成
3. 检查PostgreSQL版本兼容性
Keycloak 3.4.0只支持PostgreSQL 9.x版本,如果你的外部数据库是10+版本,肯定会有兼容问题。要么把PostgreSQL降级到9.6版本,要么把Keycloak升级到15+版本(新版本支持PostgreSQL 10+)
4. 确认数据库用户权限
别忘检查keycloak用户有没有足够的操作权限:
- 修改PostgreSQL的
pg_hba.conf文件,允许Keycloak所在的Kubernetes集群IP段连接数据库 - 给用户授予全数据库权限:
GRANT ALL PRIVILEGES ON DATABASE keycloak TO keycloak;
验证步骤
- 重新部署Keycloak:
helm upgrade --install keycloak 你的HelmChart名称 -f 你的配置文件.yaml - 查看Pod日志确认没有报错:
kubectl logs -f keycloak-0 - 登录Keycloak管理控制台,尝试创建客户端等操作,确认功能正常
内容的提问来源于stack exchange,提问作者Huy Chau
相关产品推荐
相关产品推荐

