Moving H2 to mysql - migration error QRTZ_JOB_DETAILS

Hi there,

I am always getting same error when moving H2 to mysql (at migration step_id=89)

Metabase: v0.45.4.3
mysql@azure: 8.0 (connection ok, tables already created)

every help appreciated, cause I am stuck here due to lack of java knowledge :slight_smile:
maybe there is a way to fix this issue or skip step_id=89

thanks a lot

Command failed with exception: ERROR Set up mysql target database and run migrations...: liquibase.exception.MigrationFailedException: Migration failed for change set migrations/000_migrations.yaml::89::camsaul:
     Reason: liquibase.exception.DatabaseException: (conn=345) Multiple primary key defined [Failed SQL: (1068) ALTER TABLE `metabase`**.`QRTZ_JOB_DETAILS` ADD PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`)]**

full log:

Warning: protocol #'java-time.core/Amount is overwriting function abs
WARNING: abs already refers to: #'clojure.core/abs in namespace: java-time.core, being replaced by: #'java-time.core/abs
WARNING: abs already refers to: #'clojure.core/abs in namespace: java-time, being replaced by: #'java-time/abs
2023-10-06 11:48:41,851 INFO metabase.util :: Maximum memory available to JVM: 2,0 GB
2023-10-06 11:48:42,453 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
WARNING: abs already refers to: #'clojure.core/abs in namespace: taoensso.encore, being replaced by: #'taoensso.encore/abs
WARNING: abs already refers to: #'clojure.core/abs in namespace: kixi.stats.math, being replaced by: #'kixi.stats.math/abs
WARNING: abs already refers to: #'clojure.core/abs in namespace: kixi.stats.test, being replaced by: #'kixi.stats.math/abs
WARNING: abs already refers to: #'clojure.core/abs in namespace: kixi.stats.distribution, being replaced by: #'kixi.stats.math/abs
2023-10-06 11:48:46,375 INFO driver.impl :: Registered abstract driver :sql  🚚
2023-10-06 11:48:46,377 INFO metabase.util ::  ⮦ Load driver :sql took 27,7 ms
2023-10-06 11:48:46,379 INFO driver.impl :: Registered abstract driver :sql-jdbc (parents: [:sql]) 🚚
2023-10-06 11:48:46,380 INFO metabase.util :: Load driver :sql-jdbc took 31,9 ms
2023-10-06 11:48:46,380 INFO driver.impl :: Registered driver :h2 (parents: [:sql-jdbc]) 🚚
2023-10-06 11:48:46,391 INFO driver.impl :: Registered driver :mysql (parents: [:sql-jdbc]) 🚚
2023-10-06 11:48:46,401 INFO driver.impl :: Registered driver :postgres (parents: [:sql-jdbc]) 🚚
2023-10-06 11:48:47,047 INFO metabase.core :: 
Metabase v0.45.4.3 (c18362a release-x.45.x) 

Copyright © 2023 Metabase, Inc. 

Metabase Enterprise Edition extensions are NOT PRESENT.
2023-10-06 11:48:47,066 INFO cmd.copy :: Set up h2 source database and run migrations... 
2023-10-06 11:48:47,067 INFO db.setup :: Verifying h2 Database Connection ...
2023-10-06 11:48:48,011 INFO db.setup :: Successfully verified H2 1.4.197 (2018-03-18) application database connection. ✅
2023-10-06 11:48:48,012 INFO db.setup :: Running Database Migrations...
2023-10-06 11:48:48,012 INFO db.setup :: Setting up Liquibase...
2023-10-06 11:48:48,210 INFO db.setup :: Liquibase is ready.
2023-10-06 11:48:48,210 INFO db.liquibase :: Checking if Database has unrun migrations...
2023-10-06 11:48:48,847 INFO db.setup :: Database Migrations Current ...  ✅
2023-10-06 11:48:48,848 INFO db.data-migrations :: Running all necessary data migrations, this may take a minute.
2023-10-06 11:48:48,852 INFO db.data-migrations :: Finished running data migrations.
2023-10-06 11:48:48,852 INFO metabase.util :: Database setup took 1,8 s
2023-10-06 11:48:48,852 INFO cmd.copy :: [OK]
2023-10-06 11:48:48,853 INFO cmd.copy :: Set up mysql target database and run migrations... 
2023-10-06 11:48:48,853 INFO db.setup :: Verifying mysql Database Connection ...
2023-10-06 11:48:49,593 INFO db.setup :: Successfully verified MySQL 8.0.32 application database connection. ✅
2023-10-06 11:48:49,593 INFO db.setup :: Running Database Migrations...
2023-10-06 11:48:49,698 INFO db.setup :: Setting up Liquibase...
2023-10-06 11:48:49,816 INFO db.setup :: Liquibase is ready.
2023-10-06 11:48:49,816 INFO db.liquibase :: Checking if Database has unrun migrations...
2023-10-06 11:48:54,216 INFO db.liquibase :: Database has unrun migrations. Waiting for migration lock to be cleared...
2023-10-06 11:48:59,551 INFO db.liquibase :: Migration lock is cleared. Running migrations...
2023-10-06 11:50:29,455 ERROR cmd.copy :: [FAIL]

clojure.lang.ExceptionInfo: ERROR Set up mysql target database and run migrations...: liquibase.exception.MigrationFailedException: Migration failed for change set migrations/000_migrations.yaml::89::camsaul:
     Reason: liquibase.exception.DatabaseException: (conn=345) Multiple primary key defined [Failed SQL: (1068) ALTER TABLE `metabase`.`QRTZ_JOB_DETAILS` ADD PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`)] {}
	at metabase.cmd.copy$do_step$fn__85812.invoke(copy.clj:68)
	at metabase.cmd.copy$do_step.invokeStatic(copy.clj:64)
	at metabase.cmd.copy$do_step.invoke(copy.clj:62)
	at metabase.cmd.copy$fn__85964$copy_BANG___85969$fn__85970.invoke(copy.clj:341)
	at metabase.cmd.copy$fn__85964$copy_BANG___85969.invoke(copy.clj:329)
	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__86561.invoke(cmd.clj:236)
	at metabase.cmd$run_cmd.invokeStatic(cmd.clj:236)
	at metabase.cmd$run_cmd.invoke(cmd.clj:227)
	at clojure.lang.Var.invoke(Var.java:388)
	at metabase.core$run_cmd.invokeStatic(core.clj:166)
	at metabase.core$run_cmd.invoke(core.clj:164)
	at metabase.core$_main.invokeStatic(core.clj:188)
	at metabase.core$_main.doInvoke(core.clj:183)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at clojure.lang.Var.applyTo(Var.java:705)
	at clojure.core$apply.invokeStatic(core.clj:667)
	at clojure.core$apply.invoke(core.clj:662)
	at metabase.bootstrap$_main.invokeStatic(bootstrap.clj:25)
	at metabase.bootstrap$_main.doInvoke(bootstrap.clj:22)
	at clojure.lang.RestFn.applyTo(RestFn.java:137)
	at metabase.bootstrap.main(Unknown Source)
