openjverein / jverein

Open JVerein - Open Source Vereinsverwaltung
https://openjverein.github.io
GNU General Public License v3.0
43 stars 17 forks source link

Fehler beim Importieren eines Diagnose-Backups #195

Closed SchachtnerTh closed 8 months ago

SchachtnerTh commented 8 months ago

Hallo zusammen, ich arbeite aktuell mit JVerein, das auf zwei PCs läuft. Die Datenbank wird dabei auf einem MySQL-Server im Internet gehostet, der über einen SSH-Tunnel verbunden wird. Das läuft eigentlich ganz gut (zwar nicht sehr performant, aber es passt).

Ich wollt mir jetzt gerade mal dieses neue Feature anschauen, dass man auf eine Rechnung einen QR-Code drucken können soll. Ich dachte mir, dass ich das ja vielleicht mal ausprobieren könnte. Keine Ahnung, ob ich das schaffe.

Leider scheitere ich schon beim Erstellen einer Testumgebung. Ich wollte ein "Diagnose-Backup" der MySQL-Installation in meiner Eclipse-Entwicklungsumgebungs-Version einspielen. Einige Mitglieder werden korrekt importiert, aber dann bricht der Import plötzlich mit Fehlermeldungen ab:

Hier eine davon:

Fehler: de.willuhn.util.ApplicationException: Dieser Datensatz darf nicht gelöscht werden! at de.jost_net.JVerein.server.AdresstypImpl.deleteCheck(AdresstypImpl.java:55) at de.willuhn.datasource.db.AbstractDBObject.delete(AbstractDBObject.java:349) at de.jost_net.JVerein.gui.action.BackupRestoreAction.handleAction(BackupRestoreAction.java:81) at de.willuhn.jameica.gui.Navigation.start(Navigation.java:394) at de.willuhn.jameica.gui.Navigation$MyActionListener.handleEvent(Navigation.java:489) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:89) at org.eclipse.swt.widgets.Display.sendEvent(Display.java:5855) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1529) at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:5065) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:4517) at de.willuhn.jameica.gui.GUI.loop(GUI.java:938) at de.willuhn.jameica.gui.GUI.init(GUI.java:335) at de.willuhn.jameica.system.Application.init(Application.java:145) at de.willuhn.jameica.system.Application.newInstance(Application.java:87) at de.willuhn.jameica.Main.main(Main.java:78)

oder hier:

unable to import de.jost_net.JVerein.server.AdresstypImpl:null, skipping java.rmi.RemoteException: insert failed, rollback successful; nested exception is: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Eindeutiger Index oder Primärschlüssel verletzt: "PRIMARY KEY ON PUBLIC.ADRESSTYP(ID) [1, 'Mitglied', 'Mitglieder', 1]" Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.ADRESSTYP(ID) [1, 'Mitglied', 'Mitglieder', 1]"; SQL statement: insert into ADRESSTYP (JVEREINID,BEZEICHNUNG,BEZEICHNUNGPLURAL,ID) values (?,?,?,1) [23505-199] at de.willuhn.datasource.db.AbstractDBObject.insert(AbstractDBObject.java:700) at de.jost_net.JVerein.gui.action.BackupRestoreAction$1.run(BackupRestoreAction.java:155) at de.willuhn.jameica.gui.GUI$7.run(GUI.java:1107) Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Eindeutiger Index oder Primärschlüssel verletzt: "PRIMARY KEY ON PUBLIC.ADRESSTYP(ID) [1, 'Mitglied', 'Mitglieder', 1]" Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.ADRESSTYP(ID) [1, 'Mitglied', 'Mitglieder', 1]"; SQL statement: insert into ADRESSTYP (JVEREINID,BEZEICHNUNG,BEZEICHNUNGPLURAL,ID) values (?,?,?,1) [23505-199] at org.h2.message.DbException.getJdbcSQLException(DbException.java:457) at org.h2.message.DbException.getJdbcSQLException(DbException.java:427) at org.h2.message.DbException.get(DbException.java:205) at org.h2.message.DbException.get(DbException.java:181) at org.h2.mvstore.db.MVPrimaryIndex.add(MVPrimaryIndex.java:131) at org.h2.mvstore.db.MVTable.addRow(MVTable.java:546) at org.h2.command.dml.Insert.insertRows(Insert.java:180) at org.h2.command.dml.Insert.update(Insert.java:132) at org.h2.command.CommandContainer.update(CommandContainer.java:133) at org.h2.command.Command.executeUpdate(Command.java:267) at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:200) at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:154) at de.willuhn.datasource.db.AbstractDBObject.insert(AbstractDBObject.java:655) ... 2 more

hier:

