metabase更换数据库,从h2到mysql,从docker到本地

7 阅读5分钟

本文应用的几种情境

  1. metabase自带的h2数据库改为mysql
  2. metabase转移位置,从docker到本地
  3. 连接/更换目标数据库

0. metabase的安装环境

  • java21
  • metabase
  • mysql8(可选,推荐)

无论是在docker还是在本地安装,都需要java21的环境和metabase安装包。metabase默认的数据库是自带的h2数据库,主要用于开发和测试环境,不适合大规模生产环境。推荐改用mysql8数据库。(这里的数据库指的是,存储仪表盘dashboard、模型model的数据库)

java21才支持新版本的metabase
在本地安装时,环境变量path里的%JAVA_HOME%要在最上面,才不会被别的java路径覆盖掉。

mysql要8以上的版本。
原因:MySQL在较旧版本中不支持CREATE OR REPLACE VIEW语句中的WITH子句。WITH agg_recipients AS (...)这种写法在MySQL中不被允许直接用于创建视图。

metabase环境.png

0.5 通过命令行连接mysql

dbeaver是数据库管理工具。在里面连接本地或docker上的mysql8服务器。

可以在dbeaver上右键服务器,“编辑 链接”来查看链接配置,包括url、端口和认证。只有认证能连接到数据库,新建的用户无论拥有什么权限都不行。 ERROR 1045 (28000): Access denied for user 'metabase'@'localhost' (using password: YES)

如果忘记mysql服务器的用户名和密码,可以使用openssl解密dbeaver的链接信息,再次获得。

dbeaver.png

在mysql中,为metabase创建数据库。

# 用sql编辑器,选对服务器
CREATE DATABASE `metabase2_db` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;

本地命令行 连接 本地mysql

mysql -h localhost -u [服务器用户名] -p
mysql -h 127.0.0.1 -P 3306 -u [服务器用户名] -p

本地命令行 连接 docker上的mysql

mysql -h localhost -P 3336 -u [服务器用户名] -p
mysql -h 127.0.0.1 -P 3336 -u [服务器用户名] -p

docker命令行 连接 mysql

要禁用ssl,否则会报错。其他代码一样

# 连接docker上的mysql
mysql -h localhost -P 3336 -u [服务器用户名] -p --ssl-mode=DISABLED
mysql -h 127.0.0.1 -P 3336 -u [服务器用户名] -p --ssl-mode=DISABLED

# 连接本地mysql
mysql -h localhost -P 3306 -u [服务器用户名] -p --ssl-mode=DISABLED
mysql -h 127.0.0.1 -P 3306 -u [服务器用户名] -p --ssl-mode=DISABLED

docker上的mysql ports 是 3336:3306。它映射到了3336。必须使用3336!
如果不确定,还可以在上述代码,输入密码登陆后,查看数据库名称,靠里面的内容分清。

SHOW DATABASES;
USE [目标数据库];
SHOW TABLES;

退出连接直接输入EXIT

1. 数据库转移,从h2到mysql

1.1 复制

1.1.0 备份

停止旧metabase容器,备份复制内容!

本地
复制jar包相同目录下的metabase.db.mv.db

docker
需要备份的h2文件在容器里的完整路径为/metabase.db/metabase.db.mv.db,复制一份到物理机。

docker cp metabase:/metabase.db/metabase.db.mv.db /data/backup/metabase.db.mv.db

1.1.1 复制

(docker:从官网上下载metabase的jar包,记住版本)
把jar包和h2数据库放在一起

java -DMB_DB_TYPE=mysql -DMB_DB_CONNECTION_URI="jdbc:mysql://localhost:3336/[新数据库名称]?user=[mysql服务器用户名]&password=[mysql服务器密码]" -jar metabase.jar load-from-h2 metabase.db

1.2 连接新数据库,运行metabase

新metabase的版本必须和jar包相同,或者更新。否则会报错“降级”,无法成功创建。

本地metabase & 本地mysql,直接使用jar包运行metabase

set MB_DB_TYPE=mysql
set MB_DB_DBNAME=[新数据库名称]
set MB_DB_PORT=3306
set MB_DB_USER=[mysql服务器用户名]
set MB_DB_PASS=[mysql服务器密码]
set MB_DB_HOST=127.0.0.1
java -jar metabase.jar

docker上的metabase & docker上的mysql,创建新的metabase容器

docker run -d -p 3000:3000 `
  -e MB_DB_TYPE=mysql `
  -e MB_DB_DBNAME=[新数据库名称] `
  -e MB_DB_PORT=3336 `
  -e MB_DB_USER=[mysql服务器用户名] `
  -e MB_DB_PASS=[mysql服务器密码] `
  -e MB_DB_HOST=host.docker.internal `
  --name [新metabase容器名称] `
  metabase/metabase:v0.55.3

其他组合可根据0.5自行更改port编号

2. metabase转移平台,从docker到本地,或者相反

  1. 关闭metabase
  2. 把metabase数据库从mysql中导出
  3. 在新位置,新建数据库
  4. 旧数据导入新数据库
  5. 设置新的连接参数,连接metabase(1.2)
  6. 检查/更改目标数据库连接方式(3.2)

dbeaver导入数据库报错
如果导入报错,删除数据库,加上参数重新导入

--default-character-set=utf8 --ssl-mode=DISABLED

3. metabase连接/更换目标数据库

3.1 连接目标数据库

docker上的metabase 连接 目标数据库

host必须用: host.docker.internal

docker new database.png

3.2 检查/更换目标数据库

  1. 使用外部数据库180.x.x.x,不用管

  2. 跨平台使用数据库,数据库服务器的连接方式(host)和端口(port)不同!

    只有数据库结构完全相同才能更换!

    • 【docker】 连【docker上的数据库】用host.docker.internal 端口3336,
      连【本地数据库】用host.docker.internal 端口3306
    • 【本地】 连【本地数据库】用localhost/127.0.0.1 端口3306,
      连【docker上的数据库】用 localhost 端口3336

点击右上角"setiing">"admin setting",新页面上面分区选"database",点击要修改连接方式的数据库,新页面"edit connection details"。再按照上面的情况,更改host和端口就行。只有连接成功,新配置才能保存。

4. windows二次开发

必须用linux系统!!!
其它需要的是:nodejs, yarn, Leiningen(Clojure用的Maven)

Metabase采用前后端分离的方式构建,前端使用react搭建页面,后端使用clojure提供REST API接口

安装参考连接:
blog.csdn.net/zanpengfei/…
juejin.cn/post/693880…
ask.csdn.net/questions/7…
Clojure和Leiningen
blog.csdn.net/weixin_4382…
blog.csdn.net/m_yeah/arti…
zhuanlan.zhihu.com/p/53742197