Caused by: liquibase.exception.LiquibaseException: liquibase.exception.MigrationFailedException: Migration failed for change set migrations/000_migrations.yaml::89::camsaul:
     Reason: liquibase.exception.DatabaseException: (conn=345) Multiple primary key defined [Failed SQL: (1068) ALTER TABLE `metabase`.`QRTZ_JOB_DETAILS` ADD PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`)]
	at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:126)
	at liquibase.Liquibase.lambda$null$0(Liquibase.java:265)
	at liquibase.Scope.lambda$child$0(Scope.java:180)
	at liquibase.Scope.child(Scope.java:189)
	at liquibase.Scope.child(Scope.java:179)
	at liquibase.Scope.child(Scope.java:158)
	at liquibase.Scope.child(Scope.java:243)
	at liquibase.Liquibase.lambda$update$1(Liquibase.java:264)
	at liquibase.Scope.lambda$child$0(Scope.java:180)
	at liquibase.Scope.child(Scope.java:189)
	at liquibase.Scope.child(Scope.java:179)
	at liquibase.Scope.child(Scope.java:158)
	at liquibase.Liquibase.runInScope(Liquibase.java:2405)
	at liquibase.Liquibase.update(Liquibase.java:211)
	at liquibase.Liquibase.update(Liquibase.java:197)
	at liquibase.Liquibase.update(Liquibase.java:193)
	at metabase.db.liquibase$migrate_up_if_needed_BANG_.invokeStatic(liquibase.clj:143)
	at metabase.db.liquibase$migrate_up_if_needed_BANG_.invoke(liquibase.clj:131)
	at metabase.db.setup$fn__36393$migrate_BANG___36398$fn__36399$fn__36400.invoke(setup.clj:67)
	at metabase.db.liquibase$fn__33085$do_with_liquibase__33090$fn__33091.invoke(liquibase.clj:60)
	at metabase.db.liquibase$fn__33085$do_with_liquibase__33090.invoke(liquibase.clj:52)
	at metabase.db.setup$fn__36393$migrate_BANG___36398$fn__36399.invoke(setup.clj:62)
	at metabase.db.setup$fn__36393$migrate_BANG___36398.doInvoke(setup.clj:40)
	at clojure.lang.RestFn.invoke(RestFn.java:445)
	at metabase.db.setup$fn__36452$run_schema_migrations_BANG___36457$fn__36458.invoke(setup.clj:120)
	at metabase.db.setup$fn__36452$run_schema_migrations_BANG___36457.invoke(setup.clj:114)
	at metabase.db.setup$fn__36504$setup_db_BANG___36509$fn__36510$fn__36513$fn__36514.invoke(setup.clj:146)
	at metabase.util$do_with_us_locale.invokeStatic(util.clj:707)
	at metabase.util$do_with_us_locale.invoke(util.clj:693)
	at metabase.db.setup$fn__36504$setup_db_BANG___36509$fn__36510$fn__36513.invoke(setup.clj:144)
	at metabase.db.setup$fn__36504$setup_db_BANG___36509$fn__36510.invoke(setup.clj:143)
	at metabase.db.setup$fn__36504$setup_db_BANG___36509.invoke(setup.clj:137)
	at metabase.cmd.copy$fn__85964$copy_BANG___85969$fn__85970$fn__85973.invoke(copy.clj:343)
	at metabase.cmd.copy$do_step$fn__85812.invoke(copy.clj:65)
	... 29 more
Caused by: liquibase.exception.MigrationFailedException: Migration failed for change set migrations/000_migrations.yaml::89::camsaul:
     Reason: liquibase.exception.DatabaseException: (conn=345) Multiple primary key defined [Failed SQL: (1068) ALTER TABLE `metabase`.`QRTZ_JOB_DETAILS` ADD PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`)]
	at liquibase.changelog.ChangeSet.execute(ChangeSet.java:696)
	at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:56)
	at liquibase.changelog.ChangeLogIterator$2.lambda$null$0(ChangeLogIterator.java:113)
	at liquibase.Scope.lambda$child$0(Scope.java:180)
	at liquibase.Scope.child(Scope.java:189)
	at liquibase.Scope.child(Scope.java:179)
	at liquibase.Scope.child(Scope.java:158)
	at liquibase.changelog.ChangeLogIterator$2.lambda$run$1(ChangeLogIterator.java:112)
	at liquibase.Scope.lambda$child$0(Scope.java:180)
	at liquibase.Scope.child(Scope.java:189)
	at liquibase.Scope.child(Scope.java:179)
	at liquibase.Scope.child(Scope.java:158)
	at liquibase.Scope.child(Scope.java:243)
	at liquibase.changelog.ChangeLogIterator$2.run(ChangeLogIterator.java:93)
	at liquibase.Scope.lambda$child$0(Scope.java:180)
	at liquibase.Scope.child(Scope.java:189)
	at liquibase.Scope.child(Scope.java:179)
	at liquibase.Scope.child(Scope.java:158)
	at liquibase.Scope.child(Scope.java:243)
	at liquibase.Scope.child(Scope.java:247)
	at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:65)
	... 62 more
