Flyway集成Apache Ignite报错:找不到INFORMATION_SCHEMA如何解决?
Flyway与Apache Ignite集成问题排查与解决方案
问题背景
尝试将Flyway与Apache Ignite集成,已引入官方Maven依赖:
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>10.12.0</version> </dependency> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-database-ignite</artifactId> <version>10.12.0</version> </dependency>
运行时出现错误,提示找不到INFORMATION_SCHEMA:
Exception in thread "main" org.flywaydb.core.internal.exception.FlywaySqlException: Unable to check whether schema "PUBLIC" exists ---------------------------------------------- SQL State : 42000 Error Code : 1001 Message : Failed to validate query. From line 1, column 22 to line 1, column 48: Object 'INFORMATION_SCHEMA' not found at org.flywaydb.core.internal.database.base.Schema.exists(Schema.java:57) at org.flywaydb.core.internal.command.DbValidate.validate(DbValidate.java:89) at org.flywaydb.core.Flyway.doValidate(Flyway.java:418) at org.flywaydb.core.Flyway.lambda$migrate$0(Flyway.java:162) at org.flywaydb.core.FlywayExecutor.execute(FlywayExecutor.java:210) at org.flywaydb.core.Flyway.migrate(Flyway.java:151) at com.soramaki.fna.imbe.IMBeApplication.main(IMBeApplication.java:20) Caused by: java.sql.SQLException: Failed to validate query. From line 1, column 22 to line 1, column 48: Object 'INFORMATION_SCHEMA' not found at org.apache.ignite.internal.jdbc.thin.JdbcThinConnection.sendRequest(JdbcThinConnection.java:1010) at org.apache.ignite.internal.jdbc.thin.JdbcThinStatement.execute0(JdbcThinStatement.java:234) at org.apache.ignite.internal.jdbc.thin.JdbcThinPreparedStatement.executeWithArguments(JdbcThinPreparedStatement.java:252) at org.apache.ignite.internal.jdbc.thin.JdbcThinPreparedStatement.executeQuery(JdbcThinPreparedStatement.java:78) at org.flywaydb.core.internal.jdbc.JdbcTemplate.queryForInt(JdbcTemplate.java:111) at org.flywaydb.community.database.ignite.thin.IgniteThinSchema.doExists(IgniteThinSchema.java:48) at org.flywaydb.core.internal.database.base.Schema.exists(Schema.java:55) ... 6 more
核心需求:应用启动时执行未应用过的SQL脚本。
错误原因
Flyway的Ignite Thin驱动实现默认通过查询标准INFORMATION_SCHEMA视图来检查Schema是否存在,但Apache Ignite JDBC Thin连接不支持该标准系统视图。Ignite有自己的元数据体系,使用SYS模式下的专属视图而非INFORMATION_SCHEMA。
修复方案
1. 切换到Ignite JDBC Thick驱动(推荐)
Thick驱动对JDBC元数据的支持更完整,Flyway的Ignite集成对其兼容性更好:
- 修改JDBC连接URL:从
jdbc:ignite:thin://<host>:<port>改为jdbc:ignite://<host>:<port>或jdbc:ignite:cfg:///path/to/ignite-config.xml - 添加Ignite Thick驱动依赖:
<dependency> <groupId>org.apache.ignite</groupId> <artifactId>ignite-jdbc</artifactId> <version>匹配你的Ignite版本</version> </dependency>
2. 自定义Schema存在性检查(适配Thin驱动)
若必须使用Thin驱动,需重写Flyway的Ignite Thin Schema实现:
- 继承
IgniteThinSchema类,替换doExists()方法的查询逻辑,改用Ignite支持的SYS.SCHEMAS视图:
public class CustomIgniteThinSchema extends IgniteThinSchema { public CustomIgniteThinSchema(IgniteThinDatabase database, String name) { super(database, name); } @Override protected boolean doExists() { String query = "SELECT COUNT(*) FROM SYS.SCHEMAS WHERE SCHEMA_NAME = ?"; return getJdbcTemplate().queryForInt(query, getName()) > 0; } }
- 通过Flyway的
DatabaseType扩展机制注册自定义实现,替换默认的Ignite Thin驱动逻辑。
3. 临时禁用Schema检查(仅测试用)
添加Flyway配置跳过初始Schema验证:
flyway.baselineOnMigrate=true flyway.validateMigrationNaming=false
此方案会跳过部分校验,可能引发潜在问题,不建议生产环境使用。
替代迁移方案(满足核心需求)
1. 基于Ignite原生API实现脚本执行
直接用Ignite API管理脚本执行状态,无需依赖Flyway:
- 创建迁移记录缓存/表,存储已执行脚本的名称和时间
- 启动时扫描脚本目录,对比记录执行未运行的脚本:
Ignite ignite = Ignition.start(); // 用缓存存储迁移记录,也可改用SQL表 IgniteCache<String, String> migrationCache = ignite.getOrCreateCache("app_migrations"); File scriptDir = new File("src/main/resources/db/migration"); for (File script : Objects.requireNonNull(scriptDir.listFiles( (dir, name) -> name.startsWith("V") && name.endsWith(".sql")))) { String scriptName = script.getName(); if (!migrationCache.containsKey(scriptName)) { String sqlContent = Files.readString(script.toPath()); ignite.sql().execute(sqlContent); migrationCache.put(scriptName, LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); } }
2. Flyway离线模式
保留Flyway的脚本管理能力,手动维护迁移状态:
- 配置Flyway离线模式:
flyway.offline=true
- 需手动跟踪已执行的迁移版本,适合简单场景。
内容的提问来源于stack exchange,提问作者Алексей
相关产品推荐
相关产品推荐

