迁移到生产应用程序数据库
本页介绍如何将一直使用内置应用程序数据库 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 应用程序数据库
- 3. 停止现有的 Metabase 容器
- 3. 下载 JAR
- 4. 运行迁移命令
- 5. 启动使用新应用程序数据库的新 Docker 容器
- 7. 删除使用 H2 数据库的旧容器
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 连接到 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 版本的文档。