迁移到生产应用数据库

本页介绍如何将使用内置应用程序数据库 H2 的 Metabase 转换为生产就绪的 PostgreSQL 实例。有关为何应使用 Postgres 作为应用程序数据库的更多信息,请参阅如何在生产环境中运行 Metabase

如果您想迁移到 Metabase Cloud,请查看迁移到 Metabase Cloud

Metabase 的应用程序数据库

Metabase 的本地安装和生产安装之间的主要区别在于应用程序数据库。此应用程序数据库跟踪您的所有 Metabase 数据:您的问题、仪表板、集合等等。

Metabase 附带一个嵌入式 H2 应用程序数据库,您应避免在生产环境中使用。Metabase 附带 H2 数据库的原因是我们希望人们在其本地计算机上启动 Metabase 并开始尝试提出问题。

如果您想在生产环境中运行 Metabase,您需要使用一个生产就绪的应用程序数据库来存储您的应用程序数据。您可以随时从使用默认的 H2 应用程序数据库切换,但如果您计划在生产环境中运行 Metabase,越早迁移到生产应用程序数据库越好。如果您继续使用默认的 H2 应用程序数据库运行 Metabase,并且不定期备份它,应用程序数据库可能会损坏,您最终可能会丢失所有的问题、仪表板、集合和其他 Metabase 数据。

迁移过程是一次性过程。您可以从任何拥有 H2 应用程序数据库文件的计算机执行迁移脚本。

避免同时迁移和升级

这里重要的一点是,在迁移过程中使用的 Metabase 版本必须相同。这意味着,您用于运行迁移命令的 Metabase 必须与上次用于创建或更新 H2 文件的 Metabase 版本相同,并且必须与您将在生产环境中使用的版本相同。只有在完成迁移之后才应考虑升级。

您也可以选择在 Metabase Cloud 计划上运行 Metabase,这将为您处理所有这些事情。如果您有现有的 Metabase,这里是如何迁移到 Metabase Cloud 的方法。

支持存储 Metabase 应用程序数据的数据库

我们建议使用 PostgreSQL 作为您的应用程序数据库。

  • PostgreSQL。最低版本:12。Postgres 是我们首选的 Metabase 应用程序数据库。
  • MySQL。最低版本:8.0.17。所需设置(默认设置):utf8mb4_unicode_ci 排序规则、utf8mb4 字符集和 innodb_large_prefix=ON
  • MariaDB。最低版本:10.4.0。所需设置(默认设置):utf8mb4_unicode_ci 排序规则、utf8mb4 字符集和 innodb_large_prefix=ON

JAR:如何从 H2 迁移到生产应用程序数据库

在整个迁移过程中,您必须使用相同版本的 Metabase。

Metabase 提供了一个自定义迁移命令,用于迁移到新的应用程序数据库。以下是您将要执行的操作:

1. 确认您可以连接到目标应用程序数据库

您必须能够在运行此迁移命令的任何环境中连接到目标应用程序数据库。因此,如果您尝试将数据移动到云数据库,请确保您可以连接到该数据库。

2. 关闭 Metabase 实例

您不希望在迁移过程中人们在您的 Metabase 中创建新内容。理想情况下,如果您在生产环境中运行 Metabase JAR,您正在将 Metabase 作为服务运行

3. 备份您的 H2 应用程序数据库

安全第一!请参阅备份 Metabase 应用程序数据

4. 运行 Metabase 数据迁移命令

使用适用于您要迁移到的目标数据库的相应环境变量运行迁移命令 load-from-h2

您可以在配置应用程序数据库中找到指定数据库的详细信息。

以下是迁移到 Postgres 数据库的示例命令

export MB_DB_TYPE=postgres
export MB_DB_CONNECTION_URI="jdbc:postgresql://<host>:5432/metabase?user=<username>&password=<password>"
java --add-opens java.base/java.nio=ALL-UNNAMED -jar metabase.jar load-from-h2 /path/to/metabase.db # do not include .mv.db

以下是使用 Java 参数而不是环境变量迁移到 MySQL 数据库的示例命令

java -DMB_DB_TYPE=mysql -DMB_DB_CONNECTION_URI="jdbc:mysql://<host>:3306/metabase?user=<username>&password=<password>" -jar metabase.jar load-from-h2 metabase.db

请注意,数据库文件的文件名本身可能是 /path/to/metabase.db.mv.db,但在运行 load-from-h2 命令时,您需要将路径截断为 /path/to/metabase.db

Metabase 期望您针对全新的(空)数据库运行该命令;它将为您创建数据库模式并迁移数据。

5. 启动您的 Metabase

启动您的 Metabase(包含数据库连接信息,但不包含 load-from-h2 和 H2 文件迁移命令),您应该就可以正常使用了。例如,如果您使用 Postgres,您的 Metabase 启动命令将类似于

