So beseitigen Sie Fehler mit Active Object-Tabellen beim Wiederherstellen von Jira aus der Sicherung



In diesem Artikel wird erläutert, wie Sie Fehler mit Active Objects-Tabellen beim Wiederherstellen von Jira aus einer Sicherung beseitigen und ein Plugin schreiben, um unnötige Active Objects-Tabellen aus einer Sicherungsarchivdatei zu entfernen.

Was sind Active Objects-Tabellen?


Die Jira-Datenbank enthält zwei Arten von Tabellen: Systemtabellen wie jiraissue, cwd_user, changegroup und Tabellen, die von den in Jira installierten Plugins hinzugefügt wurden. Diese Tabellen sind Active Objects-Tabellen. Sie können leicht von Systemtabellen durch das Präfix AO_XXXXXX unterschieden werden.
AO steht für Active Objects und XXXXXX ist der Hash-Code, den Jira für jedes Plugin generiert. Der Hashcode wird benötigt, um gleichnamige Tabellen in verschiedenen Plugins erstellen zu können. Da nach dem Hinzufügen des Präfixes AO_XXXXXX zu Tabellen mit demselben Namen die Tabellennamen unterschiedlich werden und daher in der Datenbank erstellt werden können.

Active Objects ist eine ORM-Schicht in Atlassian-Produkten. Lesen Sie hier mehr darüber.

In Jira können Sie Informationen zu allen von jedem Plugin erstellten Tabellen anzeigen, wenn Sie zu Gear -> System -> Plugin Data Storage gehen. In meiner Jira-Instanz sehen die Plugin-Informationen beispielsweise folgendermaßen aus:



Der Screenshot zeigt, dass das Atlassian Notifications-Plugin drei Tabellen mit dem Hashcode 21F425 erstellt hat

AO-Fehler


Nun wollen wir sehen, wie diese Fehler in Echtzeit aussehen. Hier ist ein Beispiel für einen Fehler "Nicht unterstütztes Feld gefunden: binär":



Wir beheben den Fehler "Nicht unterstütztes Feld gefunden: binär"


Versuchen wir, diesen Fehler zu beheben. Entpacken Sie dazu die Sicherungsdatei. Im Inneren sehen wir zwei Dateien: entity.xml und activeobjects.xml.

Die Datei entity.xml enthält Systemtabellendaten. Die Datei activeobjects.xml enthält Active Objects-Tabellendaten. Wir brauchen nur die Datei activeobjects.xml.

Öffnen Sie die Datei activeobjects.xml und suchen Sie in der Datei nach dem Wort "binär". In meinem Fall wurden 10 Übereinstimmungen gefunden. Diese Spiele sehen folgendermaßen aus:

<row> <string>Alexey Matveev</string> <string>alexey.matveev@aaa.com</string> <integer>1</integer> <timestamp xsi:nil="true"/> <string xsi:nil="true"/> <integer xsi:nil="true"/> <binary xsi:nil="true"/> <string xsi:nil="true"/> <string xsi:nil="true"/> <integer xsi:nil="true"/> <string>Europe/Moscow</string> <string>alexey</string> <string>alexey</string> </row> 

Löschen Sie alle Zeilen <binary xsi: nil = "true" /> in der Datei activeobjects.xml und versuchen Sie erneut, Jira wiederherzustellen.

Diesmal ist der Fehler "Nicht unterstütztes Feld gefunden: binär" behoben, aber wir sehen einen neuen Fehler:



Sehen wir uns den Inhalt der Datei atlassian-jira.log an:

 [INFO] [talledLocalContainer] com.atlassian.activeobjects.spi.ActiveObjectsImportExportException: There was an error during import/export with <unknown plugin> (table AO_6B9F04_AIO_USER):Could not import data in table 'AO_6B9F04_AIO_USER' column #10, value is too big for column which size limit is 10, value is: [INFO] [talledLocalContainer] Europe/Moscow 

Wenn Sie im Internet nach Informationen zu diesem Fehler suchen, finden wir genau diese KB .

In dieser KB wird vorgeschlagen, die Dimension des Feldes Nr. 10 auf -1 zu ändern. Lass es uns versuchen.

 <table name="AO_6B9F04_AIO_USER"> <column name="DISPLAY_NAME" primaryKey="false" autoIncrement="false" sqlType="-9" precision="255"/> <column name="EMAIL_ADDRESS" primaryKey="false" autoIncrement="false" sqlType="-9" precision="255"/> <column name="ID" primaryKey="true" autoIncrement="true" sqlType="4" precision="10"/> <column name="LAST_LOGIN_DATE" primaryKey="false" autoIncrement="false" sqlType="93" precision="23" scale="3"/> <column name="LOCALE" primaryKey="false" autoIncrement="false" sqlType="-9" precision="255"/> <column name="LOGIN_DAYS_COUNT" primaryKey="false" autoIncrement="false" sqlType="4" precision="10"/> <column name="O_AUTH_TOKEN" primaryKey="false" autoIncrement="false" sqlType="-4" precision="2147483647"/> <column name="O_AUTH_TOKEN_SECRET" primaryKey="false" autoIncrement="false" sqlType="-9" precision="255"/> <column name="TABLEAU_KEY" primaryKey="false" autoIncrement="false" sqlType="-9" precision="255"/> <column name="TENANT_ID" primaryKey="false" autoIncrement="false" sqlType="4" precision="10"/> <column name="TIME_ZONE" primaryKey="false" autoIncrement="false" sqlType="-9" precision="255"/> <column name="USERKEY" primaryKey="false" autoIncrement="false" sqlType="-9" precision="255"/> <column name="USERNAME" primaryKey="false" autoIncrement="false" sqlType="-9" precision="255"/> <foreignKey fromTable="AO_6B9F04_AIO_USER" fromColumn="TENANT_ID" toTable="AO_6B9F04_AIO_TENANT" toColumn="ID"/> </table> 