unable to import de.jost_net.JVerein.server.MitgliedskontoImpl:null, skipping java.rmi.RemoteException: insert failed, rollback successful; nested exception is: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referentielle Integrität verletzt: "FKMITGLIEDSKONTO2: PUBLIC.MITGLIEDSKONTO FOREIGN KEY(MITGLIED) REFERENCES PUBLIC.MITGLIED(ID) (33)" Referential integrity constraint violation: "FKMITGLIEDSKONTO2: PUBLIC.MITGLIEDSKONTO FOREIGN KEY(MITGLIED) REFERENCES PUBLIC.MITGLIED(ID) (33)"; SQL statement: insert into MITGLIEDSKONTO (DATUM,NETTOBETRAG,MITGLIED,ZAHLUNGSWEG,BETRAG,STEUERSATZ,ABRECHNUNGSLAUF,STEUERBETRAG,ZWECK1,BUCHUNGSART,ID) values (?,?,?,?,?,?,?,?,?,?,5) [23506-199] at de.willuhn.datasource.db.AbstractDBObject.insert(AbstractDBObject.java:700) at de.jost_net.JVerein.gui.action.BackupRestoreAction$1.run(BackupRestoreAction.java:155) at de.willuhn.jameica.gui.GUI$7.run(GUI.java:1107) Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referentielle Integrität verletzt: "FKMITGLIEDSKONTO2: PUBLIC.MITGLIEDSKONTO FOREIGN KEY(MITGLIED) REFERENCES PUBLIC.MITGLIED(ID) (33)" Referential integrity constraint violation: "FKMITGLIEDSKONTO2: PUBLIC.MITGLIEDSKONTO FOREIGN KEY(MITGLIED) REFERENCES PUBLIC.MITGLIED(ID) (33)"; SQL statement: insert into MITGLIEDSKONTO (DATUM,NETTOBETRAG,MITGLIED,ZAHLUNGSWEG,BETRAG,STEUERSATZ,ABRECHNUNGSLAUF,STEUERBETRAG,ZWECK1,BUCHUNGSART,ID) values (?,?,?,?,?,?,?,?,?,?,5) [23506-199] at org.h2.message.DbException.getJdbcSQLException(DbException.java:457) at org.h2.message.DbException.getJdbcSQLException(DbException.java:427) at org.h2.message.DbException.get(DbException.java:205) at org.h2.message.DbException.get(DbException.java:181) at org.h2.constraint.ConstraintReferential.checkRowOwnTable(ConstraintReferential.java:319) at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:261) at org.h2.table.Table.fireConstraints(Table.java:1020) at org.h2.table.Table.fireAfterRow(Table.java:1038) at org.h2.command.dml.Insert.insertRows(Insert.java:194) at org.h2.command.dml.Insert.update(Insert.java:132) at org.h2.command.CommandContainer.update(CommandContainer.java:133) at org.h2.command.Command.executeUpdate(Command.java:267) at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:200) at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:154) at de.willuhn.datasource.db.AbstractDBObject.insert(AbstractDBObject.java:655) ... 2 more

und hier:

error while importing data de.willuhn.datasource.rmi.ObjectNotFoundException: object [id: 33, type: de.jost_net.JVerein.server.MitgliedImpl] not found at de.willuhn.datasource.db.AbstractDBObject.load(AbstractDBObject.java:270) at de.willuhn.datasource.db.DBServiceImpl.createObject(DBServiceImpl.java:394) at de.willuhn.datasource.db.AbstractDBObject.getAttribute(AbstractDBObject.java:473) at de.jost_net.JVerein.server.MitgliedskontoImpl.getAttribute(MitgliedskontoImpl.java:296) at de.willuhn.datasource.BeanUtil.toString(BeanUtil.java:180) at de.jost_net.JVerein.gui.action.BackupRestoreAction$1.run(BackupRestoreAction.java:176) at de.willuhn.jameica.gui.GUI$7.run(GUI.java:1107)

Da geht es hauptsächlich darum, dass...

Wie soll ich hier vorgehen?

a) Das Einspielen eines Backups einer MariaDB-Installation in eine H2DB-Installation wird nicht unterstützt. Die Fehler könnten daher kommen. (Was kann ich hier machen? Kann ich von einer MariaDB-Installation nie mehr zurück?) b) Diese Fehler sind bekannt. (Ist auch die Lösung bekannt? Was mache ich falsch?)

Ich will hier keinem zur Last fallen, aber vielleicht muss man mir ja nur ein bisschen "Starthilfe" geben? Danke euch schon mal für eure Unterstützung!

Viele Grüße Tom

SchachtnerTh commented 8 months ago

not bothering anyone with my private problems ;-)

willuhn commented 8 months ago

Es gibt die Möglichkeit, MySQL nach H2 zu migrieren, ohne den XML-Dump zu verwenden. Allerdings ist das mit etwas Gebastel verbunden. Hier findet sich z.B. ein Thread dazu: https://stackoverflow.com/questions/11610850/convert-mysql-script-to-h2

MSchmalzl commented 7 months ago

Wenn es nur um eine einfache Testumgebung geht, warum nicht einfach die H2 nehmen? Falls dann Daten (Mitglieder, Konten, Buchungen) benötigt werden sind die auch sehr schnell per Hand erstellt.