咨询:Keycloak Docker容器创建的MySQL数据库表位置及查看方法
核心问题:Keycloak未正确连接MySQL,回退到内置H2数据库
你当前的启动命令存在两个关键错误,导致Keycloak并未真正连接到你的MySQL实例,而是自动使用了内置的H2数据库(这就是为什么能保存用户,但MySQL里找不到对应表和数据的原因):
1. DB_ADDR参数格式错误
Keycloak的DB_ADDR仅需填写MySQL的主机地址/容器名,不需要完整的JDBC URL。你错误地把JDBC URL填入该参数,直接导致数据库连接失败。
2. 网络访问问题
如果你的MySQL运行在:
- 宿主机:容器内的
localhost指向Keycloak容器自身,而非宿主机,因此无法访问宿主机上的MySQL服务。 - 另一个Docker容器:需要确保MySQL容器也加入了
keycloak-network网络,否则Keycloak无法通过容器名访问它。
修正后的启动命令
根据你的MySQL部署场景选择对应命令:
场景1:MySQL运行在宿主机(Docker Desktop环境)
docker run -p 9090:8080 --name keycloak --net keycloak-network \ -e KEYCLOAK_ADMIN=admin \ -e KEYCLOAK_ADMIN_PASSWORD=admin \ -e DB_VENDOR=MYSQL \ -e DB_URL=jdbc:mysql://host.docker.internal:3306/keycloak?useSSL=false&allowPublicKeyRetrieval=true \ -e DB_USER=keycloak \ -e DB_PASSWORD=keycloak \ quay.io/keycloak/keycloak:latest start-dev
场景2:MySQL运行在同一网络的Docker容器(容器名为mysql)
docker run -p 9090:8080 --name keycloak --net keycloak-network \ -e KEYCLOAK_ADMIN=admin \ -e KEYCLOAK_ADMIN_PASSWORD=admin \ -e DB_VENDOR=MYSQL \ -e DB_ADDR=mysql \ -e DB_PORT=3306 \ -e DB_DATABASE=keycloak \ -e DB_USER=keycloak \ -e DB_PASSWORD=keycloak \ quay.io/keycloak/keycloak:latest start-dev
验证连接与查看数据
确认Keycloak已连接MySQL:查看Keycloak运行日志,找到类似以下行,说明连接成功:
INFO [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (JPA Startup Thread: EE_MANAGEMENT_1) HHH000397: Using SQL Server dialect: org.hibernate.dialect.MySQL8Dialect
INFO [org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory] (ServerService Thread Pool -- 61) Using JPA provider: org.hibernate.jpa.HibernatePersistenceProvider查看MySQL中的Keycloak数据:
- 登录MySQL实例:
mysql -u root -p - 切换到keycloak数据库:
USE keycloak; - 查看所有Keycloak表:
SHOW TABLES; - 查看用户数据(例如
user_entity表):SELECT * FROM user_entity;
- 登录MySQL实例:
补充说明
当Keycloak无法连接到配置的外部数据库时,会自动回退到内置的H2数据库(默认存储在容器内的/opt/keycloak/data/h2/目录),你之前保存的用户数据都存在这个H2数据库里,而非你的MySQL实例。
内容的提问来源于stack exchange,提问作者Sharmi467