Änderung:

 <column name="TENANT_ID" primaryKey="false" autoIncrement="false" sqlType="4" precision="10"/> 

auf

 <column name="TENANT_ID" primaryKey="false" autoIncrement="false" sqlType="4" precision="-1"/> 

und versuchen Sie, Jira aus unserem Backup wiederherzustellen.

Im Protokoll sehen wir wieder die gleichen Fehler. KB hat nicht geholfen.

Unbekanntes Plugin


Lesen wir den Fehler noch einmal sorgfältig durch. Wir werden sehen, dass Daten aus dem UKNOWN PLUGIN-Plugin nicht importiert werden können. Warum von einem unbekannten Plugin (UKNOWN PLUIGN)?
Wenn Sie sich den Screenshot unten ansehen, können Sie sehen, dass einige aktive Objekte nicht die Namen der Plugins haben, auf die sie sich beziehen:



Sie können sehen, dass sich das Plugin im roten Rechteck befindet, das Plugin jedoch nicht im blauen Rechteck. Dies kann passieren, wenn wir das Plugin installieren, es dann deinstallieren und Jira neu starten, indem wir den Ordner .osgi_plugins löschen. Diese Art des Neustarts von Jira wird empfohlen, wenn Probleme mit den Plugins auftreten.

Unsere Tabelle AIO_USER hat keinen Plugin-Namen, daher können wir die Tabelle einfach löschen.
Lassen Sie uns die Definition dieser Tabelle in der Datei activeobjects.xml finden, die gefundene Definition löschen und versuchen, Jira aus der Sicherung wiederherzustellen.

Wir werden einen weiteren Fehler sehen:

 [INFO] [talledLocalContainer] com.atlassian.activeobjects.spi.ActiveObjectsImportExportException: There was an error during import/export with <unknown plugin> (table AO_6B9F04_AIO_USER):Could not create prepared statement for SQL query, [INSERT INTO PUBLIC."AO_6B9F04_AIO_USER" ("DISPLAY_NAME", "EMAIL_ADDRESS", "ID", "LAST_LOGIN_DATE", "LOCALE", "LOGIN_DAYS_COUNT", "O_AUTH_TOKEN", "O_AUTH_TOKEN_SECRET", "TABLEAU_KEY", "TENANT_ID", "TIME_ZONE", "USERKEY", "USERNAME") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)] 

Das Problem ist, dass wir die Tabellendefinition gelöscht haben, aber die Daten aus dieser Tabelle nicht gelöscht haben. Lassen Sie uns die Daten in dieser Tabelle in der Datei activeobjects.xml finden und löschen.

Die Daten in der Tabelle beginnen mit diesem Tag:

 <data tableName="AO_6B9F04_AIO_USER"> 

Und ende mit diesem Tag:

 </data> 

Löschen wir diese Tags und alles zwischen diesen Tags und versuchen Sie erneut, Jira aus dem Backup wiederherzustellen.

Wir werden einen weiteren Fehler erhalten:

 There was a problem restoring ActiveObjects data for the <unknown plugin> plugin. Caught exception with following message: Table "AO_6B9F04_AIO_USER" not found; SQL statement: ALTER TABLE PUBLIC.AO_6B9F04_AIO_REPORT ADD CONSTRAINT fk_ao_6b9f04_aio_report_owner_id FOREIGN KEY (OWNER_ID) REFERENCES PUBLIC.AO_6B9F04_AIO_USER(ID) [42102-185]. Please check the log for details. 

Dies bedeutet, dass das Plugin noch Tabellen enthält, die auf diese Tabelle verweisen. Daher müssen wir weiterhin alle Tabellen löschen, die auf die entfernte Tabelle verweisen. Dann kann alles entlang der Kette gehen: Möglicherweise müssen Sie die Tabellen dieses Plugins löschen, die auf die gelöschten Tabellen verweisen.

Daher ist es viel schneller, alle Tabellen mit dem Präfix AO_6B9F04 programmgesteuert aus der Sicherungsdatei zu löschen.