export MB_DB_TYPE=postgres
export MB_DB_CONNECTION_URI="jdbc:postgresql://<host>:5432/metabase?user=<username>&password=<password>"
java --add-opens java.base/java.nio=ALL-UNNAMED -jar metabase.jar

但是,您应该保留旧的 H2 文件,以备不时之需,或作为传家宝、护身符,随便什么。

Docker:如何从 H2 迁移到生产应用程序数据库

在整个迁移过程中,您必须使用相同版本的 Metabase。

Metabase 提供了一个自定义迁移命令,用于迁移到新的应用程序数据库。以下是您将要执行的操作:

1. 确认您可以连接到目标应用程序数据库

您必须能够在运行此迁移命令的任何环境中连接到目标应用程序数据库。因此,如果您尝试将数据移动到云数据库,请确保您可以连接到该数据库。

2. 备份您的 H2 应用程序数据库

安全第一!请参阅备份 Metabase 应用程序数据

如果您不备份 H2 数据库,并且替换或删除了容器,您将丢失所有的问题、仪表板和其他 Metabase 数据,因此请务必在迁移前进行备份。

3. 停止现有 Metabase 容器

您不希望在迁移过程中人们在您的 Metabase 中创建新内容。

3. 下载 JAR

在您保存 H2 文件的目录中(即容器外部),下载您当前版本的 JAR。

请确保您使用一直以来使用的 Metabase 版本。如果您想升级,请在确认迁移成功后执行升级。

4. 运行迁移命令

从容器中提取 H2 文件(在步骤 2 中备份应用程序数据库时),并复制一份。

在包含 H2 文件和 Metabase JAR 的目录中,运行迁移命令 load-from-h2。使用您要迁移到的目标数据库的相应连接字符串或环境变量。命令将类似于

export MB_DB_TYPE=postgres
export MB_DB_CONNECTION_URI="jdbc:postgresql://<host>:5432/metabase?user=<username>&password=<password>"
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 将启动,执行迁移(即将 H2 文件中的数据放入您的新应用程序数据库,这里是 Postgres 数据库),然后退出。

请参阅配置应用程序数据库

5. 启动使用新应用程序数据库的新 Docker 容器

在您的新应用程序数据库填充了 Metabase 数据后,您可以启动一个新的容器,并指示容器中的 Metabase 连接到应用程序数据库。命令将如下所示:

docker run -d -p 3000:3000 \
  -e "MB_DB_TYPE=postgres" \
  -e "MB_DB_DBNAME=<your-postgres-db-name>" \
  -e "MB_DB_PORT=5432" \
  -e "MB_DB_USER=<db-username>" \
  -e "MB_DB_PASS=<db-password>" \
  -e "MB_DB_HOST=<your-database-host>" \
  --name metabase metabase/metabase

7. 移除使用 H2 数据库的旧容器

如果您已将 H2 文件备份到安全的地方,请继续删除旧容器。有关删除容器的信息,请参阅Docker 文档

手动运行 Metabase 应用程序数据库迁移

Metabase 启动时,通常会尝试确定应用程序数据库是否需要任何更改,如果需要,将自动执行这些更改。如果由于某种原因您想查看这些更改并在数据库上手动运行它们,我们允许您这样做。

只需在启动 Metabase 之前设置以下环境变量即可

export MB_DB_AUTOMIGRATE=false

应用程序启动时,如果存在必要的数据库更改,您将收到如下消息,指示应用程序无法继续启动,直到完成指定的升级

2015-12-01 12:45:45,805 [INFO ] metabase.db :: Database Upgrade Required

NOTICE: Your database requires updates to work with this version of Metabase.  Please execute the following sql commands on your database before proceeding.

-- *********************************************************************
-- Update Database Script
-- *********************************************************************
-- Change Log: migrations/liquibase.yaml
-- Ran at: 12/1/15 12:45 PM
-- Against: @jdbc:h2:file:/Users/agilliland/workspace/metabase/metabase/metabase.db
-- Liquibase version: 3.4.1
-- *********************************************************************

-- Create Database Lock Table
CREATE TABLE PUBLIC.DATABASECHANGELOGLOCK (ID INT NOT NULL, LOCKED BOOLEAN NOT NULL, LOCKGRANTED TIMESTAMP, LOCKEDBY VARCHAR(255), CONSTRAINT PK_DATABASECHANGELOGLOCK PRIMARY KEY (ID));

...

Once your database is updated try running the application again.

2015-12-01 12:46:39,489 [INFO ] metabase.core :: Metabase Shutting Down ...

然后,您可以获取提供的 SQL 脚本并手动将其应用于您的数据库。完成后,只需重新启动 Metabase,一切都应该正常工作。

疑难解答迁移问题

请查阅此故障排除指南

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

这有帮助吗?

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