JHipster集成MySQL首次启动失败:Liquibase表不合规报错
解决JHipster启动时Liquibase报错:"The table does not comply with the requirements by an external plugin"
问题重现
启动基于MySQL的JHipster应用时,Liquibase执行初始化SQL时抛出如下错误:
2019-07-30 09:55:40.583 ERROR 35895 --- [-service-task-1] i.g.j.c.liquibase.AsyncSpringLiquibase : Liquibase could not start correctly, your database is NOT ready: The table does not comply with the requirements by an external plugin. [Failed SQL: INSERT INTO compose.DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, `DESCRIPTION`, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('00000000000001', 'jhipster', 'config/liquibase/changelog/00000000000000_initial_schema.xml', NOW(), 1, '8:c5bfc567913b118109a43e981cd02883', 'createTable tableName=jhi_user; createTable tableName=jhi_authority; createTable tableName=jhi_user_authority; addPrimaryKey tableName=jhi_user_authority; addForeignKeyConstraint baseTableName=jhi_user_authority, constraintName=fk_authority_name, ...', '', 'EXECUTED', NULL, NULL, '3.6.3', '4491329886')] liquibase.exception.DatabaseException: The table does not comply with the requirements by an external plugin. [Failed SQL: INSERT INTO compose.DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, `DESCRIPTION`, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('00000000000001', 'jhipster', 'config/liquibase/changelog/00000000000000_initial_schema.xml', NOW(), 1, '8:c5bfc567913b118109a43e981cd02883', 'createTable tableName=jhi_user; createTable tableName=jhi_authority; createTable tableName=jhi_user_authority; addPrimaryKey tableName=jhi_user_authority; addForeignKeyConstraint baseTableName=jhi_user_authority, constraintName=fk_authority_name, ...', '', 'EXECUTED', NULL, NULL, '3.6.3', '4491329886')] at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:356) ... Caused by: java.sql.SQLException: The table does not comply with the requirements by an external plugin. at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ...
错误原因分析
这个错误的核心是你的MySQL服务器启用了某个外部插件,而Liquibase自动创建的DATABASECHANGELOG表不符合该插件的强制规则。常见的触发场景包括:
- 存储引擎插件(如Percona TokuDB):部分存储引擎对表结构有特殊要求,比如TokuDB可能要求表必须有单一列主键,而Liquibase的
DATABASECHANGELOG默认使用(ID, AUTHOR, FILENAME)复合主键,触发了插件的校验规则。 - 高可用插件(如MySQL Group Replication):Group Replication要求所有参与复制的表必须有主键,虽然
DATABASECHANGELOG有复合主键,但部分版本的插件可能对复合主键的支持存在兼容性问题。 - 安全/审计插件:某些安全插件会强制要求表满足特定规范,比如指定的字符集、排序规则,或者禁止使用某些数据类型。
解决方案
根据不同的插件场景,你可以尝试以下几种解决办法:
检查并调整MySQL插件配置
- 登录MySQL执行
SHOW PLUGINS;命令,确认启用了哪些外部插件。 - 如果是TokuDB这类存储引擎插件:可以在JHipster的
application.yml中添加liquibase.parameters.storageEngine: InnoDB,指定DATABASECHANGELOG表使用InnoDB存储引擎;或者调整插件参数允许复合主键的表。 - 如果是Group Replication:确保MySQL版本与插件版本兼容,或者手动为
DATABASECHANGELOG表添加一个自增单一主键列。
- 登录MySQL执行
手动创建符合要求的DATABASECHANGELOG表
在应用启动前,手动登录MySQL创建DATABASECHANGELOG表,确保其结构满足插件要求。比如添加一个自增主键列:CREATE TABLE compose.DATABASECHANGELOG ( ID VARCHAR(255) NOT NULL, AUTHOR VARCHAR(255) NOT NULL, FILENAME VARCHAR(255) NOT NULL, DATEEXECUTED DATETIME NOT NULL, ORDEREXECUTED INT NOT NULL, MD5SUM VARCHAR(255), `DESCRIPTION` VARCHAR(255), COMMENTS VARCHAR(255), EXECTYPE VARCHAR(10) NOT NULL, CONTEXTS VARCHAR(255), LABELS VARCHAR(255), LIQUIBASE VARCHAR(20) NOT NULL, DEPLOYMENT_ID VARCHAR(10), CHANGELOG_ID INT AUTO_INCREMENT PRIMARY KEY, -- 添加单一主键 PRIMARY KEY (ID, AUTHOR, FILENAME) );启动应用时,Liquibase会识别已存在的表并跳过创建步骤。
临时禁用冲突插件
如果该插件不是当前启动阶段必须的,可以临时禁用它(修改MySQL配置文件后重启服务),待Liquibase完成数据库初始化后再重新启用插件。升级Liquibase或MySQL版本
部分旧版本的Liquibase与MySQL插件存在兼容性问题,尝试升级Liquibase到最新稳定版(调整JHipster项目pom.xml或build.gradle中的依赖版本),或者升级MySQL到兼容的版本。
内容的提问来源于stack exchange,提问作者freecouch
相关产品推荐
相关产品推荐

