Como se livrar de erros com tabelas do Active Object ao restaurar o Jira do backup



Neste artigo, falaremos sobre como se livrar de erros nas tabelas do Active Objects ao restaurar o Jira de um backup e escrever um plug-in para remover tabelas desnecessárias do Active Objects de um arquivo de backup.

O que são tabelas de objetos ativos?


O banco de dados Jira contém dois tipos de tabelas: tabelas do sistema, como jiraissue, cwd_user, changegroup e tabelas adicionadas pelos plug-ins instalados no Jira. Essas tabelas são tabelas de objetos ativos. Eles podem ser facilmente distinguidos das tabelas do sistema pelo prefixo AO_XXXXXX.
AO significa Objetos Ativos e XXXXXX é o código de hash que Jira gera para cada plug-in. O hashcode é necessário para poder criar tabelas com o mesmo nome em plugins diferentes. Como após adicionar o prefixo AO_XXXXXX a tabelas com o mesmo nome, os nomes das tabelas começam a diferir e, portanto, podem ser criados no banco de dados.

Objetos ativos é uma camada ORM nos produtos Atlassian. Leia mais sobre isso aqui .

No Jira, você pode ver informações sobre todas as tabelas criadas por cada plug-in, se for em Gear -> System -> Plugin Data Storage. Por exemplo, na minha instância do Jira, as informações do plugin são assim:



A captura de tela mostra que o plugin do Atlassian Notifications criou três tabelas com o código hash 21F425

Erros AO


Agora vamos ver como esses erros são exibidos em tempo real. Aqui está um exemplo de um erro "campo não suportado encontrado: binário":



Corrigimos o erro "campo não suportado encontrado: binário"


Vamos tentar corrigir esse erro. Para fazer isso, descompacte o arquivo de backup. Dentro, veremos dois arquivos: entity.xml e activeobjects.xml.

O arquivo entity.xml contém dados da tabela do sistema. O arquivo activeobjects.xml contém dados da tabela Objetos Ativos. Nós apenas precisamos do arquivo activeobjects.xml.

Abra o arquivo activeobjects.xml e procure a palavra "binário" no arquivo. No meu caso, foram encontradas 10 correspondências. Essas correspondências são assim:

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

Exclua todas as linhas <binary xsi: nil = "true" /> no arquivo activeobjects.xml e tente restaurar o Jira novamente.

Desta vez, o erro "campo não suportado encontrado: binário" foi corrigido, mas vemos um novo erro:



Vamos ver o conteúdo do arquivo 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 

Se você procurar informações sobre esse erro na Internet, encontraremos exatamente esse KB .

Neste KB, propõe-se alterar a dimensão do campo nº 10 para -1. Vamos tentar.

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

Alterar:

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

em

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

e tente restaurar o Jira do nosso backup.

No log, vemos novamente os mesmos erros. KB não ajudou.

plugin desconhecido


Vamos ler cuidadosamente o erro novamente. Veremos que os dados do plug-in UKNOWN PLUGIN não podem ser importados. Por que de um plugin desconhecido (UKNOWN PLUIGN)?
Se você observar a captura de tela abaixo, poderá ver que alguns Objetos Ativos não têm os nomes dos plugins aos quais se relacionam:



Você pode ver que o plug-in está no retângulo vermelho, mas o plug-in não está no retângulo azul. Isso pode acontecer se instalarmos o plug-in, desinstalá-lo e reiniciar o Jira excluindo a pasta .osgi_plugins. Este tipo de reinicialização do Jira é recomendado se houver algum problema com os plug-ins.

Nossa tabela AIO_USER não possui um nome de plug-in, portanto, podemos excluir a tabela.
Vamos encontrar a definição desta tabela no arquivo activeobjects.xml, excluir a definição encontrada e tentar restaurar o Jira a partir do backup.

Veremos outro erro:

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

O problema é que excluímos a definição da tabela, mas não excluímos os dados desta tabela. Vamos encontrar os dados nesta tabela no arquivo activeobjects.xml e excluí-los.

Os dados na tabela começam com esta tag:

 <data tableName="AO_6B9F04_AIO_USER"> 

E termine com esta tag:

 </data> 

Vamos excluir essas tags e tudo o que há entre essas tags e tentar novamente restaurar o Jira a partir do backup.

Iremos receber outro erro:

 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. 

Isso significa que ainda existem tabelas no plug-in que fazem referência a essa tabela, portanto, ainda precisamos excluir todas as tabelas que fazem referência à tabela remota. Então, tudo pode ir ao longo da cadeia: talvez você precise excluir as tabelas deste plugin que se referem às tabelas excluídas.

Portanto, será muito mais rápido excluir todas as tabelas com o prefixo AO_6B9F04 do arquivo de backup programaticamente.

Vamos escrever um plug-in que exclua as tabelas do arquivo de backup pelo prefixo fornecido. O plugin consistirá em trabalho na web, que receberá o nome do arquivo de backup (o arquivo de backup deve estar em JIRA_HOME / import) e o prefixo.

O código fonte do plug-in pode ser obtido aqui .

Crie um plugin


Abra o terminal e execute o seguinte comando:

 atlas-create-jira-plugin 

Você precisa responder a perguntas como esta:

 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


O arquivo pom.xml deve ficar assim:
bitbucket.org/alex1mmm/clean-backup/src/master/pom.xml

Criamos WEBWORK, WEB SECTION e WEB ITEM


Abra o terminal e execute:

 atlas-create-jira-plugin-module 

Você precisa responder a perguntas como esta:

 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 

Editando WEBWORK e SUCCESS.VM


Altere nosso success.vm para que nosso trabalho na Web possa assumir dois parâmetros: nome e prefixo do backup:

clean-backup / src / main / recursos / modelos / cleanbackup / cleanbackup / success.vm .

Usaremos o SAX para trabalhar com arquivos xml; portanto, escreveremos um filtro para excluir tabelas:

O backup limpo / src / principal / java / ru / matveev / alexey / plugins / jira / cleanbackup / jira / webwork / TableFilter.java .
Agora faça alterações no trabalho na web.

O backup limpo / src / principal / java / ru / matveev / alexey / plugins / jira / cleanbackup / jira / webwork / CleanBackup.java

Crie e execute nosso plugin


Vamos para a pasta do plugin e executamos:

 atlas-run 

Após o início do Jira, coloque nosso arquivo de backup em JIRA_HOME / import e vá para o seguinte endereço no navegador:

localhost : 2990 / jira / secure / CleanBackup.jspa

Digite o nome do backup, prefixo e clique no botão Limpar:



As tabelas com o prefixo que inserimos serão excluídas do backup e, depois disso, você poderá restaurar o Jira.

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


All Articles