Comment se débarrasser des erreurs avec les tables Active Object lors de la restauration de Jira à partir de la sauvegarde



Dans cet article, nous expliquerons comment supprimer les erreurs des tables Active Objects lors de la restauration de Jira à partir d'une sauvegarde et écrire un plugin pour supprimer les tables Active Objects inutiles d'un fichier d'archive de sauvegarde.

Que sont les tables Active Objects?


La base de donnĂ©es Jira contient deux types de tables: les tables systĂšme, telles que jiraissue, cwd_user, changegroup et les tables ajoutĂ©es par les plugins installĂ©s dans Jira. Ces tables sont des tables Active Objects. Ils peuvent ĂȘtre facilement distinguĂ©s des tables systĂšme par le prĂ©fixe AO_XXXXXX.
AO signifie Active Objects, et XXXXXX est le code de hachage que Jira gĂ©nĂšre pour chaque plugin. Le code de hachage est nĂ©cessaire pour pouvoir crĂ©er des tables avec le mĂȘme nom dans diffĂ©rents plugins. Étant donnĂ© qu'aprĂšs avoir ajoutĂ© le prĂ©fixe AO_XXXXXX aux tables portant le mĂȘme nom, les noms de table commencent Ă  diffĂ©rer et peuvent donc ĂȘtre créés dans la base de donnĂ©es.

Active Objects est une couche ORM dans les produits Atlassian. En savoir plus ici .

Dans Jira, vous pouvez voir des informations sur toutes les tables créées par chaque plugin, si vous allez dans Gear -> System -> Plugin Data Storage. Par exemple, sur mon instance Jira, les informations du plugin ressemblent à ceci:



La capture d'écran montre que le plugin Atlassian Notifications a créé trois tableaux qui ont le hashcode 21F425

Erreurs AO


Voyons maintenant à quoi ressemblent ces erreurs en temps réel. Voici un exemple d'erreur «champ non pris en charge rencontré: binaire»:



Nous corrigeons l'erreur "Champ non pris en charge rencontré: binaire"


Essayons de corriger cette erreur. Pour ce faire, dĂ©compressez le fichier de sauvegarde. À l'intĂ©rieur, nous verrons deux fichiers: entity.xml et activeobjects.xml.

Le fichier entity.xml contient des données de table systÚme. Le fichier activeobjects.xml contient les données de la table des objets actifs. Nous avons juste besoin du fichier activeobjects.xml.

Ouvrez le fichier activeobjects.xml et recherchez le mot "binaire" dans le fichier. Dans mon cas, 10 correspondances ont été trouvées. Ces correspondances ressemblent à ceci:

<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> 

Supprimez toutes les lignes <binary xsi: nil = "true" /> dans le fichier activeobjects.xml et essayez de restaurer Jira Ă  nouveau.

Cette fois, l'erreur "champ non pris en charge rencontré: binaire" est corrigée, mais nous voyons une nouvelle erreur:



Voyons le contenu du fichier atlassian-jira.log:

 [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 

Si vous recherchez des informations sur cette erreur sur Internet, nous trouverons un tel KB .

Dans ce KB, il est proposé de changer la dimension du champ n ° 10 à -1. Essayons.

 <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> 

Changement:

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

sur

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

et essayez de restaurer Jira Ă  partir de notre sauvegarde.

Dans le journal, nous voyons Ă  nouveau les mĂȘmes erreurs. KB n'a pas aidĂ©.

plugin inconnu


Relisons attentivement l'erreur. Nous verrons que les donnĂ©es du plugin UKNOWN PLUGIN ne peuvent pas ĂȘtre importĂ©es. Pourquoi Ă  partir d'un plugin inconnu (UKNOWN PLUIGN)?
Si vous regardez la capture d'écran ci-dessous, vous pouvez voir que certains objets actifs n'ont pas les noms des plugins auxquels ils se rapportent:



Vous pouvez voir que le plugin est dans le rectangle rouge, mais le plugin n'est pas dans le rectangle bleu. Cela peut se produire si nous installons le plugin, puis le désinstallons et redémarrons Jira en supprimant le dossier .osgi_plugins. Ce type de redémarrage de Jira est recommandé en cas de problÚme avec les plugins.

Notre table AIO_USER n'a pas de nom de plugin, nous pouvons donc simplement supprimer la table.
Trouvons la définition de cette table dans le fichier activeobjects.xml, supprimons la définition trouvée et essayons de restaurer Jira à partir de la sauvegarde.

Nous verrons une autre erreur:

 [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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)] 

Le problÚme est que nous avons supprimé la définition de la table, mais n'avons pas supprimé les données de cette table. Trouvons les données de ce tableau dans le fichier activeobjects.xml et supprimons-le.

Les données sur la table commencent par cette balise:

 <data tableName="AO_6B9F04_AIO_USER"> 

Et terminez avec cette balise:

 </data> 

Supprimons ces balises et tout ce qui se trouve entre ces balises et réessayons de restaurer Jira à partir de la sauvegarde.

Nous obtiendrons une autre erreur:

 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. 

Cela signifie qu'il existe encore des tables dans le plugin qui rĂ©fĂ©rencent cette table, nous devons donc toujours supprimer toutes les tables qui rĂ©fĂ©rencent la table distante. Ensuite, tout peut aller le long de la chaĂźne: vous devrez peut-ĂȘtre supprimer les tables de ce plugin qui font rĂ©fĂ©rence aux tables supprimĂ©es.

Par conséquent, il sera beaucoup plus rapide de supprimer toutes les tables avec le préfixe AO_6B9F04 du fichier de sauvegarde par programme.

Écrivons un plugin qui supprimera les tables du fichier de sauvegarde par le prĂ©fixe donnĂ©. Le plugin sera composĂ© de webwork, qui recevra le nom du fichier de sauvegarde (le fichier de sauvegarde doit ĂȘtre dans JIRA_HOME / import) et le prĂ©fixe.

Le code source du plugin peut ĂȘtre rĂ©cupĂ©rĂ© ici .

Créer un plugin


Ouvrez le terminal et exécutez la commande suivante:

 atlas-create-jira-plugin 

Vous devez répondre à des questions comme celle-ci:

 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 

Modification de POM.XML


Le fichier pom.xml devrait ressembler Ă  ceci:
bitbucket.org/alex1mmm/clean-backup/src/master/pom.xml

Nous créons WEBWORK, WEB SECTION et WEB ITEM


Ouvrez le terminal et exécutez:

 atlas-create-jira-plugin-module 

Vous devez répondre à des questions comme celle-ci:

 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 

Modification de WEBWORK et SUCCESS.VM


Modifiez notre success.vm pour que notre travail Web puisse prendre deux paramÚtres: nom de sauvegarde et préfixe:

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

Nous utiliserons SAX pour travailler avec des fichiers xml, nous allons donc écrire un filtre pour supprimer les tables:

clean-backup / src / main / java / ru / matveev / alexey / plugins / jira / cleanbackup / jira / webwork / TableFilter.java .
Maintenant, modifiez le travail Web.

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

Construisez et exécutez notre plugin


Nous allons dans le dossier du plugin et exécutons:

 atlas-run 

AprÚs le démarrage de Jira, placez notre fichier de sauvegarde dans JIRA_HOME / import et accédez à l'adresse suivante dans le navigateur:

localhost : 2990 / jira / secure / CleanBackup.jspa

Entrez le nom de la sauvegarde, le préfixe et cliquez sur le bouton Nettoyer:



Les tables avec le préfixe que nous avons entré seront supprimées de la sauvegarde et aprÚs cela, vous pourrez restaurer Jira.

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


All Articles