You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者Алексей

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:46:04