Spring Boot中Flyway未创建Hello表却执行数据插入的问题排查
Flyway迁移问题排查:V1脚本未创建表但V2执行成功
问题场景
在Spring Boot配置服务应用中,通过Flyway管理数据库迁移:
resource/db/migration/V1__Create_Hello.sql用于创建hello表resource/db/migration/V2_Insert_properties.sql向手动创建的property表插入数据
目前V2的数据插入操作正常,但hello表未被创建,flyway_schema_history显示迁移记录存在(用户提供截图佐证)。
相关代码与配置
V1__Create_Hello.sql 脚本
CREATE TABLE hello ( id INT AUTO_INCREMENT PRIMARY KEY, app VARCHAR(255) NOT NULL, key VARCHAR(255) NOT NULL, value TEXT, UNIQUE KEY unique_property (app, key) );
V2_Insert_properties.sql 脚本
INSERT INTO property (app,key, value) VALUES ('app', ‘key1’, ‘va’l1);
application.yml 配置
spring: application: name: config-server profiles: active: jdbc datasource: driverClassName: com.mysql.cj.jdbc.Driver url: "${MYSQL_URL:jdbc:mysql://localhost:3306/myDB}" username: "${MYSQL_USERNAME:root}" password: "${MYSQL_PASSWORD:root}" flyway: enabled: true baseline-on-migrate: true locations: "classpath:db/migration" cloud: config: server: jdbc: sql: SELECT property_key, property_value FROM property WHERE application = ? and profile = ? and label = ? order : 1 encrypt: enabled: true jpa: show-sql: true server: port: 8088 management: endpoints: web: exposure: include: "*"
问题原因分析
SQL语法错误(核心原因)
key是MySQL的保留关键字,在V1脚本中直接将其作为列名使用,会导致CREATE TABLE语句执行失败。部分场景下Flyway可能会将脚本标记为"执行成功"(如错误未被正确捕获或日志未输出),但实际表并未创建。V2脚本的潜在语法问题
V2脚本中使用了中文全角引号(‘key1’),且va’l1中的单引号未转义,这会导致SQL执行报错,但用户反馈V2执行正常,推测是输入时的笔误,需修正避免后续问题。日志缺失导致问题定位困难
默认日志级别下,Flyway的执行细节未完全输出,无法直观看到V1脚本的执行错误。
解决方案
1. 修正V1脚本的保留关键字问题
将key列名用MySQL反引号(`)包裹,转义保留关键字:
CREATE TABLE hello ( id INT AUTO_INCREMENT PRIMARY KEY, app VARCHAR(255) NOT NULL, `key` VARCHAR(255) NOT NULL, value TEXT, UNIQUE KEY unique_property (app, `key`) );
2. 修正V2脚本的引号问题
替换中文全角引号为英文半角引号,并转义特殊字符:
-- 如果值是val1 INSERT INTO property (app,`key`, value) VALUES ('app', 'key1', 'val1'); -- 如果值是va'l1,需转义单引号 INSERT INTO property (app,`key`, value) VALUES ('app', 'key1', 'va\'l1');
3. 修复Flyway迁移历史并重新执行
- 若
flyway_schema_history中V1版本已被标记为成功,需手动删除该版本记录; - 执行Flyway的
repair命令修复历史记录(或直接重启应用,配合baseline-on-migrate配置); - 添加日志配置,查看Flyway执行细节:
logging: level: org.flywaydb: DEBUG
4. 验证迁移结果
重启应用后,查看数据库中是否创建了hello表,同时检查flyway_schema_history中的迁移状态是否正常。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

