Bare Metal Server - Switching to external MariaDB 10.4 database fails on "Column length too big" (OD-68)
Philippe MARASSE opened 6 years ago

Environment :

  • onedev version : 3.0.8
  • System : Debian 10 - 64 bits
  • Java : AdoptOpenJDK 8 1.8.0_242-b08
  • Database : MariaDB 10.4.12

I've followed the documentation :

  • Backup HSQL database : ok
  • Created local user on mariadb, with local database : ok
  • Restore database : SQL Exception :
INFO  - Launching application from '/home/onedev/onedev'...
INFO  - Cleaning temp directory...
INFO  - Initializing dependency injection container...
INFO  - Starting plugin manager...
INFO  - Restoring database from /home/onedev/backup...
INFO  - Validating data file 'Users.xml'...
INFO  - Validating data file 'Projects.xml'...
INFO  - Validating data file 'Roles.xml'...
INFO  - Validating data file 'ModelVersions.xml'...
INFO  - Validating data file 'Settings.xml'...
INFO  - Creating tables...
ERROR - Error booting application
java.lang.RuntimeException: java.sql.SQLSyntaxErrorException: (conn=33924) Column length too big for column 'o_errorMessage' (max = 16383); use BLOB or TEXT inste
ad
        at io.onedev.server.persistence.DefaultPersistManager.execute(DefaultPersistManager.java:124) ~[io.onedev.server-core-3.0.8.jar:na]
        at io.onedev.server.persistence.DefaultPersistManager.createTables(DefaultPersistManager.java:544) ~[io.onedev.server-core-3.0.8.jar:na]
        at io.onedev.server.maintenance.RestoreDatabase.doRestore(RestoreDatabase.java:103) ~[io.onedev.server-core-3.0.8.jar:na]
        at io.onedev.server.maintenance.RestoreDatabase.start(RestoreDatabase.java:69) ~[io.onedev.server-core-3.0.8.jar:na]
        at io.onedev.server.OneDev.start(OneDev.java:101) ~[io.onedev.server-core-3.0.8.jar:na]
        at io.onedev.commons.launcher.loader.DefaultPluginManager.start(DefaultPluginManager.java:44) ~[io.onedev.commons-launcher-loader-1.1.12.jar:na]
        at io.onedev.commons.launcher.loader.AppLoader.start(AppLoader.java:74) ~[io.onedev.commons-launcher-loader-1.1.12.jar:na]
        at io.onedev.commons.launcher.bootstrap.Bootstrap.main(Bootstrap.java:165) ~[io.onedev.commons-launcher-bootstrap-1.1.12.jar:na]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_242]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_242]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_242]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_242]
        at org.tanukisoftware.wrapper.WrapperSimpleApp.run(WrapperSimpleApp.java:349) [wrapper.jar:3.5.41]
        at java.lang.Thread.run(Thread.java:748) [na:1.8.0_242]
Caused by: java.sql.SQLSyntaxErrorException: (conn=33924) Column length too big for column 'o_errorMessage' (max = 16383); use BLOB or TEXT instead
        at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:243) ~[mariadb-java-client-2.5.4.jar:na]
        at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.getException(ExceptionMapper.java:164) ~[mariadb-java-client-2.5.4.jar:na]
        at org.mariadb.jdbc.MariaDbStatement.executeExceptionEpilogue(MariaDbStatement.java:258) ~[mariadb-java-client-2.5.4.jar:na]
        at org.mariadb.jdbc.MariaDbStatement.executeInternal(MariaDbStatement.java:349) ~[mariadb-java-client-2.5.4.jar:na]
        at org.mariadb.jdbc.MariaDbStatement.execute(MariaDbStatement.java:484) ~[mariadb-java-client-2.5.4.jar:na]
        at io.onedev.server.persistence.DefaultPersistManager.execute(DefaultPersistManager.java:114) ~[io.onedev.server-core-3.0.8.jar:na]
        ... 13 common frames omitted
Caused by: java.sql.SQLException: Column length too big for column 'o_errorMessage' (max = 16383); use BLOB or TEXT instead
        at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readErrorPacket(AbstractQueryProtocol.java:1598) ~[mariadb-java-client-2.5.4.jar:na]
        at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readPacket(AbstractQueryProtocol.java:1460) ~[mariadb-java-client-2.5.4.jar:na]
        at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.getResult(AbstractQueryProtocol.java:1423) ~[mariadb-java-client-2.5.4.jar:na]
        at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:178) ~[mariadb-java-client-2.5.4.jar:na]
        at org.mariadb.jdbc.MariaDbStatement.executeInternal(MariaDbStatement.java:343) ~[mariadb-java-client-2.5.4.jar:na]
        ... 15 common frames omitted

It seems that MariaDB has a limit of 65532 bytes for VARCHAR colums (see this KB article) . By default, databases are created with utf8mb4_general_ci character set. Unfortunately, this limit VARCHARs to 16383 characters (65532 / 4). o_errorMessage is created with 16384 characters, just a character too big !

I've switched database character set to utf8_general_ci and it works (VARCHARs are limited to 65532 / 3 = 21844 characters now).

I can write a specific page for MariaDB external database if needed.

  • OneDev changed state to 'Committed' 6 years ago
    Previous Value Current Value
    Open
    Committed
  • Robin Shen commented 6 years ago

    Thanks for reporting. Changing the length to 16380 now.

  • Robin Shen changed iterations 6 years ago
    Previous Value Current Value
    empty
    3.0.9
  • OneDev changed state to 'Closed' 6 years ago
    Previous Value Current Value
    Committed
    Closed
issue 1/1
Type
Bug
Priority
Minor
Assignee
Affected Versions
Not Found
Iterations
Issue Votes (0)
Watchers (2)
Reference
OD-68
Please wait...
Connection lost or session expired, reload to recover
Page is in error, reload to recover