
En este artículo, hablaremos sobre cómo deshacerse de los errores con las tablas de Active Objects al restaurar Jira desde una copia de seguridad y escribir un complemento para eliminar las tablas de Active Objects innecesarias de un archivo de copia de seguridad.
¿Qué son las tablas de objetos activos?
La base de datos de Jira contiene dos tipos de tablas: tablas del sistema, como jiraissue, cwd_user, changegroup y tablas agregadas por los complementos instalados en Jira. Estas tablas son tablas de objetos activos. Se pueden distinguir fácilmente de las tablas del sistema por el prefijo AO_XXXXXX.
AO significa Active Objects, y XXXXXX es el código hash que Jira genera para cada complemento. El código hash es necesario para poder crear tablas con el mismo nombre en diferentes complementos. Dado que después de agregar el prefijo AO_XXXXXX a las tablas con el mismo nombre, los nombres de las tablas comienzan a diferir y, por lo tanto, se pueden crear en la base de datos.
Active Objects es una capa ORM en productos Atlassian. Lea más sobre esto
aquí .
En Jira, puede ver información sobre todas las tablas creadas por cada complemento, si va a Gear -> Sistema -> Almacenamiento de datos del complemento. Por ejemplo, en mi instancia de Jira, la información del complemento se ve así:

La captura de pantalla muestra que el complemento de notificaciones de Atlassian ha creado tres tablas que tienen el código hash 21F425
AO errores
Ahora veamos cómo se ven estos errores en tiempo real. Aquí hay un ejemplo de un error de "campo no compatible encontrado: binario":

Arreglamos el error "campo no admitido encontrado: binario"
Intentemos solucionar este error. Para hacer esto, desempaquete el archivo de respaldo. En el interior veremos dos archivos: entity.xml y activeobjects.xml.
El archivo entity.xml contiene datos de la tabla del sistema. El archivo activeobjects.xml contiene datos de la tabla de Active Objects. Solo necesitamos el archivo activeobjects.xml.
Abra el archivo activeobjects.xml y busque la palabra "binario" en el archivo. En mi caso, se encontraron 10 coincidencias. Estos partidos se ven así:
<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>
Elimine todas las líneas <binary xsi: nil = "true" /> en el archivo activeobjects.xml e intente restaurar Jira nuevamente.
Esta vez, el error "campo no admitido encontrado: binario" es fijo, pero vemos un nuevo error:

Veamos el contenido del archivo 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
Si busca información sobre este error en Internet, encontraremos tal
KB .
En este KB se propone cambiar la dimensión del campo No. 10 a -1. Probémoslo.
<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>
Cambio:
<column name="TENANT_ID" primaryKey="false" autoIncrement="false" sqlType="4" precision="10"/>
en
<column name="TENANT_ID" primaryKey="false" autoIncrement="false" sqlType="4" precision="-1"/>
e intente restaurar a Jira desde nuestra copia de seguridad.
En el registro vemos de nuevo los mismos errores. KB no ayudó.
plugin desconocido
Leamos cuidadosamente el error nuevamente. Veremos que los datos del complemento UKNOWN PLUGIN no pueden importarse. ¿Por qué de un complemento desconocido (UKNOWN PLUIGN)?
Si mira la captura de pantalla a continuación, puede ver que algunos objetos activos no tienen los nombres de los complementos con los que se relacionan:

Puede ver que el complemento está en el rectángulo rojo, pero el complemento no está en el rectángulo azul. Esto puede suceder si instalamos el complemento, luego lo desinstalamos y reiniciamos Jira eliminando la carpeta .osgi_plugins. Se recomienda este tipo de reinicio de Jira si hay algún problema con los complementos.
Nuestra tabla AIO_USER no tiene un nombre de complemento, por lo que podemos eliminar la tabla.
Busquemos la definición de esta tabla en el archivo activeobjects.xml, eliminemos la definición encontrada e intentemos restaurar Jira desde la copia de seguridad.
Veremos otro error:
[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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]
El problema es que eliminamos la definición de la tabla, pero no eliminamos los datos de esta tabla. Busquemos los datos de esta tabla en el archivo activeobjects.xml y elimínelos.
Los datos en la tabla comienzan con esta etiqueta:
<data tableName="AO_6B9F04_AIO_USER">
Y termina con esta etiqueta:
</data>
Eliminemos estas etiquetas y todo lo que se encuentre entre ellas, e intente nuevamente restaurar Jira desde la copia de seguridad.
Obtendremos otro error:
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.
Esto significa que todavía hay tablas en el complemento que hacen referencia a esta tabla, por lo que aún necesitamos eliminar todas las tablas que hacen referencia a la tabla remota. Entonces todo puede ir a lo largo de la cadena: es posible que deba eliminar las tablas de este complemento que hacen referencia a las tablas eliminadas.
Por lo tanto, será mucho más rápido eliminar todas las tablas con el prefijo AO_6B9F04 del archivo de respaldo mediante programación.
Escribamos un complemento que eliminará las tablas del archivo de copia de seguridad con el prefijo dado. El complemento consistirá en trabajo web, que recibirá el nombre del archivo de respaldo (el archivo de respaldo debe estar en JIRA_HOME / import) y el prefijo.
El código fuente del complemento se puede tomar
aquí .
Crea un complemento
Abra la terminal y ejecute el siguiente comando:
atlas-create-jira-plugin
Debe responder las preguntas de esta manera:
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
Editando POM.XML
El archivo pom.xml debería verse así:
bitbucket.org/alex1mmm/clean-backup/src/master/pom.xmlCreamos WEBWORK, SECCIÓN WEB y ARTÍCULO WEB
Abra la terminal y ejecute:
atlas-create-jira-plugin-module
Debe responder las preguntas de esta manera:
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
Edición de WEBWORK y SUCCESS.VM
Cambie nuestro success.vm para que nuestro trabajo web pueda tomar dos parámetros: nombre de copia de seguridad y prefijo:
clean-backup / src / main / resources / templates / cleanbackup / cleanbackup / success.vm .
Usaremos SAX para trabajar con archivos xml, por lo que escribiremos un filtro para eliminar tablas:
clean-backup / src / main / java / ru / matveev / alexey / plugins / jira / cleanbackup / jira / webwork / TableFilter.java .
Ahora realice cambios en el trabajo web.
clean-backup / src / main / java / ru / matveev / alexey / plugins / jira / cleanbackup / jira / webwork / CleanBackup.javaCrea y ejecuta nuestro complemento
Vamos a la carpeta del complemento y ejecutamos:
atlas-run
Después de que Jira haya comenzado, coloque nuestro archivo de respaldo en JIRA_HOME / import y vaya a la siguiente dirección en el navegador:
localhost : 2990 / jira / secure / CleanBackup.jspa
Ingrese el nombre de la copia de seguridad, el prefijo y haga clic en el botón Limpiar:

Las tablas con el prefijo que ingresamos se eliminarán de la copia de seguridad y luego podrá restaurar Jira.