Using mysql driver from 0.31.2 in new versions

So, I’ve seen the issues reported on mysql 5.6 that would seems to be fixed in 0.34, but since it still not yet available, I was wondering if there’s any way we could just use 0.31.2 mysql driver in newer versions.

Thanks for any help

Hi @vitor.hirota
Which issues are you specifically talking about?
There’s no 0.34 release yet (probably not for a month or so).
You cannot use pre-0.32 drivers on 0.32+, since it’s a different structure.

Ah, I see.

I’m getting this:
java.sql.SQLNonTransientConnectionException: Connection reset

Which I believe is somewhat related to

The difference being that I’m on mysql 5.7.19-log (I’m assuming this is alibaba’s version), which I can’t change, unfortunately.

Any ideas? Should I try to compile myself using the changes from https://github.com/metabase/metabase/pull/11018?

@vitor.hirota That PR is already part of 0.33.4. And the issue you’re referring to is still open. There’s similar discussion going on in Dashboard issue: There was a problem displaying this chart
I’m a little confused - are you using MySQL 5.6 or 5.7.19-log? Metabase does not work with Alibaba RDS MySQL 5.6.16-log

Sorry for the confusion.

I’m on 5.7. Thus the “somewhat” related, because I did not find any reports of SQLNonTransientConnectionException other than folks in 5.6.

I’m glad the PR is already part of 0.33.4, since your last comment on issue 10063 mentioned it was scheduled for 0.34. In my case then, it did not help.

Below is the full stack trace of meta 0.33.5 loading up and failing to connect to the database.

This is the same database we use on v0.31.2

11-13 02:56:45 INFO metabase.core :: Starting Metabase version v0.33.5 (d9d6f72 release-0.33.x) ...
11-13 02:56:45 INFO metabase.core :: System info:
 {"java.runtime.name" "Java(TM) SE Runtime Environment",
 "java.runtime.version" "1.8.0_202-b08",
 "java.vendor" "Oracle Corporation",
 "java.vendor.url" "http://java.oracle.com/",
 "java.version" "1.8.0_202",
 "java.vm.name" "Java HotSpot(TM) 64-Bit Server VM",
 "java.vm.version" "25.202-b08",
 "os.name" "Linux",
 "os.version" "3.10.0-514.16.1.el7.x86_64",
 "user.language" "en",
 "user.timezone" "Asia/Shanghai"}
[...]
11-13 02:56:47 INFO metabase.driver :: Initializing driver :mysql...
11-13 02:56:47 ERROR driver.util :: Database connection error
java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=10.14.128.17)(port=4140)(type=master) : Connection reset
    at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:241)
    at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1241)
    at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:610)
    at org.mariadb.jdbc.MariaDbConnection.newConnection(MariaDbConnection.java:142)
    at org.mariadb.jdbc.Driver.connect(Driver.java:86)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:208)
    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:1093)
    at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1075)
    at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1164)
    at clojure.java.jdbc$query.invoke(jdbc.clj:1126)
    at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1142)
    at clojure.java.jdbc$query.invoke(jdbc.clj:1126)
    at metabase.driver.sql_jdbc.connection$can_connect_QMARK_.invokeStatic(connection.clj:159)
    at metabase.driver.sql_jdbc.connection$can_connect_QMARK_.invoke(connection.clj:154)
    at metabase.driver.sql_jdbc$fn__67312.invokeStatic(sql_jdbc.clj:35)
    at metabase.driver.sql_jdbc$fn__67312.invoke(sql_jdbc.clj:34)
    at clojure.lang.MultiFn.invoke(MultiFn.java:234)
    at metabase.driver.util$can_connect_with_details_QMARK_$fn__19311.invoke(util.clj:31)
    at metabase.util$do_with_timeout$fn__6284.invoke(util.clj:334)
    at clojure.core$binding_conveyor_fn$fn__5754.invoke(core.clj:2030)
    at clojure.lang.AFn.call(AFn.java:18)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.sql.SQLNonTransientConnectionException: Connection reset
    at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.handleIoException(AbstractQueryProtocol.java:1962)
    at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readPacket(AbstractQueryProtocol.java:1445)
    at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.getResult(AbstractQueryProtocol.java:1424)
    at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.readPipelineAdditionalData(AbstractConnectProtocol.java:921)
    at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.postConnectionQueries(AbstractConnectProtocol.java:793)
    at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.createConnection(AbstractConnectProtocol.java:549)
    at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1236)
    ... 28 more
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at org.mariadb.jdbc.internal.io.input.ReadAheadBufferedStream.fillBuffer(ReadAheadBufferedStream.java:129)
    at org.mariadb.jdbc.internal.io.input.ReadAheadBufferedStream.read(ReadAheadBufferedStream.java:102)
    at org.mariadb.jdbc.internal.io.input.StandardPacketInputStream.getPacketArray(StandardPacketInputStream.java:241)
    at org.mariadb.jdbc.internal.io.input.StandardPacketInputStream.getPacket(StandardPacketInputStream.java:212)
    at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readPacket(AbstractQueryProtocol.java:1443)
    ... 33 more
