使用或迁移 H2 应用程序数据库

您已安装 Metabase,但是

  • 您正尝试将应用程序数据库从 H2 迁移到另一个数据库,但出现了问题,
  • 您正尝试降级而不是升级,
  • 当您尝试运行 Metabase 时,它会记录一条 liquibase 错误消息,
  • 当 Metabase 运行时,它会记录另一条提及 H2h2 的错误消息,或者
  • 您使用的是 Windows 10,并收到有关文件权限的警告。

您当前使用 H2 作为您的应用程序数据库吗?

根本原因: Metabase 将有关用户、问题等信息存储在其自己的数据库中,该数据库称为“应用程序数据库”或简称“应用程序数据库”。默认情况下,Metabase 使用 H2 作为应用程序数据库,但我们不建议将其用于生产环境,因为它是一个磁盘数据库,对文件系统错误很敏感,例如驱动器损坏或文件未正确刷新。

采取的步骤

  1. 要检查您正在使用的应用程序数据库,请转到管理面板,打开工具选项卡,向下滚动到“诊断信息”,并在显示的 JSON 中查找 application-database 键。
  2. 有关如何迁移到更强大的应用程序数据库的说明,请参阅 从 H2 迁移

您是否正尝试将应用程序数据库从 H2 迁移到其他数据库?

根本原因: 您正尝试使用 load-from-h2 命令将应用程序数据库从 H2 迁移到生产数据库(如 PostgreSQL 或 MySQL/MariaDB),但由于数据库文件名不正确而失败,并出现类似以下内容的错误消息:

Command failed with exception: Unsupported database file version or invalid file header in file <YOUR FILENAME>

采取的步骤

  1. 创建导出的 H2 数据库副本(请参阅 备份 Metabase 应用程序数据)。在完成此操作之前,请勿继续,以防出现问题。

  2. 检查您导出的 H2 数据库文件是否命名为 metabase.db.mv.db

  3. H2 会自动将 .mv.db 扩展名添加到您在命令行中指定的数据库路径,因此请确保您传递给命令的 DB 文件路径包含 .mv.db 扩展名。例如,如果您已导出一个应用程序数据库,并希望使用 load-from-h2 将该 H2 数据库中的数据加载到 PostgreSQL 数据库中,您的命令将如下所示:

    export MB_DB_TYPE=postgres
    export MB_DB_DBNAME=metabase
    export MB_DB_PORT=5432
    export MB_DB_USER=<username>
    export MB_DB_PASS=<password>
    export MB_DB_HOST=localhost
    java --add-opens java.base/java.nio=ALL-UNNAMED -jar metabase.jar load-from-h2 /path/to/metabase.db # do not include .mv.db
    

如果您使用的是 Metabase 的专业版或企业版,您可以使用序列化来快照您的应用程序数据库。序列化在您想要在新 Metabase 实例中预加载问题和仪表板时很有用。

您正在尝试降级吗?

根本原因: Metabase 不支持降级(即,恢复到应用程序的早期版本)。

采取的步骤

  1. 关闭 Metabase。
  2. 恢复您在尝试升级或降级之前制作的应用程序数据库备份副本。
  3. 恢复您要恢复到的旧版本的 JAR 文件或容器。
  4. 重新启动 Metabase。

应用程序数据库是否被锁定?

根本原因: 有时 Metabase 无法启动,因为应用程序数据库锁在之前的运行中未正确清除。错误消息类似如下:

liquibase.exception.DatabaseException: liquibase.exception.LockException: Could not acquire change log lock.

采取的步骤

  1. 在安装 Metabase 的服务器上打开 shell 并运行以下命令手动清除锁:

    java --add-opens java.base/java.nio=ALL-UNNAMED -jar metabase.jar migrate release-locks
    
  2. 此命令完成后,正常重启您的 Metabase 实例(不带 migrate release-locks 标志)。

应用程序数据库是否已损坏?

根本原因: H2 不如生产级数据库管理系统可靠,有时数据库本身会损坏。这可能导致应用程序数据库中的数据丢失,但不会损坏 Metabase 连接的数据库中的数据。

采取的步骤: 错误消息可能因应用程序数据库损坏的方式而异,但在大多数情况下,日志消息会提及 h2。典型的命令和消息是:

myUser@myIp:~$ java --add-opens java.base/java.nio=ALL-UNNAMED -cp metabase.jar org.h2.tools.RunScript -script whatever.sql -url jdbc:h2:~/metabase.db
Exception in thread "main" org.h2.jdbc.JdbcSQLException: Row not found when trying to delete from index """"".I37: ( /* key:7864 */ X'5256470012572027c82fc5d2bfb855264ab45f8fec4cf48b0620ccad281d2fe4', 165)" [90112-194]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
    [etc]

如何解决: 并非所有 H2 错误都是可恢复的(这就是为什么如果您使用 H2,请务必为应用程序数据库文件制定备份策略)。

如果您正在运行最新版本并使用 H2,应用程序数据库存储在 metabase.db.mv.db 中。- 在 Metabase 实例正在运行的服务器上打开 shell,并尝试通过运行以下四个命令来恢复损坏的 H2 文件:

java -cp metabase.jar org.h2.tools.Recover

mv metabase.db.mv.db metabase-old.db.mv.db

touch metabase.db.mv.db

java --add-opens java.base/java.nio=ALL-UNNAMED -cp target/uberjar/metabase.jar org.h2.tools.RunScript -script metabase.db.h2.sql -url jdbc:h2:`pwd`/metabase.db

您在 Windows 10 上使用 H2 运行 Metabase 吗?

根本原因: 在 Windows 10 的某些情况下,Metabase JAR 需要有权限为应用程序数据库创建本地文件。运行 JAR 时,您会看到如下错误消息:

Exception in thread "main" java.lang.AssertionError: Assert failed: Unable to connect to Metabase DB.

采取的步骤

  1. 右键单击 Metabase JAR 文件(不是应用程序数据库文件)。
  2. 选择“属性”。
  3. 选择“取消阻止”。

应用程序数据库加载时间过长吗?

根本原因: 您正在使用 H2 作为您的应用程序数据库,并且应用程序数据库太大,无法在不到 5 秒(默认超时值)内加载。当您尝试启动 Metabase 时,您会在控制台中看到“超时”消息。

采取的步骤

  1. 为应用程序数据库使用生产级数据库(如 PostgreSQL)(首选)。
  2. 转到管理面板并增加应用程序数据库的超时设置。
  3. 将 Metabase 移到更快的服务器(特别是具有更快磁盘的服务器)。

阅读其他版本的 Metabase 的文档。

这有帮助吗?

感谢您的反馈!
想改进这些文档吗?提出更改。
© . This site is unofficial and not affiliated with Metabase, Inc.