Error during migration from H2 to PostgreSQL

Hello,

I'm trying to migrate Metabase config from H2 to PostgreSQL DB but I can't figure out what is the problem.
The H2 db is setup outside the container > /home/alex/metabase/metabase.db
The Postgre is in another docker on the same server.
I stopped metabase container.

Here is what i'm using:

docker run --name metabase-migration \
    -v /home/alex/metabase:/metabase-data \
    -e "MB_DB_FILE=/metabase-data/metabase.db" \
    -e "MB_DB_TYPE=postgres" \
    -e "MB_DB_DBNAME=metabase" \
    -e "MB_DB_PORT=5432" \
    -e "MB_DB_USER=<metabase_login>" \
    -e "MB_DB_PASS=<metabase_password>" \
    -e "MB_DB_HOST=localhost" \
    metabase/metabase load-from-h2

and here is the result I have :

Warning: environ value jdk-11.0.12+7 for key :java-version has been overwritten with 11.0.12
WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
2021-12-09 13:55:16,942 INFO metabase.util :: Maximum memory available to JVM: 3.1 GB
2021-12-09 13:55:25,720 INFO util.encryption :: Saved credentials encryption is DISABLED for this Metabase instance. 🔓
 For more information, see https://metabase.com/docs/latest/operations-guide/encrypting-database-details-at-rest.html
2021-12-09 13:55:27,901 INFO driver.impl :: Registered abstract driver :sql  🚚
 ↙ Load driver :sql took 490.8 ms
2021-12-09 13:55:27,909 INFO driver.impl :: Registered abstract driver :sql-jdbc (parents: [:sql]) 🚚
Load driver :sql-jdbc took 501.5 ms
2021-12-09 13:55:27,912 INFO driver.impl :: Registered driver :h2 (parents: [:sql-jdbc]) 🚚
2021-12-09 13:55:27,927 INFO driver.impl :: Registered driver :mysql (parents: [:sql-jdbc]) 🚚
2021-12-09 13:55:28,509 INFO driver.impl :: Registered driver :postgres (parents: [:sql-jdbc]) 🚚
2021-12-09 13:55:30,401 INFO metabase.core ::
Metabase v0.41.1 (76aa4a5 release-x.41.x)

Copyright © 2021 Metabase, Inc.

Metabase Enterprise Edition extensions are NOT PRESENT.
2021-12-09 13:55:30,410 WARN metabase.core :: WARNING: You have enabled namespace tracing, which could log sensitive information like db passwords.
2021-12-09 13:55:30,452 INFO cmd.copy :: Set up h2 source database and run migrations...
2021-12-09 13:55:30,455 INFO db.setup :: Verifying h2 Database Connection ...
2021-12-09 13:55:30,494 ERROR cmd.copy :: [FAIL]

clojure.lang.ExceptionInfo: ERROR Set up h2 source database and run migrations... {}
	at metabase.cmd.copy$do_step$fn__81962.invoke(copy.clj:33)
	at metabase.cmd.copy$do_step.invokeStatic(copy.clj:29)
	at metabase.cmd.copy$do_step.invoke(copy.clj:27)
	at metabase.cmd.copy$fn__82123$copy_BANG___82128$fn__82129.invoke(copy.clj:264)
	at metabase.cmd.copy$fn__82123$copy_BANG___82128.invoke(copy.clj:257)
	at metabase.cmd.load_from_h2$load_from_h2_BANG_.invokeStatic(load_from_h2.clj:35)
	at metabase.cmd.load_from_h2$load_from_h2_BANG_.invoke(load_from_h2.clj:25)
	at clojure.lang.Var.invoke(Var.java:384)
	at metabase.cmd$load_from_h2.invokeStatic(cmd.clj:45)
	at metabase.cmd$load_from_h2.invoke(cmd.clj:39)
	at metabase.cmd$load_from_h2.invokeStatic(cmd.clj:42)
	at metabase.cmd$load_from_h2.invoke(cmd.clj:39)
	at clojure.lang.AFn.applyToHelper(AFn.java:152)
	at clojure.lang.AFn.applyTo(AFn.java:144)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$apply.invoke(core.clj:662)
	at metabase.cmd$run_cmd$fn__82906.invoke(cmd.clj:190)
	at metabase.cmd$run_cmd.invokeStatic(cmd.clj:190)
	at metabase.cmd$run_cmd.invoke(cmd.clj:186)
	at clojure.lang.Var.invoke(Var.java:388)
	at metabase.core$run_cmd.invokeStatic(core.clj:145)
	at metabase.core$run_cmd.invoke(core.clj:143)
	at metabase.core$_main.invokeStatic(core.clj:167)
	at metabase.core$_main.doInvoke(core.clj:162)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at metabase.core.main(Unknown Source)
