迁移到生产应用数据库

本文档介绍如何将使用内置应用程序数据库 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 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(带有 db 连接信息,但没有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 文件副本,这是在备份应用 db(步骤 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 文件中的数据放入您的新应用 db,在此例中为 Postgres db),然后退出。

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

5. 启动一个使用新应用 db 的新 Docker 容器

您的新应用程序数据库已填充 Metabase 数据,您可以启动一个新容器,并告知容器中的 Metabase 连接到 appdb。命令将如下所示

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.