Metabase 从 H2 迁移到 MySQL 踩坑指南
写在前面的话
首先如果你看到了这篇文章,可能你就已经指定 Metabase 是啥了,我这里还是简单的做个说明:
Metabase is the easy, open source way for everyone in your company to ask questions and learn from data。
官网是这样描述的,这是一款 BI 开源工具,能让你的数据以漂亮的图表显示出来,虽然我觉得并不是很好看,但是还是叫漂亮吧。同类的产品还有 Superset,Redash 等等。
感兴趣的可以看看官网:
也可以研究下 GITHUB:
数据迁移
故事是酱婶儿滴,公司准备搞一个这样的系统,然后交给就让我搭建了这几个出来做横向比较。当然,我就是把他运行起来,至于配置都丢给了数据组的老哥。然后这个环境就慢慢的配置越来越多。最后一拍脑门就选它了。于是不可能重新配置啊,这样就得把项目迁移到云上。
问题出现了,因为之前我是以 demo 形式搭建丢给他们的,所有数据库这些啥都是默认是,Metabase 的默认是 H2 数据库。在搞这个之前我根本不知道这是啥。然后网上找了很多导出数据的方式都特么扯皮。各种报错或者根本不能用。
问题出在哪里呢?就处在将数据导出到 MySQL 的时候,报错:Data too long xxxx
既然说到这里,那就先回顾一下我的迁移过程:
【1】首先我们先停止在运行 metabase 服务,我是直接 jar 形式运行的,kill 掉就行。
【2】此时我们可以看到默认运行的时候,在 jar 的目录下存在两个数据库的文件:
上面两个 db 文件就是用到 H2 数据库了,我们把这 3 个文件移动到其他目录备份,相当重要,不然挂了你就哭吧!!!
【3】此时我们新建一个 metabase 的库(我的是 MySQL 5.7):
CREATE DATABASE metabase default charset utf8 COLLATE utf8_general_ci;
grant all on metabase.* to 'metabase'@'%' identified by '';
【4】配置好连接数据库的环境变量,由于我们是 jar 启动的,这个服务会默认去先读取环境变量(在 /etc/profile 里面追加):
export MB_DB_TYPE=mysql
export MB_DB_DBNAME=metabase
export MB_DB_PORT=3306
export MB_DB_USER=metabase
export MB_DB_PASS=123456
export MB_DB_HOST=192.168.10.204
export MB_JETTY_PORT=8000
export MB_JETTY_HOST=0.0.0.0
我这里指定了数据库连接,已经服务启动以后监听的 IP 和端口,当然,数据库那一部分可以简写:
export MB_DB_CONNECTION_URI="mysql://192.168.10.204:3306/metabase?user=metabase&password=123456&useSSL=false"
写成 jdbc 的样式,这样我们可以指定 SSL 为 false,否则日志有点恶心。
记得让新增的环境变量生效:
source /etc/profile
【5】生效之后,我们就按照网上的方法开始同步,这也是问题开始的地方:
/opt/jdk1.8.0_45/bin/java -jar metabase.jar load-from-h2 ./metabase.db
我们 jdk 是没有配置环境变量的,所有用的是绝对路径,你们可以根据自己修改。一切就这样往美滋滋的方向发展,MySQL 里面也已经开始创建新的表了。
正当一切过的美滋滋,准备搞完就休息的时候,不幸的事情发生了:
为了方便需要的兄弟更容易检索这篇文章,我这里把错误贴出来:
Transfering 2224 instances of FieldValues...........[OK]
Transfering 721 instances of Revision......BatchUpdateException:
Message: Data truncation: Data too long for column 'object' at row 1
SQLState: 22001
Error Code: 1406
java.sql.BatchUpdateException: Data truncation: Data too long for column 'object' at row 1
提示数据过长,字段长度不够,导致数据传输报异常,传输终止。于是我在这个问题上面卡了至少两个小时,各种搜索文档,找 issue,都没有解决。可能是我英语太烂。
最后还是回归到报错本身,既然长度不够,那我加长度呗,但是我下次同步会不会又把我的表干掉重新建立呢?最终抱着试一试的态度,我去修改表的字段。
问题又来了,那这报错的表是哪一个呢?我们只知道字段啊。给大家推荐一个方法,遇到这种问题,我们完全可以把表结构导出来,然后去搜索指定的列。
最终,在 revision 表中找到了这个字段,此时再看报错:Transfering 721 instances of Revision......BatchUpdateException:,这让我们更加确定就是这个字段。
一看他的类型 text,于是我们将它改成 longtext。
再次执行之前的命令同步,后面还会有几个字段出现类似的报错,类似 report_card 这些表,只需要再度修改为 longtext 类型即可。这里就不再赘述。
【6】同步完成以后只需要启动服务即可使用以 MySQL 作为数据库的 Metabase 了。
这里附带一个我的 jar 服务启动脚本,可以方便我们管理这种单个服务:
#!/bin/bash #################################################################
# 作者:Dylan <1214966109@qq.com>
# 时间:2018-03-29
# 用途:Metabase 启动管理
#################################################################
if [ -f /etc/init.d/functions ]; then
. /etc/init.d/functions
fi #################################################################
# 定义变量
#################################################################
SERVICE_NAME='metabase'
SERVICE_PACKAGE="${SERVICE_NAME}.jar"
SERVICE_PATH='/opt/METABASE'
LOG_PATH="${SERVICE_PATH}/logs"
JAVA_CMD='/opt/jdk1.8.0_45/bin/java' #################################################################
# 判断日志目录
#################################################################
if [[ ! -d ${LOG_PATH} ]]; then
mkdir -p ${LOG_PATH}
fi #################################################################
# 定义命令
#################################################################
function START_COMMAND()
{
${JAVA_CMD} -Duser.timezone=Asia/Shanghai -Xms4g -Xmx4g -jar ${SERVICE_PATH}/${SERVICE_PACKAGE} >> ${LOG_PATH}/${SERVICE_NAME}.log &
if [[ $? -eq 0 ]]; then
action "${SERVICE_NAME} start successed" /bin/true
else
action "${SERVICE_NAME} start failed" /bin/false
fi
} function STOP_COMMAND()
{
SERVICE_PID=`ps -ef | grep "${SERVICE_PACKAGE}" | grep -v 'grep' | awk '{print $2}'`
if [[ ${SERVICE_PID} == '' ]]; then
action "${SERVICE_NAME} is not running" /bin/false
else
kill -9 ${SERVICE_PID} >/dev/null 2>&1
if [[ $? -eq 0 ]]; then
action "${SERVICE_NAME} stop successed" /bin/true
else
action "${SERVICE_NAME} stop failed" /bin/false
fi
fi
} function STATUS_COMMAND()
{
SERVICE_PID=`ps -ef | grep "${SERVICE_PACKAGE}" | grep -v 'grep' | awk '{print $2}'`
if [[ ${SERVICE_PID} == '' ]]; then
action "${SERVICE_NAME} is not running" /bin/false
else
action "${SERVICE_NAME} is running" /bin/true
fi
} #################################################################
# 定义命令
#################################################################
case "$1" in
start)
START_COMMAND
;;
stop)
STOP_COMMAND
;;
restart|reload)
STOP_COMMAND
START_COMMAND
;;
status)
STATUS_COMMAND
;;
*)
echo "Usage: $0 {start|stop|restart|status|reload}"
;;
esac
小结
H2 迁移到 MySQL 出现问题可能大多都是字段的类型导致迁移失败,另外我们在迁移的时候也可能会出现:
java.lang.IllegalArgumentException: No matching clause: :h2
这样的报错,这说明是环境变量的问题。
如果还有其它迁移问题,也可以留言或者加我 QQ 大家讨论一下,如果你觉得这个还 OK,推荐 走一波~
另外,如果你喜欢我这博客园主题,在我博客首页置顶文章有相关说明~
Metabase 从 H2 迁移到 MySQL 踩坑指南的更多相关文章
- CentOS7.4安装MySQL踩坑记录
CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...
- Saiku数据库迁移H2迁移到Mysql(二十二)
Saiku数据库迁移H2迁移到Mysql Saiku默认使用H2数据库来存储saiku的用户与角色信息,我们可以根据角色来做saiku的权限控制,然后将角色分配给用户 ,该用户就会有对应的约束了! 由 ...
- MySql 踩坑小记
MySql 踩坑一时爽,一直踩啊一直爽... 以下记录刚踩的三个坑,emmm... 首先是远程机子上创建表错误(踩第一个坑),于是将本地机器 MySql 版本回退至和远程一致(踩第二个坑),最后在 ...
- C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式
C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...
- Spring WebSocket踩坑指南
Spring WebSocket踩坑指南 本次公司项目中需要在后台与安卓App间建立一个长连接,这里采用了Spring的WebSocket,协议为Stomp. 关于Stomp协议这里就不多介绍了,网上 ...
- 树莓派4B踩坑指南 - (15)搭建在线python IDE
今天想在树莓派上自己搭一个在线的python IDE,于是找到了一篇教程--Fred913大神的从头开始制作OJ-在线IDE的搭建 自己尝试动手做了一下, 还是发现不少细节需要注意, 记录在此 如果不 ...
- 正则表达式 test 踩坑指南
正则表达式 test 踩坑指南 test 只能使用一次,第二次返回的是错误结果! reg = /edg|edge/g; /edg|edge/g reg.test(`edg`) true reg.tes ...
- Taro 开发踩坑指南 (小程序,H5, RN)
Taro 开发踩坑指南 (小程序,H5, RN) css taro 如何展示多行文本省略号 https://www.cnblogs.com/xgqfrms/p/12569057.html UI 设计稿 ...
- 小程序 & taro 踩坑指南
小程序 & taro 踩坑指南 微信开发者工具, 不支持 react bug https://github.com/NervJS/taro/issues/5042 solution just ...
随机推荐
- .net Core 2.0使用NLog
最近研究了一下NLog的使用方式,简单的入了一下门. 实现的功能,对于不同的日志,进行不同的记录,分别有系统运行日志,和个人在程序中写的异常日志.发布之后放在了IIS上.进行查看日志的信息 参考了两篇 ...
- C# 调用动态代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 前端开发之JavaScript基础篇一
主要内容: 1.JavaScript介绍 2.JavaScript的引入方法和输出及注释 3.javaScript变量和命名规则 4.五种基本数据类型 5.运算符 6.字符串处理 7.数据类型转换 ...
- 从零开始搭建k8s-20180301
yum install -y yum-utils git etcd yum-config-manager --add-repo https://download.docker.com/linux/ce ...
- Struts2源代码查看
-----------------siwuxie095 Struts2 源代码查看 1.Struts2 的核心过滤器 StrutsPrepareAndExecuteFilter 实现了 Filter ...
- @property 修饰符
原子性--- nonatomic 特质 在默认情况下,由编译器合成的方法会通过锁定机制确保其原子性(atomicity).如果属性具备 nonatomic 特质,则不使用同步锁.请注意,尽管没有名为“ ...
- JNDI数据源
孤傲苍狼 只为成功找方法,不为失败找借口! JNDI学习总结(一)——JNDI数据源的配置 一.数据源的由来 在Java开发中,使用JDBC操作数据库的四个步骤如下: ①加载数据库驱动程序(Cla ...
- Openssl verify命令
一.简介 verify命令对证书的有效性进行验证,verify 指令会沿着证书链一直向上验证,直到一个自签名的CA 二.语法 openssl verify [-CApath directory] [- ...
- springboot+beetlsql+mysql整合
一.工程目录结构 二.pom.xml文件配置 <dependency> <groupId>mysql</groupId> <artifactId>mys ...
- Python之FTP传输-乾颐堂
访问FTP,无非两件事情:upload和download,最近在项目中需要从ftp下载大量文件,然后我就试着去实验自己的ftp操作类,如下(PS:此段有问题,别复制使用,可以参考去试验自己的ftp类! ...