11-13 02:56:47 ERROR metabase.core :: Metabase Initialization FAILED
java.lang.Exception: Could not connect to address=(host=10.14.128.17)(port=4140)(type=master) : Connection reset
    at metabase.driver.util$can_connect_with_details_QMARK_.invokeStatic(util.clj:36)
    at metabase.driver.util$can_connect_with_details_QMARK_.doInvoke(util.clj:19)
    at clojure.lang.RestFn.invoke(RestFn.java:442)
    at clojure.lang.Var.invoke(Var.java:393)
    at metabase.db$fn__18579$verify_db_connection__18588$fn__18591$fn__18592.invoke(db.clj:416)
    at metabase.db$fn__18579$verify_db_connection__18588$fn__18591.invoke(db.clj:414)
    at metabase.db$fn__18579$verify_db_connection__18588.invoke(db.clj:407)
    at metabase.db$fn__18579$verify_db_connection__18588$fn__18589.invoke(db.clj:410)
    at metabase.db$fn__18579$verify_db_connection__18588.invoke(db.clj:407)
    at metabase.db$setup_db_BANG__STAR_$fn__18624.invoke(db.clj:479)
    at metabase.util$do_with_us_locale.invokeStatic(util.clj:677)
    at metabase.util$do_with_us_locale.invoke(util.clj:663)
    at metabase.db$setup_db_BANG__STAR_.invokeStatic(db.clj:478)
    at metabase.db$setup_db_BANG__STAR_.invoke(db.clj:474)
    at metabase.db$setup_db_from_env_BANG__STAR_.invokeStatic(db.clj:488)
    at metabase.db$setup_db_from_env_BANG__STAR_.invoke(db.clj:485)
    at metabase.db$fn__18629$fn__18630.invoke(db.clj:495)
    at clojure.lang.Delay.deref(Delay.java:42)
    at clojure.core$deref.invokeStatic(core.clj:2320)
    at clojure.core$deref.invoke(core.clj:2306)
    at clojure.core$partial$fn__5839.invoke(core.clj:2623)
    at metabase.core$init_BANG_.invokeStatic(core.clj:77)
    at metabase.core$init_BANG_.invoke(core.clj:56)
    at metabase.core$start_normally.invokeStatic(core.clj:123)
    at metabase.core$start_normally.invoke(core.clj:117)
    at metabase.core$_main.invokeStatic(core.clj:143)
    at metabase.core$_main.doInvoke(core.clj:138)
    at clojure.lang.RestFn.invoke(RestFn.java:397)
    at clojure.lang.AFn.applyToHelper(AFn.java:152)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at metabase.core.main(Unknown Source)