Caused by: clojure.lang.ExceptionInfo: Unable to connect to Metabase h2 DB. {}
	at metabase.db.setup$fn__33707$verify_db_connection__33712$fn__33713$fn__33714.invoke(setup.clj:102)
	at metabase.db.setup$fn__33707$verify_db_connection__33712$fn__33713.invoke(setup.clj:100)
	at metabase.db.setup$fn__33707$verify_db_connection__33712.invoke(setup.clj:94)
	at metabase.db.setup$setup_db_BANG_$fn__33742$fn__33743.invoke(setup.clj:142)
	at metabase.util$do_with_us_locale.invokeStatic(util.clj:694)
	at metabase.util$do_with_us_locale.invoke(util.clj:680)
	at metabase.db.setup$setup_db_BANG_$fn__33742.invoke(setup.clj:141)
	at metabase.db.setup$setup_db_BANG_.invokeStatic(setup.clj:140)
	at metabase.db.setup$setup_db_BANG_.invoke(setup.clj:136)
	at metabase.cmd.copy$fn__82123$copy_BANG___82128$fn__82129$fn__82130.invoke(copy.clj:265)
	at metabase.cmd.copy$do_step$fn__81962.invoke(copy.clj:30)
	... 25 more
Caused by: org.h2.jdbc.JdbcSQLException: Invalid database name: "/" [90138-197]
	at org.h2.message.DbException.getJdbcSQLException(DbException.java:357)
	at org.h2.message.DbException.get(DbException.java:179)
	at org.h2.message.DbException.get(DbException.java:155)
	at org.h2.engine.ConnectionInfo.getName(ConnectionInfo.java:404)
	at org.h2.engine.Engine.openSession(Engine.java:50)
	at org.h2.engine.Engine.openSession(Engine.java:179)
	at org.h2.engine.Engine.createSessionAndValidate(Engine.java:157)
	at org.h2.engine.Engine.createSession(Engine.java:140)
	at org.h2.engine.Engine.createSession(Engine.java:28)
	at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:351)
	at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:124)
	at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:103)
	at org.h2.Driver.connect(Driver.java:69)
	at java.sql/java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql/java.sql.DriverManager.getConnection(Unknown Source)
	at clojure.java.jdbc$get_driver_connection.invokeStatic(jdbc.clj:271)
	at clojure.java.jdbc$get_driver_connection.invoke(jdbc.clj:250)
	at clojure.java.jdbc$get_connection.invokeStatic(jdbc.clj:411)
	at clojure.java.jdbc$get_connection.invoke(jdbc.clj:274)
	at clojure.java.jdbc$db_query_with_resultset_STAR_.invokeStatic(jdbc.clj:1111)
	at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1093)
	at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1182)
	at clojure.java.jdbc$query.invoke(jdbc.clj:1144)
	at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1160)
	at clojure.java.jdbc$query.invoke(jdbc.clj:1144)
	at metabase.driver.sql_jdbc.connection$can_connect_with_spec_QMARK_.invokeStatic(connection.clj:240)
	at metabase.driver.sql_jdbc.connection$can_connect_with_spec_QMARK_.invoke(connection.clj:237)
	at metabase.db.setup$fn__33707$verify_db_connection__33712$fn__33713$fn__33714.invoke(setup.clj:100)
	... 35 more
Command failed with exception: ERROR Set up h2 source database and run migrations... 

Could you please give me a hand on this?

Thanks.

Hi @Noosymer
The easiest thing you can do is just run the migration via JAR, since it's a one-off process.
Also, /home/alex/metabase/metabase.db is not the full file reference. It's like /home/alex/metabase/metabase.db.mv.db, but I cannot tell.
It's only the environment variable reference in Metabase that should not include the extension .mv.db
https://www.metabase.com/docs/latest/operations-guide/migrating-from-h2.html

Hi @flamber

For now, I don't have java on this server and I don't have rights to install it.
The db is located as follows: /home/alex/metabase/metabase.db/metabase.db.mv.db

I followed this link for the migration.

@Noosymer Okay, then the environment variable reference should be /home/alex/metabase/metabase.db/metabase.db - to the actual file, without .mv.db

@flamber

Not sure to understand. Could please send me the command I have to type on the server ?

Everything I tried gave me the same result. I might be missing something...

Thanks

@Noosymer Replace this:

    -e "MB_DB_FILE=/metabase-data/metabase.db" \

With this:

    -e "MB_DB_FILE=/metabase-data/metabase.db/metabase.db" \

@flamber

Ok I have the same result :

I used:

docker run --name metabase-migration \
    -v /home/alex/metabase:/metabase-data \
    -e "MB_DB_FILE=/metabase-data/metabase.db/metabase.db" \
    -e "MB_DB_TYPE=postgres" \
    -e "MB_DB_DBNAME=metabase" \
    -e "MB_DB_PORT=5432" \
    -e "MB_DB_USER=<metabase_login>" \
    -e "MB_DB_PASS=<metabase_password>" \
    -e "MB_DB_HOST=localhost" \
    metabase/metabase load-from-h2

Did I miss something ?

@Noosymer If this doesn't work, then download Java somewhere and use the JAR:
metabase/metabase "load-from-h2 /metabase-data/metabase.db/metabase.db"

@flamber

Ok I'll figure out a way to do it like that

Thanks