迁移到生产应用程序数据库
本页介绍了如何将使用内置应用程序数据库 H2 的 Metabase 转换为生产就绪的 PostgreSQL 实例。有关为何应使用 Postgres 作为应用程序数据库的更多信息,请参阅如何在生产环境中运行 Metabase。
如果您更愿意迁移到 Metabase 云版,请查看迁移到 Metabase 云版。
Metabase 的应用程序数据库
Metabase 的本地安装和生产安装之间的主要区别在于应用程序数据库。此应用程序数据库会跟踪您所有的 Metabase 数据:您的问题、仪表板、集合等等。
Metabase 随附嵌入式 H2 应用程序数据库,您应避免在生产环境中使用。Metabase 随附 H2 数据库的原因是,我们希望人们能在本地机器上启动 Metabase 并开始尝试提问。
如果您想在生产环境中运行 Metabase,则需要使用生产就绪的应用程序数据库来存储您的应用程序数据。您可以随时从默认的 H2 应用程序数据库切换,但如果您计划在生产环境中运行 Metabase,越早迁移到生产应用程序数据库越好。如果您继续使用默认的 H2 应用程序数据库运行 Metabase,并且不定期备份,应用程序数据库可能会损坏,您最终可能会丢失所有问题、仪表板、集合和其他 Metabase 数据。
迁移过程是一次性过程。您可以从任何拥有 H2 应用程序数据库文件的计算机执行迁移脚本。
避免同时迁移和升级
这里重要的一点是,您在迁移过程中使用的 Metabase 版本必须相同。这意味着,您用于运行迁移命令的 Metabase 必须与上次用于创建或更新 H2 文件的 Metabase 是同一版本,也必须是您将在生产环境中使用的版本。只有在完成迁移之后,您才应考虑升级。
您也可以选择在Metabase 云版计划上运行 Metabase,它会为您处理所有这些事情。如果您有现有的 Metabase 实例,以下是如何迁移到 Metabase 云版。
支持用于存储 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 连接到该应用程序数据库。该命令将类似于:
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 版本的文档。