Caused by: java.sql.SQLNonTransientConnectionException: Could not connect to address=(host=10.14.128.17)(port=4140)(type=master) : Connection reset
    at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:241)
    at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1241)
    at org.mariadb.jdbc.internal.util.Utils.retrieveProxy(Utils.java:610)
    at org.mariadb.jdbc.MariaDbConnection.newConnection(MariaDbConnection.java:142)
    at org.mariadb.jdbc.Driver.connect(Driver.java:86)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:208)
    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:1093)
    at clojure.java.jdbc$db_query_with_resultset_STAR_.invoke(jdbc.clj:1075)
    at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1164)
    at clojure.java.jdbc$query.invoke(jdbc.clj:1126)
    at clojure.java.jdbc$query.invokeStatic(jdbc.clj:1142)
    at clojure.java.jdbc$query.invoke(jdbc.clj:1126)
    at metabase.driver.sql_jdbc.connection$can_connect_QMARK_.invokeStatic(connection.clj:159)
    at metabase.driver.sql_jdbc.connection$can_connect_QMARK_.invoke(connection.clj:154)
    at metabase.driver.sql_jdbc$fn__67312.invokeStatic(sql_jdbc.clj:35)
    at metabase.driver.sql_jdbc$fn__67312.invoke(sql_jdbc.clj:34)
    at clojure.lang.MultiFn.invoke(MultiFn.java:234)
    at metabase.driver.util$can_connect_with_details_QMARK_$fn__19311.invoke(util.clj:31)
    at metabase.util$do_with_timeout$fn__6284.invoke(util.clj:334)
    at clojure.core$binding_conveyor_fn$fn__5754.invoke(core.clj:2030)
    at clojure.lang.AFn.call(AFn.java:18)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.sql.SQLNonTransientConnectionException: Connection reset
    at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.handleIoException(AbstractQueryProtocol.java:1962)
    at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readPacket(AbstractQueryProtocol.java:1445)
    at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.getResult(AbstractQueryProtocol.java:1424)
    at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.readPipelineAdditionalData(AbstractConnectProtocol.java:921)
    at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.postConnectionQueries(AbstractConnectProtocol.java:793)
    at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.createConnection(AbstractConnectProtocol.java:549)
    at org.mariadb.jdbc.internal.protocol.AbstractConnectProtocol.connectWithoutProxy(AbstractConnectProtocol.java:1236)
    ... 28 more
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at java.io.FilterInputStream.read(FilterInputStream.java:133)
    at org.mariadb.jdbc.internal.io.input.ReadAheadBufferedStream.fillBuffer(ReadAheadBufferedStream.java:129)
    at org.mariadb.jdbc.internal.io.input.ReadAheadBufferedStream.read(ReadAheadBufferedStream.java:102)
    at org.mariadb.jdbc.internal.io.input.StandardPacketInputStream.getPacketArray(StandardPacketInputStream.java:241)
    at org.mariadb.jdbc.internal.io.input.StandardPacketInputStream.getPacket(StandardPacketInputStream.java:212)
    at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readPacket(AbstractQueryProtocol.java:1443)
    ... 33 more
11-13 02:56:47 INFO metabase.core :: Metabase Shutting Down ...

@vitor.hirota
Okay, so you’re using 5.7 as for the Metabase application database (metadata)?
Then I think you’re having a different issue, since you cannot even make the connection on startup, so it has nothing to do with any timeout parameter or sleeping connection.
It would be great if Alibaba renamed their MySQL to AliSQL, since it’s clearly not the same version as MySQL.
It’s going to be difficult to debug this unless there’s access to the AliSQL logs too.
It would be great if someone would investigate with the MariaDB Connector/J and AliSQL, to see if the problem is the JDBC (which hopefully could be reported and fixed upstream) or a specific configuration parameter in Metabase’s use of c3p0.

I’m using 5.7 for both app metadata and as data source.
I’m trying to get a local version of the db running so I could better replicate all these errors and get proper logs.

As far as I could understand, we have that

  1. 0.31.2 driver properly works with alibaba’s mysql
  2. 0.32 changed mysql connector to MariaDB’s connector
  3. 0.32 also updated how drivers are structured
  4. due to item 3, one can not use pre-0.32 drivers in post-0.32; and
  5. problems with alibaba’s mysql are probably related to item 2, not due to item 3

Thus, two questions come to mind:

  1. is it possible to just swap mariadb’s connector back to the old connector? By old connector, I’m guessing it’s the one from oracle; or
  2. is it possible to reimplement old driver in the new structure by following the documentation on how to write drivers?

@vitor.hirota
Please note that I upgraded the Connector in 0.33.5 from 2.3.0 to 2.5.1, so please try that version.

But that’s still two different things - metadata and datasource. And the error you’re posting is not with the datasource, it’s with the metadata on startup.
You could possible just use Alibaba RDS Postgres for the metadata?

Yes to the first 5 points.

The MySQL/MariaDB driver is fairly generic - it was still re-written completely to be modular (0.32+ style), so I don’t know if that had something to do with it, but I guess the problem is the MariaDB Connector.
You can try building your own version of Metabase, where you change the Connector to Oracle (aka MySQL).
Change [org.mariadb.jdbc/mariadb-java-client "2.5.1"] to [mysql/mysql-connector-java "5.1.45"] (5.1.45 was the version used in pre-0.32, but see the list of versions available)
https://github.com/metabase/metabase/blob/master/project.clj#L120

Everyone is moving away from using anything Oracle, because of their horrible licenses.

2 Likes

The stacktrace I’ve post earlier was from 0.33.5, so unfortunately the 2.5.1 connector did not do the trick yet.

I’m aware metadata and datasource are different, I was just noting that we use the same version for both.

I would love to have a postgres db available, but unfortunately, it’s just (a very old and quirky) mysql. :roll_eyes:

Thank you very much for the instructions. I’ll try these and post back here.

Cheers!

@flamber just to let you know that I was successful in building meta with the oracle mysql driver, and it successfully connected to the database I have available.

Thanks for the support!