Liquibase更新变更集日志至DATABASECHANGELOG时报错求助
Liquibase执行建表后插入DATABASECHANGELOG报错3098原因分析
问题背景
执行以下SQL建表语句:
-- liquibase formatted sql -- changeset userName:1 CREATE TABLE JOB_INSTANCE ( INSTANCE_ID BIGINT NOT NULL PRIMARY KEY, VERSION BIGINT, JOB_NAME VARCHAR(100) NOT NULL, JOB_KEY VARCHAR(32) NOT NULL, constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) ) ENGINE = InnoDB;
环境信息:
- Liquibase版本:4.3.5
- MySQL版本:8.0.32
- JDBC连接器版本:mysql-connector-java-8.0.26
Liquibase配置:
changeLogFile=changelog/db-changelog-master.xml driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://server-host:3306/schema?serverTimezone=UTC username=root password=******* liquibase.hub.mode=off
错误现象
JOB_INSTANCE表创建成功,但出现如下错误:
Caused by: liquibase.exception.DatabaseException: The table does not comply with the requirements by an external plugin. [Failed SQL: (3098) INSERT INTO schema.DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, `DESCRIPTION`, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('1', 'user', 'changesets/schemas/script1.sql', NOW(), 1, '8:b52bd973e60d550446b6f005206925c6', 'sql', '', 'EXECUTED', NULL, NULL, '4.17.1', '7953110735')]
原因分析
- MySQL外部插件约束冲突
错误码3098对应MySQL的ER_TABLE_NOT_COMPLIANT_FOR_PLUGIN,说明你的MySQL实例启用了外部插件(如MySQL Enterprise Audit、Validate Password等安全类插件),而DATABASECHANGELOG表的结构未满足该插件的强制要求。常见场景包括:
- 插件要求表必须使用InnoDB存储引擎,但
DATABASECHANGELOG使用了MyISAM等其他引擎; - 插件对表的字符集、字段长度或数据类型有严格限制,现有表结构不匹配。
Liquibase版本不兼容
错误日志中DATABASECHANGELOG的LIQUIBASE字段值为4.17.1,但你实际使用的Liquibase版本是4.3.5。这表明之前可能用更高版本的Liquibase初始化过DATABASECHANGELOG表,不同版本的Liquibase对该表的结构定义存在差异,低版本写入时触发了插件的合规性检查。Schema或权限问题
JDBC URL指定的目标schema中,DATABASECHANGELOG表可能存在结构异常,或者当前数据库用户对该表的操作权限不足,导致插件检查失败。
验证步骤
- 执行
SHOW PLUGINS;查看MySQL已启用的插件,重点排查Audit、Security类插件; - 执行
DESCRIBE schema.DATABASECHANGELOG;检查表的存储引擎、字段类型等是否符合插件要求; - 对比Liquibase 4.3.5官方默认的
DATABASECHANGELOG表结构,与现有表进行差异比对。
内容的提问来源于stack exchange,提问作者sunny-java-dev
相关产品推荐
相关产品推荐