Schreiben wir ein Plugin, das Tabellen mit dem angegebenen Präfix aus der Sicherungsdatei löscht. Das Plugin besteht aus Webwork, das den Namen der Sicherungsdatei (die Sicherungsdatei muss sich in JIRA_HOME / import befinden) und das Präfix erhält.

Den Quellcode des Plugins finden Sie hier .

Erstellen Sie ein Plugin


Öffnen Sie das Terminal und führen Sie den folgenden Befehl aus:

 atlas-create-jira-plugin 

Sie müssen die folgenden Fragen beantworten:

 Define value for groupId: : ru.matveev.alexey.plugins.jira.cleanbackup Define value for artifactId: : clean-backup Define value for version: 1.0.0-SNAPSHOT: : Define value for package: ru.matveev.alexey.plugins.jira.cleanbackup: : Confirm properties configuration: groupId: ru.matveev.alexey.plugins.jira.cleanbackup artifactId: clean-backup version: 1.0.0-SNAPSHOT package: ru.matveev.alexey.plugins.jira.cleanbackup Y: : Y 

POM.XML bearbeiten


Die Datei pom.xml sollte folgendermaßen aussehen:
bitbucket.org/alex1mmm/clean-backup/src/master/pom.xml

Wir erstellen WEBWORK, WEB SECTION und WEB ITEM


Öffnen Sie das Terminal und führen Sie Folgendes aus:

 atlas-create-jira-plugin-module 

Sie müssen die folgenden Fragen beantworten:

 Choose a number (1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34): 31 Enter Plugin Module Name My Webwork Module: : cleanbackup Show Advanced Setup? (Y/y/N/n) N: : y Module Key cleanbackup: : Module Description The cleanbackup Plugin: : i18n Name Key cleanbackup.name: : i18n Description Key cleanbackup.description: : Enter Action Classname MyActionClass: : CleanBackup Enter Package Name ru.matveev.alexey.plugins.jira.cleanbackup.jira.webwork: : Enter Alias CleanBackup: : CleanBackup Enter View Name success: : success Enter Template Path /templates/cleanbackup/cleanbackup/success.vm: : Add Another View? (Y/y/N/n) N: : N Add Another Action? (Y/y/N/n) N: : N Add Another Plugin Module? (Y/y/N/n) N: : Y Choose a number (1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34): 30 Enter Plugin Module Name My Web Section: : CleanBackup Enter Location (eg system.admin/mynewsection): admin_plugins_menu Show Advanced Setup? (Y/y/N/n) N: : n Add Another Plugin Module? (Y/y/N/n) N: : Y Choose a number (1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34): 25 Enter Plugin Module Name My Web Item: : CleanAO Enter Section (eg system.admin/globalsettings): admin_plugins_menu/clean-backup Enter Link URL (eg /secure/CreateIssue!default.jspa): /secure/CleanBackup.jspa? Show Advanced Setup? (Y/y/N/n) N: : Y Module Key clean-ao: : Module Description The CleanAO Plugin: : i18n Name Key clean-ao.name: : i18n Description Key clean-ao.description: : Weight 1000: : Link Id clean-ao-link: : Enter Label Key clean-ao.label: : CleanBackup Enter Label Value CleanAO: : CleanAO Add Label Param? (Y/y/N/n) N: : n Add Icon? (Y/y/N/n) N: : n Add Tooltip? (Y/y/N/n) N: : n Add Resource (Y/y/N/n) N: : n Add Velocity Context Provider (Y/y/N/n) N: : n Add Plugin Module Param? (Y/y/N/n) N: : n Add Conditions? (Y/y/N/n) N: : n Add Another Plugin Module? (Y/y/N/n) N: : n 

Bearbeiten von WEBWORK und SUCCESS.VM


Ändern Sie unsere success.vm so, dass unsere Webarbeit zwei Parameter annehmen kann: Sicherungsname und Präfix:

clean-backup / src / main / resources / templates / cleanbackup / cleanbackup / success.vm .

Wir werden SAX verwenden, um mit XML-Dateien zu arbeiten, also werden wir einen Filter schreiben, um Tabellen zu löschen:

clean-backup / src / main / java / ru / matveev / alexey / plugins / jira / cleanbackup / jira / webwork / TableFilter.java .
Nehmen Sie nun Änderungen an der Webarbeit vor.

clean-backup / src / main / java / ru / matveev / alexey / plugins / jira / cleanbackup / jira / webwork / CleanBackup.java

Erstellen Sie unser Plugin und führen Sie es aus


Wir gehen zum Plugin-Ordner und führen Folgendes aus:

 atlas-run 

Nachdem Jira gestartet wurde, legen Sie unsere Sicherungsdatei in JIRA_HOME / import ab und gehen Sie im Browser zu der folgenden Adresse:

localhost : 2990 / jira / secure / CleanBackup.jspa

Geben Sie den Namen der Sicherung und das Präfix ein und klicken Sie auf die Schaltfläche Bereinigen:



Die von uns eingegebenen Tabellen mit dem Präfix werden aus der Sicherung gelöscht, und danach können Sie Jira wiederherstellen.

Source: https://habr.com/ru/post/de421699/


All Articles