使用Liquibase+MySQL时出现'databasechangelog表已存在'错误求助
Table 'databasechangelog' already exists的问题 针对你从MariaDB迁移至MySQL时遇到的这个错误,可按以下步骤排查解决:
确认
databasechangelog表的合法性
登录MySQL执行DESCRIBE databasechangelog;,检查该表是否是Liquibase标准结构(包含ID、AUTHOR、FILENAME等字段)。如果表存在但结构异常(比如手动修改过、或者从MariaDB迁移过来时结构不兼容),Liquibase会无法识别,进而尝试重新创建表导致报错。这种情况可以备份数据后删除该表,重新执行Liquibase update,让它自动生成标准结构的表。补充MySQL连接URL参数
在你的Maven插件配置的<url>中添加useInformationSchema=true参数,这个参数能确保Liquibase正确读取MySQL的元数据,避免因元数据读取异常导致的表存在性判断错误。修改后的URL示例:<url>jdbc:mysql://localhost:3306/mysql?useInformationSchema=true</url>验证
lower_case_table_names的实际生效状态
执行SHOW VARIABLES LIKE 'lower_case_table_names';确认当前值是否为1。注意该参数需要重启MySQL实例才能生效,如果只是修改了配置文件但未重启,实际值可能还是默认值,这会导致表名大小写识别不一致。检查changelog文件内容
打开changelog.mysql.sql,确认里面没有手动编写创建databasechangelog或databasechangeloglock表的语句。Liquibase会自动管理这两个系统表,手动添加创建语句会导致重复执行时冲突。用Liquibase status命令排查识别问题
执行mvn liquibase:status命令,查看输出信息。如果Liquibase显示"Database is up to date",说明它能识别已有的变更记录和系统表;如果显示有未执行的变更,或者提示找不到系统表,说明存在元数据读取或表识别的问题,可进一步针对性排查。
内容的提问来源于stack exchange,提问作者Wombert

