You have an error in your SQL syntax when migrating from H2 v1 to v2

UPDATE 1 :
After changing the docker db path the migration from H2 v1 to H2 v2 starts on version v0.46.6.1 but it fails due to a syntax error :

'com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''distinct `raQuote__via__quote_id`.`id` as `IDasd` `raBorrower__via__borrower_id`'' at line 2'

Metabase is linked to our MariaDB database.


Hi there !

I wanted to update my Metabase docker image to the version V0.46.6.1.

Doing this I noticed this error when starting my docker container :

2023-07-25 15:05:10,674 INFO db.setup :: Verifying h2 Database Connection ...
2023-07-25 15:05:10,752 INFO db.update-h2 :: H2 v1 database detected, updating...
2023-07-25 15:05:10,757 INFO db.update-h2 :: Downloading https://repo1.maven.org/maven2/com/h2database/h2/1.4.197/h2-1.4.197.jar
2023-07-25 15:05:11,560 ERROR db.update-h2 :: Failed to update H2 database: #error {
 :cause /tmp/h2-1.4.197.jar (Permission denied)
 :via
 [{:type java.io.FileNotFoundException
   :message /tmp/h2-1.4.197.jar (Permission denied)
   :at [java.io.FileOutputStream open0 nil -2]}]
 :trace
 [[java.io.FileOutputStream open0 nil -2]
  [java.io.FileOutputStream open nil -1]
  [java.io.FileOutputStream <init> nil -1]
  [java.io.FileOutputStream <init> nil -1]
  [clojure.java.io$fn__11655 invokeStatic io.clj 319]
  [clojure.java.io$fn__11655 invoke io.clj 319]
  [clojure.lang.MultiFn invoke MultiFn.java 239]
  [clojure.java.io$copy invokeStatic io.clj 406]
  [clojure.java.io$copy doInvoke io.clj 391]
  [clojure.lang.RestFn invoke RestFn.java 425]
  [metabase.db.update_h2$update_BANG_ invokeStatic update_h2.clj 73]
  [metabase.db.update_h2$update_BANG_ invoke update_h2.clj 68]
  [metabase.db.update_h2$update_if_needed invokeStatic update_h2.clj 98]
  [metabase.db.update_h2$update_if_needed invoke update_h2.clj 90]
  [metabase.db.data_source.DataSource getConnection data_source.clj 29]
  [com.mchange.v2.c3p0.WrapperConnectionPoolDataSource getPooledConnection WrapperConnectionPoolDataSource.java 161]
  [com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager acquireResource C3P0PooledConnectionPool.java 213]
  [com.mchange.v2.resourcepool.BasicResourcePool doAcquire BasicResourcePool.java 1176]
  [com.mchange.v2.resourcepool.BasicResourcePool doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess BasicResourcePool.java 1163]
  [com.mchange.v2.resourcepool.BasicResourcePool access$700 BasicResourcePool.java 44]
  [com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask run BasicResourcePool.java 1908]
  [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread run ThreadPoolAsynchronousRunner.java 696]]}

as H2 databases are not recommended for production I then assumed I had to migrate, but I had this error when running the update command to Postgres database :

2023-07-25 15:12:53,749 INFO cmd.copy :: Set up h2 source database and run migrations...
2023-07-25 15:12:53,752 INFO db.setup :: Verifying h2 Database Connection ...
2023-07-25 15:12:53,836 ERROR cmd.copy :: [FAIL]

