迁移到生产应用程序数据库

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

如果您想迁移到Metabase Cloud,请参阅迁移到Metabase Cloud

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 JAR,您应该以服务方式运行 Metabase

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

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

4. 运行 Metabase 数据迁移命令

使用目标数据库的适当 环境变量 运行迁移命令 load-from-h2

有关指定数据库的详细信息,请参阅配置应用数据库

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

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

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

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 文件迁移命令),然后您应该可以正常运行。例如,如果您使用的是 PostgreSQL,启动 Metabase 的命令可能如下所示

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

然而,您应该保留旧的 H2 文件以备安全之需,或者作为传家宝、护身符或 whatever。

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

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

Metabase 提供了用于迁移到新应用数据库的定制迁移命令。以下是您需要执行的操作

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

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

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

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

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

3. 停止现有的 Metabase 容器

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

3. 下载 JAR

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

请确保您使用与之前相同的Metabase版本。如果您想升级,请在确认迁移成功后执行升级。

4. 运行迁移命令

在备份应用程序数据库时(步骤2),从容器中提取的H2文件创建另一个副本。

在包含您的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 -jar metabase.jar load-from-h2 /path/to/metabase.db # do not include .mv.db

Metabase将启动,执行迁移(这意味着,它将从H2文件中取出数据并将其放入您的新应用程序数据库中,在这个例子中是一个Postgres数据库),然后退出。

参见配置应用程序数据库

5. 启动一个新的 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版本的文档。

想改进这些文档吗? 提出更改。