Metabase 從 H2 遷移到 MySQL 踩坑指南

寫在前面的話html

 

首先若是你看到了這篇文章,可能你就已經指定 Metabase 是啥了,我這裏仍是簡單的作個說明:java

Metabase is the easy, open source way for everyone in your company to ask questions and learn from data。mysql

官網是這樣描述的,這是一款 BI 開源工具,能讓你的數據以漂亮的圖表顯示出來,雖然我以爲並非很好看,可是仍是叫漂亮吧。同類的產品還有 Superset,Redash 等等。git

感興趣的能夠看看官網:github

https://www.metabase.com/sql

也能夠研究下 GITHUB:數據庫

https://github.com/metabase/metabasebash

 

 

數據遷移ide

 

故事是醬嬸兒滴,公司準備搞一個這樣的系統,而後交給就讓我搭建了這幾個出來作橫向比較。固然,我就是把他運行起來,至於配置都丟給了數據組的老哥。而後這個環境就慢慢的配置愈來愈多。最後一拍腦門就選它了。因而不可能從新配置啊,這樣就得把項目遷移到雲上。工具

問題出現了,由於以前我是以 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 '123456';

 

【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,推薦 走一波~

另外,若是你喜歡我這博客園主題,在我博客首頁置頂文章有相關說明~

https://www.cnblogs.com/Dy1an/p/10490430.html

相關文章
相關標籤/搜索