clojure.lang.ExceptionInfo: ERROR Set up h2 source database and run migrations...: Unable to connect to Metabase h2 DB. {}
        at metabase.cmd.copy$do_step$fn__81848.invoke(copy.clj:67)
        at metabase.cmd.copy$do_step.invokeStatic(copy.clj:63)
        at metabase.cmd.copy$do_step.invoke(copy.clj:61)
        at metabase.cmd.copy$fn__82002$copy_BANG___82007$fn__82008.invoke(copy.clj:338)
        at metabase.cmd.copy$fn__82002$copy_BANG___82007.invoke(copy.clj:331)
        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 clojure.lang.AFn.applyToHelper(AFn.java:154)
        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__82799.invoke(cmd.clj:227)
        at metabase.cmd$run_cmd.invokeStatic(cmd.clj:227)
        at metabase.cmd$run_cmd.invoke(cmd.clj:218)
        at clojure.lang.Var.invoke(Var.java:388)
        at metabase.core$run_cmd.invokeStatic(core.clj:160)
        at metabase.core$run_cmd.invoke(core.clj:158)
        at metabase.core$_main.invokeStatic(core.clj:182)
        at metabase.core$_main.doInvoke(core.clj:177)
        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__35456$verify_db_connection__35461$fn__35462$fn__35463.invoke(setup.clj:99)
        at metabase.db.setup$fn__35456$verify_db_connection__35461$fn__35462.invoke(setup.clj:97)
        at metabase.db.setup$fn__35456$verify_db_connection__35461.invoke(setup.clj:89)
        at metabase.db.setup$fn__35538$setup_db_BANG___35543$fn__35544$fn__35547$fn__35548.invoke(setup.clj:144)
        at metabase.util$do_with_us_locale.invokeStatic(util.clj:716)
        at metabase.util$do_with_us_locale.invoke(util.clj:702)
        at metabase.db.setup$fn__35538$setup_db_BANG___35543$fn__35544$fn__35547.invoke(setup.clj:143)
        at metabase.db.setup$fn__35538$setup_db_BANG___35543$fn__35544.invoke(setup.clj:142)
        at metabase.db.setup$fn__35538$setup_db_BANG___35543.invoke(setup.clj:136)
        at metabase.cmd.copy$fn__82002$copy_BANG___82007$fn__82008$fn__82009.invoke(copy.clj:339)
        at metabase.cmd.copy$do_step$fn__81848.invoke(copy.clj:64)
        ... 23 more
Caused by: org.h2.jdbc.JdbcSQLException: Database "/home/ubuntu/metasave/metabase.db" not found [90013-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.Engine.openSession(Engine.java:64)
        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(DriverManager.java:681)
        at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:252)
        at metabase.db.data_source.DataSource.getConnection(data_source.clj:26)
        at clojure.java.jdbc$get_connection.invokeStatic(jdbc.clj:372)
        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:266)
        at metabase.driver.sql_jdbc.connection$can_connect_with_spec_QMARK_.invoke(connection.clj:263)
        at metabase.db.setup$fn__35456$verify_db_connection__35461$fn__35462$fn__35463.invoke(setup.clj:97)
        ... 33 more
Command failed with exception: ERROR Set up h2 source database and run migrations...: Unable to connect to Metabase h2 DB.
java -jar metabase.jar load-from-h2 metabase.db

My folder structure :
Screenshot 2023-07-25 171336

Version V0.44.1 work perfectly fine.

So I'm basicly having two issues :
On V0.46.6.1 I can't update my H2 V1 databse due to permission issue
When running migration command following the documentation, I can't connect to my H2 databse

Thanks in advance for your help !

I think that the user that you’re using does not have permissions to write to tmp, can you check that?

This update happens inside the docker container, what do I need to do then in order to grant my docker user permission ? Isn't that related to the docker image directly ?

Here is my docker config :

 20 docker run -d --restart always --net host \
 21     -v $HOME/metabase:/tmp \
 22     -e "MB_JETTY_HOST=127.0.0.1" \
 23     -e "MB_DB_FILE=/tmp/metabase.db" \
 24     -e "MB_JDBC_DATA_WAREHOUSE_MAX_CONNECTION_POOL_SIZE=10" \
 25     --name metabase \
 26     metabase/metabase:v0.44.1

By changing the locationn from /tmp to /metabase-data i managed to start the upgrade process from H1 v1 to v2 but it end up failing due to syntax error.

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax

Please post full logs