Caused by: liquibase.exception.DatabaseException: (conn=345) Multiple primary key defined [Failed SQL: (1068) ALTER TABLE `metabase`.`QRTZ_JOB_DETAILS` ADD PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`)]
	at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:397)
	at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:83)
	at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:151)
	at liquibase.database.AbstractJdbcDatabase.execute(AbstractJdbcDatabase.java:1279)
	at liquibase.database.AbstractJdbcDatabase.executeStatements(AbstractJdbcDatabase.java:1261)
	at liquibase.changelog.ChangeSet.execute(ChangeSet.java:661)
	... 82 more
Caused by: java.sql.SQLSyntaxErrorException: (conn=345) Multiple primary key defined
	at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62)
	at org.mariadb.jdbc.internal.util.exceptions.ExceptionFactory.create(ExceptionFactory.java:158)
	at org.mariadb.jdbc.MariaDbStatement.executeExceptionEpilogue(MariaDbStatement.java:262)
	at org.mariadb.jdbc.MariaDbStatement.executeInternal(MariaDbStatement.java:362)
	at org.mariadb.jdbc.MariaDbStatement.execute(MariaDbStatement.java:500)
	at com.mchange.v2.c3p0.impl.NewProxyStatement.execute(NewProxyStatement.java:75)
	at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:393)
	... 87 more
Caused by: org.mariadb.jdbc.internal.util.exceptions.MariaDbSqlException: Multiple primary key defined
	at org.mariadb.jdbc.internal.util.exceptions.MariaDbSqlException.of(MariaDbSqlException.java:34)
	at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.exceptionWithQuery(AbstractQueryProtocol.java:194)
	at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:262)
	at org.mariadb.jdbc.MariaDbStatement.executeInternal(MariaDbStatement.java:356)
	... 90 more
Caused by: java.sql.SQLException: Multiple primary key defined
	at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readErrorPacket(AbstractQueryProtocol.java:1695)
	at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readPacket(AbstractQueryProtocol.java:1557)
	at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.getResult(AbstractQueryProtocol.java:1520)
	at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:256)
	... 91 more
Command failed with exception: ERROR Set up mysql target database and run migrations...: liquibase.exception.MigrationFailedException: Migration failed for change set migrations/000_migrations.yaml::89::camsaul:
     Reason: liquibase.exception.DatabaseException: (conn=345) Multiple primary key defined [Failed SQL: (1068) ALTER TABLE `metabase`.`QRTZ_JOB_DETAILS` ADD PRIMARY KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`)]

there's clearly some field inserted by error there by someone

the structure of Metabase DB for that table is

create table if not exists metabase.QRTZ_JOB_DETAILS
(
    SCHED_NAME        varchar(120) not null,
    JOB_NAME          varchar(200) not null,
    JOB_GROUP         varchar(200) not null,
    DESCRIPTION       varchar(250) null,
    JOB_CLASS_NAME    varchar(250) not null,
    IS_DURABLE        bit          not null,
    IS_NONCONCURRENT  bit          not null,
    IS_UPDATE_DATA    bit          not null,
    REQUESTS_RECOVERY bit          not null,
    JOB_DATA          blob         null,
    primary key (SCHED_NAME, JOB_NAME, JOB_GROUP)
)
    comment 'Used for Quartz scheduler.' engine = InnoDB;

create index IDX_QRTZ_J_GRP
    on metabase.QRTZ_JOB_DETAILS (SCHED_NAME, JOB_GROUP);

create index IDX_QRTZ_J_REQ_RECOVERY
    on metabase.QRTZ_JOB_DETAILS (SCHED_NAME, REQUESTS_RECOVERY);